diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 5bd0bb14..00000000 --- a/.eslintrc +++ /dev/null @@ -1,24 +0,0 @@ -{ - "root": true, - "env": { - "node": true - }, - "extends": [ - "plugin:vue/essential", - "plugin:vue/recommended", - "@vue/prettier", - "plugin:vuetify/base" - ], - "parserOptions": { - "parser": "@babel/eslint-parser", - "requireConfigFile": false - }, - "rules": { - "eqeqeq": "warn", - "vue/eqeqeq": "warn", - "no-shadow": "warn", - "no-var": "warn", - "prefer-const": "warn", - "no-console": "warn" - } -} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..e91fdf72 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,24 @@ +module.exports = { + root: true, + env: { + node: true, + }, + extends: [ + "plugin:vue/vue3-essential", + "eslint:recommended", + "@vue/typescript/recommended", + "plugin:prettier/recommended", + ], + parser: "vue-eslint-parser", + parserOptions: { + ecmaVersion: "latest", + }, + rules: { + eqeqeq: "warn", + "vue/eqeqeq": "warn", + "no-shadow": "warn", + "no-var": "warn", + "prefer-const": "warn", + "no-console": "warn", + }, +}; diff --git a/.gitignore b/.gitignore index 0f91ec5f..96ea146e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,7 +22,9 @@ pnpm-debug.log* *.njsproj *.sln *.sw? -package-lock.json #Electron-builder output -/dist_electron \ No newline at end of file +/dist_electron +/doc/docs/.vuepress/.cache/ +/doc/docs/.vuepress/.temp/ +/doc/docs/.vuepress/dist/ \ No newline at end of file diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index e9558405..00000000 --- a/babel.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - presets: [ - '@vue/cli-plugin-babel/preset' - ] -} diff --git a/doc/.github/workflows/deploy-docs.yml b/doc/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..cb217ba8 --- /dev/null +++ b/doc/.github/workflows/deploy-docs.yml @@ -0,0 +1,47 @@ + +name: Deploy Docs + +on: + push: + branches: + # make sure this is the branch you are using + - main + +permissions: + contents: write + +jobs: + deploy-gh-pages: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + # if your docs needs submodules, uncomment the following line + # submodules: true + + + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + cache: npm + + - name: Install Deps + run: npm ci + + - name: Build Docs + env: + NODE_OPTIONS: --max_old_space_size=8192 + run: |- + npm run docs:build + > docs/.vuepress/dist/.nojekyll + + - name: Deploy Docs + uses: JamesIves/github-pages-deploy-action@v4 + with: + # This is the branch where the docs are deployed to + branch: gh-pages + folder: docs/.vuepress/dist diff --git a/doc/docs/.vuepress/config.js b/doc/docs/.vuepress/config.js new file mode 100644 index 00000000..a4f54732 --- /dev/null +++ b/doc/docs/.vuepress/config.js @@ -0,0 +1,20 @@ +import { defaultTheme } from '@vuepress/theme-default' +import { defineUserConfig } from 'vuepress/cli' +import { viteBundler } from '@vuepress/bundler-vite' + +export default defineUserConfig({ + lang: 'en-US', + + title: 'Ares', + description: 'A Research Exploration System', + + theme: defaultTheme({ + logo: '../icon.png', + + navbar: ['/', '/ares-docs'], + colorMode: 'dark', + colorModeSwitch: false, + + }), + bundler: viteBundler(), +}) diff --git a/doc/docs/README.md b/doc/docs/README.md new file mode 100644 index 00000000..437e904d --- /dev/null +++ b/doc/docs/README.md @@ -0,0 +1,15 @@ +--- +home: true +title: Home +heroImage: /icon.png +actions: + - text: Get Started + link: /ares-docs.html#installation + type: primary + + - text: Visualizations + link: /ares-docs.html#visualizations + type: secondary + +footer: Apache 2.0 Licensed | Copyright © 2024 OHDSI +--- \ No newline at end of file diff --git a/doc/docs/ares-docs.md b/doc/docs/ares-docs.md new file mode 100644 index 00000000..17988b38 --- /dev/null +++ b/doc/docs/ares-docs.md @@ -0,0 +1,288 @@ +# ARES Documentation + +## Background + +ARES is A Research Exploration System designed for use in the study of patient level observational data that has been +converted into the Observational Medical Outcomes Partnership (OMOP) Common Data Model (CDM). ARES was developed by +Frank DeFalco, a member of the Observational Health Data Sciences & Informatics (OHDSI) community. + +### OHDSI + +The Observational Health Data Sciences and Informatics (or OHDSI, pronounced "Odyssey") program is a multi-stakeholder, +interdisciplinary collaborative to bring out the value of health data through large-scale analytics. All our solutions +are open-source. [Learn more about OHDSI](https://www.ohdsi.org). + +## Installation + +### Requirements + +- git client ([GitHub Desktop](https://desktop.github.com/) recommended). On macOS git comes preinstalled and can be + accessed via the Terminal app. On linux systems might require installation using the appropriate package manager. +- Node.js v18 or higher is required. [Download link](https://nodejs.org/en/download/package-manager) +- NPM (node package manager) - installed by default with Node.js + +### Installation Steps + +#### Using pre-built files + +Open the [Ares releases](https://github.com/OHDSI/Ares/releases) page and download the latest available release +(Ares.x.x-beta.zip), unpack the zip archive and serve using your favourite web server. + +Here's an example running Ares using the "http-server" web server: + +```bash + npm install -g http-server #download and install the http-server web server + + http-server aresFolder #replace with the name of the folder containing Ares files +``` + +The link to the app will be available within the terminal once the http-server is launched. + +#### Building manually + +Begin by downloading the source code for the ARES web application, which can be obtained by cloning the repository found +on [Github](https://github.com/ohdsi/ares). + +```bash + git clone https://github.com/ohdsi/ares +``` + +Once the repository is cloned locally the application can be built by using +npm. These steps should be run from a bash shell or command prompt and are as follows: + +```bash + cd aresDirectory #navigate to the directory Ares was cloned into + npm install #install Ares dependencies + npm run build -- --base=/ # Build the app. Replace "/" if you wish to run Ares within a subdirectory +``` + +The "--base" +option is used to specify the base public path of the app. The default value is " +/ares/" in case this option is not indicated. + +The npm build process will create an output directory named "/dist" which will +contain all files required for the ARES web +application. These files should be placed in a directory that is served by any web server (like http-server), typically deployed in an +"/ares" subdirectory (you can override that with the " +--base" option as shown above. + +#### Running in dev mode + +The app could also be launched in dev mode and served by the built-in web server instantly. Run the following after +cloning the repo and running "npm install" + +```bash + npm run serve +``` + +Once the server is running, the app will be available at http://localhost:8080/ares (port 8080 is the default value and +might be different if it's already being used by another app). + +After completing the deployment of the web application the data files for ARES must be placed in +the "/data" subfolder +within the "/yourAresDirectory/public/" directory. The ARES data files are generated +from your +existing OMOP CDM database and require +both [Achilles](https://github.com/ohdsi/achilles) +and [DataQualityDashboard](https://github.com/ohdsi/dataqualitydashboard). + +Here's an example script to generate Ares files based on a sample dataset (replace connectionDetails to generate results +for your database). + +```r +# DatabaseConnector::downloadJdbcDrivers("postgresql","D:/OHDSI/Drivers") - use it to download the JDBC driver +options(connectionObserver = NULL) + +cdmDatabaseSchema = "main" #indicate the name of the cdm schema you created +resultsDatabaseSchema = "main" #indicate the name of the results schema you created +vocabDatabaseSchema = "main" #vocab should be located in the cdm schema +numThreads = 1 #i only managed to get till the end in single-threaded mode, had problems utilizing 2 or more +cdmSourceName = 'synthea' +cdmVersion = "5.4" #do not change + +aresDataDirectory = "./data" #output directory +sourceReleaseKey = AresIndexer::getSourceReleaseKey(connectionDetails, cdmDatabaseSchema) +sourceFolders = "./data" #source files folder for indexers. + +connectionDetails <- Eunomia::getEunomiaConnectionDetails() #Provides a sample dataset + +# Example connection details +#connectionDetails <- DatabaseConnector::createConnectionDetails( +# dbms = dbms, #your database management system +# server = server, #server address +# user = user, +# password = password, +# pathToDriver = pathToDriver #location of the JDBC driver +#) + + +# Run Achilles +Achilles::achilles( + connectionDetails, + cdmDatabaseSchema = cdmDatabaseSchema , + resultsDatabaseSchema= resultsDatabaseSchema, + vocabDatabaseSchema = vocabDatabaseSchema, + numThreads = 1, + cdmVersion = "5.4.0", + createIndices = F, + createTable = T, + smallCellCount = 0, +) +# Export statistics generated by Achilles +Achilles::exportToAres( + connectionDetails = connectionDetails, + cdmDatabaseSchema = cdmDatabaseSchema, + resultsDatabaseSchema = resultsDatabaseSchema, + vocabDatabaseSchema = vocabDatabaseSchema, + outputPath = sourceFolders, +) + +datasourceReleaseOutputFolder <- file.path(aresDataDirectory, releaseKey) + +# Run Data Quality Dashboard +DataQualityDashboard::executeDqChecks( + connectionDetails = connectionDetails, + cdmDatabaseSchema = cdmDatabaseSchema, + resultsDatabaseSchema = resultsDatabaseSchema, + vocabDatabaseSchema = vocabDatabaseSchema, + cdmSourceName = cdmSourceName, + numThreads = numThreads, + outputFolder = datasourceReleaseOutputFolder, + outputFile = "dq-result.json", + verboseMode = T, + writeToTable = F +) + + +list <- list.dirs(sourceFolders, recursive = FALSE) +AresIndexer::augmentConceptFiles(sourceFolders = list) +AresIndexer::buildExportQueryIndex(aresDataDirectory) +AresIndexer::buildNetworkIndex(list, outputFolder = aresDataDirectory) +AresIndexer::buildDataQualityIndex(list, outputFolder = aresDataDirectory) +AresIndexer::buildNetworkUnmappedSourceCodeIndex(list, outputFolder = aresDataDirectory) +``` + +Visiting the ARES website will now show the data results for your current network. Each individual CDM needs to be +processed in order for it to be available in ARES. CDM data sources with the same source name will be versioned using +the release key allowing analysis across multiple versions of the same data source. An example of generating a complete +network of different data sources and loading them into ARES can be +found [here](https://gist.github.com/fdefalco/35b7844626a9d8808d99bf5990e46ed2). + +## Visualizations + +Visualizations are used throughout ARES to assist in the interpretation of information. In this section sample +visualizations are presented with descriptions to ensure they are well understood. + +### Preattentive Processing + +[Visualization Techniques Cheat Sheet](https://policyviz.com/2018/08/07/dataviz-cheatsheet/) + +### Interpreting Box-Whisker Diagrams and Inter-Quartile Range (IQR) + +![IQR](sample-iqr.png) + +Box-whisker diagrams present a simple picture representing the distribution of a set of data which include the values +for the minimum, maximum, and quartiles of the distribution. They are also known as boxplots. + +- A - Lowest value +- B - Lower Quartile (25%) +- C - Median (50%) +- D - Upper Quartile (75%) +- E - Highest Value + +## Data Network reports + +### Overview + +### Quality Assessment + +### Population Overview + +### Data Strand Report + +## Data Source reports + +### Data Quality History + +### Domain Continuity + +## Data Source Release reports + +### Data Quality + +### Person + +### Data Density + +### Observation Period + +### Conditions + +### Condition Eras + +### Drugs + +### Drug Eras + +### Visit Occurrence + +### Visit Detail + +### Measurements + +### Observations + +### Procedures + +### Device Exposures + +### Death + +### Unmapped Source Codes + +### Performance + +### Metadata + +### Visit Detail + +## Roadmap + +The roadmap for ARES is maintained on the GitHub repository. + +## OHDSI Libraries + +ARES presents research generated through the suite of OHDSI related packages. + +- Achilles +- Data Quality Dashboard +- Database Connector +- Sql Render +- Castor + +## Open Source Ecosystem + +ARES leverages many open source libraries and tools to achieve its goals without which the task would be entirely +insurmountable. + +- Vue +- PrimeVue +- axios +- Vega +- Vega-lite +- vega-embed +- codemirror +- d3 +- markdown-it +- markdown-it-vue +- npm +- lodash +- Material Design + +## Acknowledgements + +Many people have provided valuable feedback in the development of ARES. + +- Clair Blacketer +- Alan Andryc +- Patrick Ryan diff --git a/doc/docs/ares_logo.svg b/doc/docs/ares_logo.svg new file mode 100644 index 00000000..258e032a --- /dev/null +++ b/doc/docs/ares_logo.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + diff --git a/doc/docs/icon.png b/doc/docs/icon.png new file mode 100644 index 00000000..46cc23dc Binary files /dev/null and b/doc/docs/icon.png differ diff --git a/doc/docs/sample-iqr.png b/doc/docs/sample-iqr.png new file mode 100644 index 00000000..2f9ce9d9 Binary files /dev/null and b/doc/docs/sample-iqr.png differ diff --git a/doc/package-lock.json b/doc/package-lock.json new file mode 100644 index 00000000..10a6e782 --- /dev/null +++ b/doc/package-lock.json @@ -0,0 +1,4580 @@ +{ + "name": "ares-docs", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ares-docs", + "version": "0.0.1", + "license": "Apache-2.0", + "devDependencies": { + "@vuepress/bundler-vite": "^2.0.0-rc.7", + "@vuepress/theme-default": "^2.0.0-rc.11", + "vue": "^3.4.0", + "vuepress": "^2.0.0-rc.7" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mdit-vue/plugin-component": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-2.1.3.tgz", + "integrity": "sha512-9AG17beCgpEw/4ldo/M6Y/1Rh4E1bqMmr/rCkWKmCAxy9tJz3lzY7HQJanyHMJufwsb3WL5Lp7Om/aPcQTZ9SA==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-frontmatter": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-2.1.3.tgz", + "integrity": "sha512-KxsSCUVBEmn6sJcchSTiI5v9bWaoRxe68RBYRDGcSEY1GTnfQ5gQPMIsM48P4q1luLEIWurVGGrRu7u93//LDQ==", + "dev": true, + "dependencies": { + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "gray-matter": "^4.0.3", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-headers": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-2.1.3.tgz", + "integrity": "sha512-AcL7a7LHQR3ISINhfjGJNE/bHyM0dcl6MYm1Sr//zF7ZgokPGwD/HhD7TzwmrKA9YNYCcO9P3QmF/RN9XyA6CA==", + "dev": true, + "dependencies": { + "@mdit-vue/shared": "2.1.3", + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-sfc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-2.1.3.tgz", + "integrity": "sha512-Ezl0dNvQNS639Yl4siXm+cnWtQvlqHrg+u+lnau/OHpj9Xh3LVap/BSQVugKIV37eR13jXXYf3VaAOP1fXPN+w==", + "dev": true, + "dependencies": { + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-title": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-2.1.3.tgz", + "integrity": "sha512-XWVOQoZqczoN97xCDrnQicmXKoqwOjIymIm9HQnRXhHnYKOgJPW1CxSGhkcOGzvDU1v0mD/adojVyyj/s6ggWw==", + "dev": true, + "dependencies": { + "@mdit-vue/shared": "2.1.3", + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-toc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-2.1.3.tgz", + "integrity": "sha512-41Q+iXpLHZt0zJdApVwoVt7WF6za/xUjtjEPf90Z3KLzQO01TXsv48Xp9BsrFHPcPcm8tiZ0+O1/ICJO80V/MQ==", + "dev": true, + "dependencies": { + "@mdit-vue/shared": "2.1.3", + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/shared": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-2.1.3.tgz", + "integrity": "sha512-27YI8b0VVZsAlNwaWoaOCWbr4eL8B04HxiYk/y2ktblO/nMcOEOLt4p0RjuobvdyUyjHvGOS09RKhq7qHm1CHQ==", + "dev": true, + "dependencies": { + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-2.1.0.tgz", + "integrity": "sha512-TMBB/BQWVvwtpBdWD75rkZx4ZphQ6MN0O4QB2Bc0oI5PC2uE57QerhNxdRZ7cvBHE2iY2C+BUNUziCfJbjIRRA==", + "dev": true + }, + "node_modules/@mdit/plugin-alert": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-alert/-/plugin-alert-0.13.1.tgz", + "integrity": "sha512-3LMYQQ3QP6TUx6zmtmuoHJScST5SVoPZlNuuF4S6PUZvJIwtlITF+eFNjDrA7UQx0PUdCgVHmwu5kYliq+BNtg==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@mdit/plugin-container": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-container/-/plugin-container-0.13.1.tgz", + "integrity": "sha512-mFfm7YViyLHo8uORVa9oLi9+acZZoSVdPf3WPqzC/yLZAJbF27rfJgWZ9Kylt+tyaAYng8L4DiSeVcSNUIHF1A==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@mdit/plugin-tab": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tab/-/plugin-tab-0.13.2.tgz", + "integrity": "sha512-evpIXvo6vXRWhgNE6vu4ok1I2dVOzrBYmBUGc1gW8nT9MvkW9litu7RbJ6CafscqaiiYRIM5Oib1ahS0lwte6g==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==", + "dev": true + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/markdown-it-emoji": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it-emoji/-/markdown-it-emoji-3.0.1.tgz", + "integrity": "sha512-cz1j8R35XivBqq9mwnsrP2fsz2yicLhB8+PDtuVkKOExwEdsVBNI+ROL3sbhtR5occRZ66vT0QnwFZCqdjf3pA==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", + "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", + "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.12", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", + "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.5.12", + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz", + "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.12", + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.47", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz", + "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.5.12", + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "dev": true + }, + "node_modules/@vue/devtools-kit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.5.1.tgz", + "integrity": "sha512-fymYH06x3pMACa9KZ+o3WFDeFrWmacoQQdjtzHRiHekSFm0FgspAspP5qRUX/ItrIs5Cy+dApXpCiGJmw+rIyQ==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.5.1", + "birpc": "^0.2.19", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.5.1.tgz", + "integrity": "sha512-nlJSpDLwQEYhSw/OXu6H7Jk9ToYOLA2ExX1VlZsgnKI7wByUbVc8uOlqLzhfBQaPAlw549+8GCBH1ER2VeK9PQ==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz", + "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", + "dev": true, + "dependencies": { + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz", + "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.12", + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz", + "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.12", + "@vue/runtime-core": "3.5.12", + "@vue/shared": "3.5.12", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz", + "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12" + }, + "peerDependencies": { + "vue": "3.5.12" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", + "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", + "dev": true + }, + "node_modules/@vuepress/bundler-vite": { + "version": "2.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-rc.18.tgz", + "integrity": "sha512-Q+OUul4OLIS4OLuKqIlmJKHhW5Edt5i6fVY6infgGhb4tUQt3z37DjCUtvbMikb05Va9YqtTAGt2eCWOk7eGPw==", + "dev": true, + "dependencies": { + "@vitejs/plugin-vue": "^5.1.4", + "@vuepress/bundlerutils": "2.0.0-rc.18", + "@vuepress/client": "2.0.0-rc.18", + "@vuepress/core": "2.0.0-rc.18", + "@vuepress/shared": "2.0.0-rc.18", + "@vuepress/utils": "2.0.0-rc.18", + "autoprefixer": "^10.4.20", + "connect-history-api-fallback": "^2.0.0", + "postcss": "^8.4.47", + "postcss-load-config": "^6.0.1", + "rollup": "^4.24.0", + "vite": "~5.4.8", + "vue": "^3.5.11", + "vue-router": "^4.4.5" + } + }, + "node_modules/@vuepress/bundlerutils": { + "version": "2.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@vuepress/bundlerutils/-/bundlerutils-2.0.0-rc.18.tgz", + "integrity": "sha512-GTcdc78cfcKqn/D3xPrxGFeR+WPV2zJE82jpKAnIa4I30aScq/95pYF1FofP0Gdc+0/XQCxFQ8xiT8iYcoQPSw==", + "dev": true, + "dependencies": { + "@vuepress/client": "2.0.0-rc.18", + "@vuepress/core": "2.0.0-rc.18", + "@vuepress/shared": "2.0.0-rc.18", + "@vuepress/utils": "2.0.0-rc.18", + "vue": "^3.5.11", + "vue-router": "^4.4.5" + } + }, + "node_modules/@vuepress/cli": { + "version": "2.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-rc.18.tgz", + "integrity": "sha512-9Oxyb22klpBNzia+2D4NRGv+Jk0+TwHX8Pn25cy9TlyxMeh9+jFioXT0Jc3c9/vOesBaCI6JxSxwPqtgRFr1rQ==", + "dev": true, + "dependencies": { + "@vuepress/core": "2.0.0-rc.18", + "@vuepress/shared": "2.0.0-rc.18", + "@vuepress/utils": "2.0.0-rc.18", + "cac": "^6.7.14", + "chokidar": "^3.6.0", + "envinfo": "^7.14.0", + "esbuild": "~0.21.5" + }, + "bin": { + "vuepress-cli": "bin/vuepress.js" + } + }, + "node_modules/@vuepress/client": { + "version": "2.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-rc.18.tgz", + "integrity": "sha512-ImeF10uwZvQt3KyYN+fdyPRCZmzEJ2r4sTxC/39ieVA4BzPpTzrJwBNT3KONYkckaoXnBXIoI8d+DWFfq9B9NQ==", + "dev": true, + "dependencies": { + "@vue/devtools-api": "^7.4.6", + "@vuepress/shared": "2.0.0-rc.18", + "vue": "^3.5.11", + "vue-router": "^4.4.5" + } + }, + "node_modules/@vuepress/client/node_modules/@vue/devtools-api": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.5.1.tgz", + "integrity": "sha512-2UqRIfUE6/GuBSUpud7r1yFtXOTz6Qn+3dBOL1JG4BdwGjC9gQlV/Nl1+BTLFlYlKnDA7EppPFNvRnWeCtBrqQ==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.5.1" + } + }, + "node_modules/@vuepress/core": { + "version": "2.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-rc.18.tgz", + "integrity": "sha512-ikQ5EyA1jZynk1amsihG0cX6kWTgCIsbGCBgPWDVfkSPCrYCxxaIfzvKgyGBiNBFZ7kqoxuMnEn8EaY/fhSL0A==", + "dev": true, + "dependencies": { + "@vuepress/client": "2.0.0-rc.18", + "@vuepress/markdown": "2.0.0-rc.18", + "@vuepress/shared": "2.0.0-rc.18", + "@vuepress/utils": "2.0.0-rc.18", + "vue": "^3.5.11" + } + }, + "node_modules/@vuepress/helper": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/helper/-/helper-2.0.0-rc.55.tgz", + "integrity": "sha512-fi9dsnKMWsuB/8sDtLlG1ge+x0PvaQLBftc8IJuBzCieJYtlGKQ59xyR195XxObMlTojjaoaUY6So2A+L1AwZQ==", + "dev": true, + "dependencies": { + "@vue/shared": "^3.5.12", + "@vueuse/core": "^11.1.0", + "cheerio": "1.0.0", + "fflate": "^0.8.2", + "gray-matter": "^4.0.3", + "vue": "^3.5.12" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/highlighter-helper": { + "version": "2.0.0-rc.54", + "resolved": "https://registry.npmjs.org/@vuepress/highlighter-helper/-/highlighter-helper-2.0.0-rc.54.tgz", + "integrity": "sha512-+yLRB5CbhRddALmbCtWyD7AsS34aFTFNx6DkIg8F3WtYUyhUGWZi+TJ6/kMuPmcxitUgfBtWbGOV/0oyXyUZVg==", + "dev": true, + "peerDependencies": { + "@vueuse/core": "^11.1.0", + "vuepress": "2.0.0-rc.18" + }, + "peerDependenciesMeta": { + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/@vuepress/markdown": { + "version": "2.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-rc.18.tgz", + "integrity": "sha512-RUX7rgjONBwOepWXqB4SzI2Tbm6zEYK2YTHwjexzAIBr+nxgB+B8nizdr+VvuVk7Ehn/CtcyXhBdf1NZh9UgUQ==", + "dev": true, + "dependencies": { + "@mdit-vue/plugin-component": "^2.1.3", + "@mdit-vue/plugin-frontmatter": "^2.1.3", + "@mdit-vue/plugin-headers": "^2.1.3", + "@mdit-vue/plugin-sfc": "^2.1.3", + "@mdit-vue/plugin-title": "^2.1.3", + "@mdit-vue/plugin-toc": "^2.1.3", + "@mdit-vue/shared": "^2.1.3", + "@mdit-vue/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@types/markdown-it-emoji": "^3.0.1", + "@vuepress/shared": "2.0.0-rc.18", + "@vuepress/utils": "2.0.0-rc.18", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^9.2.0", + "markdown-it-emoji": "^3.0.0", + "mdurl": "^2.0.0" + } + }, + "node_modules/@vuepress/plugin-active-header-links": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-rc.55.tgz", + "integrity": "sha512-HwcvQpFhoyxURxalOO72L6cUM5yMcqKS/QFpaZvaob8pQBgZfJTH+77dfKEmz4rbf+WBMHrUEMfTICeJvu0Frw==", + "dev": true, + "dependencies": { + "@vueuse/core": "^11.1.0", + "vue": "^3.5.12" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-back-to-top": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-rc.55.tgz", + "integrity": "sha512-1kHvlbrpqT6m3No4URMU+vSmlymKOrOs3WVxKeAjyc7pNppni2a1LKOj37FWAQas4GAitAF07YBekva9/ZJotQ==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55", + "@vueuse/core": "^11.1.0", + "vue": "^3.5.12" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-copy-code": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-copy-code/-/plugin-copy-code-2.0.0-rc.55.tgz", + "integrity": "sha512-EFHjYDBR3G021lq5FqZWHo7Lr3uw6THC8ysC4Bpp78069w6o3wJWNJNC8pTyYm+Xlx6ritu2ENmMuGzXCn5EZg==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55", + "@vueuse/core": "^11.1.0", + "vue": "^3.5.12" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-git": { + "version": "2.0.0-rc.54", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-rc.54.tgz", + "integrity": "sha512-Yy0elQlKt+2GbeUI+mZMGdbkvCsPXep+lBLaXYQqiIcHC4tXAwj+1FwB18LTICiv3oQDHUtx7ZZwTnYejXJ7sg==", + "dev": true, + "dependencies": { + "execa": "^9.4.0" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/execa": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.4.0.tgz", + "integrity": "sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vuepress/plugin-git/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@vuepress/plugin-links-check": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-links-check/-/plugin-links-check-2.0.0-rc.55.tgz", + "integrity": "sha512-OJzxBMo3auYmEBoix9c8O41AtePEJgZ8QlWTOcvtlQ7Ls9KLr0Xbh4Ki4lTimHxEw256hwwnRFzWCpRZs6dgcw==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-markdown-hint": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-hint/-/plugin-markdown-hint-2.0.0-rc.55.tgz", + "integrity": "sha512-XF3Dob00ydifJmxowsRvM7krx4di2PrFBRkaOgLh9ktav6kF3q5/S8rHpAB2f6EBeHw3ZdCu6M8OY1nGbviYgw==", + "dev": true, + "dependencies": { + "@mdit/plugin-alert": "^0.13.1", + "@mdit/plugin-container": "^0.13.1", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.55", + "@vueuse/core": "^11.1.0" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-markdown-tab": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-tab/-/plugin-markdown-tab-2.0.0-rc.55.tgz", + "integrity": "sha512-s9zQfqjQiBD9vJoE/NC/5DBF1WyF0eWnWht6AMZVU457Om0NuR28Ybc6HYTF5Q1zUkPmV8tn8VvQPFFjVZaPdQ==", + "dev": true, + "dependencies": { + "@mdit/plugin-tab": "^0.13.2", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.55", + "@vueuse/core": "^11.1.0", + "vue": "^3.5.12" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-nprogress": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-rc.55.tgz", + "integrity": "sha512-nbKeChrO/i6xjwAtdBINukK3dZEvDNB2qnSbOO/qLXajnhE8pkFTrqqFqG8PaB8u1mx2umPwssYrji6az8iK0Q==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55", + "vue": "^3.5.12" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-palette": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-palette/-/plugin-palette-2.0.0-rc.55.tgz", + "integrity": "sha512-3azLMfcgky38qMhFFhtakG69YMnhLJD319Oae6kOX7IIny/Uat+oKiO0/npHDoLTPPMOrDfphW6fsozXZ8LKxg==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55", + "chokidar": "^4.0.1" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-palette/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@vuepress/plugin-palette/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@vuepress/plugin-prismjs": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-rc.55.tgz", + "integrity": "sha512-d34Kc0URLM2Tglu3i21Ysw3+H0Pqws41StKvG3FjaxnHO5DvGNfLwdfgV0cyURjhycpiii+rePOYKrCGq7L+gw==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55", + "@vuepress/highlighter-helper": "2.0.0-rc.54", + "prismjs": "^1.29.0" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-seo": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-seo/-/plugin-seo-2.0.0-rc.55.tgz", + "integrity": "sha512-CQbu8q5NruQLBiCPZFzXGYH5tgAQrXYZ3lXvrA8TyK4aWpIBLlZqQfT475WlLqcvnyX+oXwqLp9B4PJUPJ+pIA==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-sitemap": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.55.tgz", + "integrity": "sha512-P9669s8fIIv089yr5hXfSaJ64He66FGXP0GTVJuCBncJXE5H81UPVCLdXMgHPAJ33LRFk7SD0++KUimwt1kZIg==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55", + "sitemap": "^8.0.0" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "dev": true + }, + "node_modules/@vuepress/plugin-sitemap/node_modules/sitemap": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.0.tgz", + "integrity": "sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==", + "dev": true, + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/@vuepress/plugin-theme-data": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-rc.55.tgz", + "integrity": "sha512-4NMtSFCGCyqkbLc2dayYssxLdVhyC9kakMHW3IZcnYs+Yt5CWDcfqsUcS3195Jc3uxTemTtC+bUBqQXJ1wrHyg==", + "dev": true, + "dependencies": { + "@vue/devtools-api": "^7.4.6", + "vue": "^3.5.12" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/plugin-theme-data/node_modules/@vue/devtools-api": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.5.1.tgz", + "integrity": "sha512-2UqRIfUE6/GuBSUpud7r1yFtXOTz6Qn+3dBOL1JG4BdwGjC9gQlV/Nl1+BTLFlYlKnDA7EppPFNvRnWeCtBrqQ==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.5.1" + } + }, + "node_modules/@vuepress/shared": { + "version": "2.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-rc.18.tgz", + "integrity": "sha512-um5/ZKGOKgaui5Xo1aRSZ3ko7zVq60k1M8j8ajEOu90LUD1e8glTa7Km9OIBgPcN+yx2OrNwuu8ieEupdNAm4w==", + "dev": true, + "dependencies": { + "@mdit-vue/types": "^2.1.0" + } + }, + "node_modules/@vuepress/theme-default": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-2.0.0-rc.55.tgz", + "integrity": "sha512-d9ciKGY3YRkYIyGsGQ6xLfbUyoGhlvLRUS5ceCw6EJqnHz69IhebOYSsNrGZ03US3yDgi0Ljm1v32R9wBozuRA==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55", + "@vuepress/plugin-active-header-links": "2.0.0-rc.55", + "@vuepress/plugin-back-to-top": "2.0.0-rc.55", + "@vuepress/plugin-copy-code": "2.0.0-rc.55", + "@vuepress/plugin-git": "2.0.0-rc.54", + "@vuepress/plugin-links-check": "2.0.0-rc.55", + "@vuepress/plugin-markdown-hint": "2.0.0-rc.55", + "@vuepress/plugin-markdown-tab": "2.0.0-rc.55", + "@vuepress/plugin-medium-zoom": "2.0.0-rc.55", + "@vuepress/plugin-nprogress": "2.0.0-rc.55", + "@vuepress/plugin-palette": "2.0.0-rc.55", + "@vuepress/plugin-prismjs": "2.0.0-rc.55", + "@vuepress/plugin-seo": "2.0.0-rc.55", + "@vuepress/plugin-sitemap": "2.0.0-rc.55", + "@vuepress/plugin-theme-data": "2.0.0-rc.55", + "@vueuse/core": "^11.1.0", + "vue": "^3.5.12" + }, + "peerDependencies": { + "sass": "^1.79.2", + "sass-embedded": "^1.79.2", + "sass-loader": "^16.0.1", + "vuepress": "2.0.0-rc.18" + }, + "peerDependenciesMeta": { + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "sass-loader": { + "optional": true + } + } + }, + "node_modules/@vuepress/theme-default/node_modules/@vuepress/plugin-medium-zoom": { + "version": "2.0.0-rc.55", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-rc.55.tgz", + "integrity": "sha512-x75/9ZYXliI+qXgLCIXVFsrUkOcdg/t/xMO187ZcrZl2lxzpiELHj1AD1EjMVKPbIafdwd3Zjgw9M2VxBUH2cQ==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.55", + "medium-zoom": "^1.1.0", + "vue": "^3.5.12" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + } + }, + "node_modules/@vuepress/utils": { + "version": "2.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-rc.18.tgz", + "integrity": "sha512-0+5vrv3CBycWpAahmutEK2iyuc9oL6JOWMuAdh+cYuuHt1vX+LHfhWGvSep+UT6pOFGOcZfQzXSdlbkv3b4j+Q==", + "dev": true, + "dependencies": { + "@types/debug": "^4.1.12", + "@types/fs-extra": "^11.0.4", + "@types/hash-sum": "^1.0.2", + "@vuepress/shared": "2.0.0-rc.18", + "debug": "^4.3.7", + "fs-extra": "^11.2.0", + "globby": "^14.0.2", + "hash-sum": "^2.0.0", + "ora": "^8.1.0", + "picocolors": "^1.1.0", + "upath": "^2.0.1" + } + }, + "node_modules/@vueuse/core": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.1.0.tgz", + "integrity": "sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "11.1.0", + "@vueuse/shared": "11.1.0", + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.1.0.tgz", + "integrity": "sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.1.0.tgz", + "integrity": "sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.39", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.39.tgz", + "integrity": "sha512-4xkpSR6CjuiaNyvwiWDI85N9AxsvbPawB8xc7yzLPonYTuP19BVgYweKyUMFtHEZgIcHWMt1ks5Cqx2m+6/Grg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.0.tgz", + "integrity": "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==", + "dev": true, + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it-emoji": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", + "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==", + "dev": true + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "node_modules/medium-zoom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz", + "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.0.tgz", + "integrity": "sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/pretty-ms": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz", + "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==", + "dev": true, + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz", + "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/stylus/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/stylus/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/superjson": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/terser": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.35.0.tgz", + "integrity": "sha512-TmYbQnzVfrx3RQsPoItoPplymixIAtp2R2xlpyVBYmFmvI34IzLhCLj8SimRb/kZXlq4t1gA+vbcTqLQ3+5Q5g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "node_modules/undici": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.20.1.tgz", + "integrity": "sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==", + "dev": true, + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/vite": { + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz", + "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-sfc": "3.5.12", + "@vue/runtime-dom": "3.5.12", + "@vue/server-renderer": "3.5.12", + "@vue/shared": "3.5.12" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", + "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==", + "dev": true, + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vuepress": { + "version": "2.0.0-rc.18", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-rc.18.tgz", + "integrity": "sha512-TFpePHTIMiUbiJcHTgD4Wc5eBlsxBnhv36F/eM2vbDoeutcS1dGrNtZoKUxrZDXTeZH+q8vrZ3CiBCsHw3K7eA==", + "dev": true, + "dependencies": { + "@vuepress/cli": "2.0.0-rc.18", + "@vuepress/client": "2.0.0-rc.18", + "@vuepress/core": "2.0.0-rc.18", + "@vuepress/markdown": "2.0.0-rc.18", + "@vuepress/shared": "2.0.0-rc.18", + "@vuepress/utils": "2.0.0-rc.18", + "vue": "^3.5.11" + }, + "bin": { + "vuepress": "bin/vuepress.js", + "vuepress-vite": "bin/vuepress-vite.js", + "vuepress-webpack": "bin/vuepress-webpack.js" + }, + "engines": { + "node": "^18.19.0 || >=20.4.0" + }, + "peerDependencies": { + "@vuepress/bundler-vite": "2.0.0-rc.18", + "@vuepress/bundler-webpack": "2.0.0-rc.18", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "@vuepress/bundler-vite": { + "optional": true + }, + "@vuepress/bundler-webpack": { + "optional": true + } + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/doc/package.json b/doc/package.json new file mode 100644 index 00000000..f0a29ed5 --- /dev/null +++ b/doc/package.json @@ -0,0 +1,19 @@ +{ + "name": "ares-docs", + "version": "0.0.1", + "description": "Provides documentation for Ares", + "license": "Apache-2.0", + "type": "module", + "scripts": { + "docs:build": "vuepress build docs", + "docs:clean-dev": "vuepress dev docs --clean-cache", + "docs:dev": "vuepress dev docs", + "docs:update-package": "npx vp-update" + }, + "devDependencies": { + "@vuepress/bundler-vite": "^2.0.0-rc.7", + "@vuepress/theme-default": "^2.0.0-rc.11", + "vue": "^3.4.0", + "vuepress": "^2.0.0-rc.7" + } +} diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index c7418817..00000000 --- a/docs/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-slate \ No newline at end of file diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index e7b0f190..00000000 --- a/docs/index.md +++ /dev/null @@ -1,230 +0,0 @@ -# ARES Documentation - -

Table of contents

- -[toc] - -## Background - -ARES is A Research Exploration System designed for use in the study of patient level observational data that has been converted into the Observational Medical Outcomes Partnership (OMOP) Common Data Model (CDM). ARES was developed by Frank DeFalco, a member of the Observational Health Data Sciences & Informatics (OHDSI) community. - -### OHDSI - -The Observational Health Data Sciences and Informatics (or OHDSI, pronounced "Odyssey") program is a multi-stakeholder, interdisciplinary collaborative to bring out the value of health data through large-scale analytics. All our solutions are open-source. [Learn more about OHDSI](https://www.ohdsi.org). - -## Installation - -#### Requirements - -- git client ([Github Desktop](https://desktop.github.com/) recommended) -- npm [Installation Instructions](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) - -#### Installation Steps - -Begin by downloading the source code for the ARES web application, which can be obtained by cloning the repository found on [Github](https://github.com/ohdsi/ares). Once the repository is cloned locally the application can be built by using npm. These steps should be run from a bash shell or command prompt and are as follows: - -```bash - git clone https://github.com/ohdsi/ares - cd ares - npm install - npm run build -``` - -The npm build process will create an output directory named /dist which will contain all files required for the ARES web application. These files should be placed in a directory that is served by any web server, typically deployed in an /ares subdirectory. - -After completing the deployment of the web application the data files for ARES must be placed in the /data subfolder within the /ares directory. The ARES data files are generated from your existing OMOP CDM database and require both [Achilles](https://github.com/ohdsi/achilles) and [DataQualityDashboard](https://github.com/ohdsi/dataqualitydashboard). The following steps can be executed in R to generate the necessary ARES data files. - -```R - # configuration - aresDataRoot <- "/webserver_root/ares/data" - cdmVersion <- "5.3" - cdmDatabaseSchema <- "cdm_schema" - resultsDatabaseSchema <- "result_schema" - cdmSourceName <- "source_name" - - # retrieve environment settings - dbms <- Sys.getenv("dbms") - server <- Sys.getenv("server") - user <- Sys.getenv("user") - password <- Sys.getenv("password") - pathToDriver <- Sys.getenv("path_to_driver") - - # configure connection - connectionDetails <- DatabaseConnector::createConnectionDetails( - dbms = dbms, - server = server, - user = user, - password = password, - pathToDriver = pathToDriver - ) - - # run achilles - Achilles::achilles( - cdmVersion = cdmVersion, - connectionDetails = connectionDetails, - cdmDatabaseSchema = cdmDatabaseSchema, - resultsDatabaseSchema = resultsDatabaseSchema - ) - - # obtain the data source release key (naming convention for folder structures) - releaseKey <- AresIndexer::getSourceReleaseKey(connectionDetails, cdmDatabaseSchema) - datasourceReleaseOutputFolder <- file.path(aresDataRoot, releaseKey) - - # run data quality dashboard and output results to data source release folder in ares data folder - dqResults <- DataQualityDashboard::executeDqChecks( - connectionDetails = connectionDetails, - cdmDatabaseSchema = cdmDatabaseSchema, - resultsDatabaseSchema = resultsDatabaseSchema, - vocabDatabaseSchema = cdmDatabaseSchema, - cdmVersion = cdmVersion, - cdmSourceName = cdmSourceName, - outputFile = "dq-result.json", - outputFolder = datasourceReleaseOutputFolder - ) - - # export the achilles results to the ares folder - Achilles::exportAO( - connectionDetails = connectionDetails, - cdmDatabaseSchema = cdmDatabaseSchema, - resultsDatabaseSchema = resultsDatabaseSchema, - vocabDatabaseSchema = vocabDatabaseSchema, - outputPath = aresDataRoot - ) - - # perform temporal characterization - outputFile <- file.path(datasourceReleaseOutputFolder, "temporal-characterization.csv") - Achilles::performTemporalCharacterization( - connectionDetails = connectionDetails, - cdmDatabaseSchema = cdmDatabaseSchema, - resultsDatabaseSchema = resultsDatabaseSchema, - outputFile = outputFile - ) - - # augment concept files with temporal characterization data - AresIndexer::augmentConceptFiles(releaseFolder = file.path(aresDataRoot, releaseKey)) - - # build network level index for all existing sources - sourceFolders <- list.dirs(aresDataRoot,recursive=F) - AresIndexer::buildNetworkIndex(sourceFolders = sourceFolders, outputFolder = aresDataRoot) - AresIndexer::buildDataQualityIndex(sourceFolders = sourceFolders, outputFolder = aresDataRoot) - AresIndexer::buildNetworkUnmappedSourceCodeIndex(sourceFolders = sourceFolders, outputFolder = aresDataRoot) - -``` - -Visiting the ARES web site will now show the data results for your current network. Each individual CDM needs to be processed in order for it to be available in ARES. CDM data sources with the same source name will be versioned using the release key allowing analysis across multiple versions of the same data source. An example of generating a complete network of different data sources and loading them into ARES can be found [here](https://gist.github.com/fdefalco/35b7844626a9d8808d99bf5990e46ed2). - -## Visualizations - -Visualizations are used throughout ARES to assist in the interpretation of information. In this section sample visualizations are presented with descriptions to ensure they are well understood. - -### Preattentive Processing - -[Visualization Techniques Cheat Sheet](https://policyviz.com/2018/08/07/dataviz-cheatsheet/) - -### Interpreting Box-Whisker Diagrams and Inter-Quartile Range (IQR) - -Box-whisker diagrams present a simple picture representing the distribution of a set of data which include the values for the minimum, maximum, and quartiles of the distribution. They are also known as boxplots. - -![IQR](img/sample-iqr.png) - -- A - Lowest value -- B - Lower Quartile (25%) -- C - Median (50%) -- D - Upper Quartile (75%) -- E - Highest Value - -## Data Network reports - -### Overview - -### Quality Assessment - -### Population Overview - -### Data Strand Report - -## Data Source reports - -### Data Quality History - -### Domain Continuity - -## Data Source Release reports - -### Data Quality - -### Person - -### Data Density - -### Observation Period - -### Conditions - -### Condition Eras - -### Drugs - -### Drug Eras - -### Visit Occurrence - -### Visit Detail - -### Measurements - -### Observations - -### Procedures - -### Device Exposures - -### Death - -### Unmapped Source Codes - -### Performance - -### Metadata - -### Visit Detail - -## Roadmap - -The roadmap for ARES is maintained on the github repository. - -## OHDSI Libraries - -ARES presents research generated through the suite of OHDSI related packages. - -- Achilles -- Data Quality Dashboard -- Database Connector -- Sql Render -- Castor - -## Open Source Ecosystem - -ARES leverages many open source libraries and tools to achieve its goals without which the task would be entirely insurmountable. - -- Vue -- Vuetify -- axios -- Vega -- Vega-lite -- vega-embed -- codemirror -- d3 -- markdown-it -- markdown-it-vue -- npm -- lodash -- Material Design - -## Acknowledgements - -Many people have provided valuable feedback in the development of ARES. - -- Clair Blacketer -- Alan Andryc -- Patrick Ryan diff --git a/index.html b/index.html new file mode 100644 index 00000000..77fa15b5 --- /dev/null +++ b/index.html @@ -0,0 +1,24 @@ + + + + + + + + + + + ARES + + + + +
+ + + + + diff --git a/jsconfig.json b/jsconfig.json deleted file mode 100644 index b2c0e02e..00000000 --- a/jsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "include": ["./src/**/*"] -} diff --git a/logger.js b/logger.js new file mode 100644 index 00000000..aa781b02 --- /dev/null +++ b/logger.js @@ -0,0 +1,8 @@ +const logger = console.warn; + +console.warn = function (message, ...optionalParams) { + if (message.includes("@duckdb")) { + return; + } + logger(message, ...optionalParams); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..cd67bcb1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7619 @@ +{ + "name": "ares", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ares", + "version": "0.1.0", + "hasInstallScript": true, + "dependencies": { + "@codemirror/lang-markdown": "^6.2.2", + "@codemirror/lang-sql": "^6.5.4", + "@codemirror/theme-one-dark": "^6.1.2", + "@duckdb/duckdb-wasm": "1.28.0", + "@jamescoyle/svg-icon": "^0.1.1", + "@jamescoyle/vue-icon": "^0.1.2", + "@mdi/font": "^7.0.96", + "@mdi/js": "^7.3.67", + "axios": "1.6.0", + "codemirror": "^6.0.1", + "d3": "^7.8.5", + "d3-dsv": "^3.0.1", + "d3-format": "^3.0.1", + "d3-svg-annotation": "^2.5.1", + "d3-time-format": "^4.0.0", + "file-saver": "^2.0.5", + "jszip": "^3.10.1", + "jwt-decode": "^4.0.0", + "lodash": "^4.17.21", + "primeicons": "^6.0.1", + "primevue": "^3.7.1", + "uuid": "^9.0.1", + "vega": "^5.25.0", + "vega-embed": "^6.20.2", + "vega-lite": "^5.6.0", + "vue": "^3.2.45", + "vue-codemirror": "^6.1.1", + "vue-google-charts": "^1.1.0", + "vue-pivottable": "github:Mikhail-iontsev/vue-pivottable", + "vue-router": "^4.0.3", + "vue3-markdown-it": "^1.0.10", + "vuedraggable": "^4.1.0", + "vuex": "^4.1.0", + "yorkie": "^2.0.0" + }, + "devDependencies": { + "@types/d3": "^7.4.0", + "@types/d3-format": "^3.0.1", + "@types/d3-time-format": "^4.0.0", + "@types/file-saver": "^2.0.5", + "@types/lodash": "^4.14.191", + "@types/uuid": "^9.0.8", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", + "@vitejs/plugin-vue": "^4.0.0", + "@vitejs/plugin-vue-jsx": "^3.0.0", + "@vue/eslint-config-typescript": "^9.1.0", + "autoprefixer": "^10.4.16", + "eslint": "^8.57.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-vue": "^8.7.1", + "lint-staged": "^13.0.3", + "postcss": "^8.4.31", + "prettier": "^2.8.3", + "sass": "^1.58.0", + "tailwindcss": "^3.3.5", + "typescript": "~4.9.5", + "vite": "4.5.5", + "vue-eslint-parser": "^9.4.3", + "yorkie": "^2.0.0" + } + }, + "node_modules/@75lb/deep-merge": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", + "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", + "dependencies": { + "lodash.assignwith": "^4.2.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@75lb/deep-merge/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.10.2.tgz", + "integrity": "sha512-3dCL7b0j2GdtZzWN5j7HDpRAJ26ip07R4NGYz7QYthIYMiX8I4E4TNrYcdTayPJGeVQtd/xe7lWU4XL7THFb/w==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + }, + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.3.0.tgz", + "integrity": "sha512-tFfcxRIlOWiQDFhjBSWJ10MxcvbCIsRr6V64SgrcaY0MwNk32cUOcCuNlWo8VjV4qRQCgNgUAnIeo0svkk4R5Q==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.2.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.2.1.tgz", + "integrity": "sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.6.tgz", + "integrity": "sha512-E4C8CVupBksXvgLSme/zv31x91g06eZHSph7NczVxZW+/K+3XgJGWNT//2WLzaKSBoxpAjaOi5ZnPU1SHhjh3A==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.0" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.1.tgz", + "integrity": "sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-markdown": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.2.2.tgz", + "integrity": "sha512-wmwM9Y5n/e4ndU51KcYDaQnb9goYdhXjU71dDW9goOc1VUTIPph6WKAPdJ6BzC0ZFy+UTsDwTXGWSP370RH69Q==", + "dependencies": { + "@codemirror/autocomplete": "^6.7.1", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.3.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/markdown": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-sql": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.5.4.tgz", + "integrity": "sha512-5Gq7fYtT/5HbNyIG7a8vYaqOYQU3JbgtBe3+derkrFUXRVcjkf8WVgz++PIbMFAQsOFMDdDR+uiNM8ZRRuXH+w==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.9.1.tgz", + "integrity": "sha512-lWRP3Y9IUdOms6DXuBpoWwjkR7yRmnS0hKYCbSfPz9v6Em1A1UCRujAkDiCrdYfs1Z0Eu4dGtwovNPStIfkgNA==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.4.2.tgz", + "integrity": "sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.4.tgz", + "integrity": "sha512-YoTrvjv9e8EbPs58opjZKyJ3ewFrVSUzQ/4WXlULQLSDDr1nGPJ67mMXFNNVYwdFhybzhrzrtqgHmtpJwIF+8g==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.3.1.tgz", + "integrity": "sha512-88e4HhMtKJyw6fKprGaN/yZfiaoGYOi2nM45YCUC6R/kex9sxFWBDGatS1vk4lMgnWmdIIB9tk8Gj1LmL8YfvA==" + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz", + "integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.21.3.tgz", + "integrity": "sha512-8l1aSQ6MygzL4Nx7GVYhucSXvW4jQd0F6Zm3v9Dg+6nZEfwzJVqi4C2zHfDljID+73gsQrWp9TgHc81xU15O4A==", + "dependencies": { + "@codemirror/state": "^6.1.4", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@duckdb/duckdb-wasm": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@duckdb/duckdb-wasm/-/duckdb-wasm-1.28.0.tgz", + "integrity": "sha512-YaswpEmxr1Sp20/FZbWR7bZBJqj6xQXX2m4LLzYBnA02g4K1yrpxsBWmkxQyMbrH6AHKhcUUqAlaXfA2Rvaa3w==", + "dependencies": { + "apache-arrow": "^13.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.1.tgz", + "integrity": "sha512-O7x6dMstWLn2ktjcoiNLDkAGG2EjveHL+Vvc+n0fXumkJYAcSqcVYKtwDU+hDZ0uDUsnUagSYaZrOLAYE8un1A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@jamescoyle/svg-icon": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jamescoyle/svg-icon/-/svg-icon-0.1.1.tgz", + "integrity": "sha512-SFxucVGGuI9MzxzzhazmbNP2Qqq3MJH420WPTI3z2OvTCjqr4k38HYEZ63ePKKILUvIFKXZNAm6+hwVcZc5Wvw==" + }, + "node_modules/@jamescoyle/vue-icon": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@jamescoyle/vue-icon/-/vue-icon-0.1.2.tgz", + "integrity": "sha512-KFrImXx5TKIi6iQXlnyLEBl4rNosNKbTeRnr70ucTdUaciVmd9qK9d/pZAaKt1Ob/8xNnX2GMp8LisyHdKtEgw==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@lezer/common": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.1.0.tgz", + "integrity": "sha512-XPIN3cYDXsoJI/oDWoR2tD++juVrhgIago9xyKhZ7IhGlzdDM9QgC8D8saKNCz5pindGcznFr2HBSsEQSWnSjw==" + }, + "node_modules/@lezer/css": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.3.tgz", + "integrity": "sha512-SjSM4pkQnQdJDVc80LYzEaMiNy9txsFbI7HsMgeVF28NdLaAdHNtQ+kB/QqDUzRBV/75NTXjJ/R5IdC8QQGxMg==", + "dependencies": { + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.6.tgz", + "integrity": "sha512-cmSJYa2us+r3SePpRCjN5ymCqCPv+zyXmDl0ciWtVaNiORT/MxM7ZgOMQZADD0o51qOaOg24qc/zBViOIwAjJg==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.6.tgz", + "integrity": "sha512-Kk9HJARZTc0bAnMQUqbtuhFVsB4AnteR2BFUWfZV7L/x1H0aAKz6YabrfJ2gk/BEgjh9L3hg5O4y2IDZRBdzuQ==", + "dependencies": { + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.8.tgz", + "integrity": "sha512-QRmw/5xrcyRLyWr3JT3KCzn2XZr5NYNqQMGsqnYy+FghbQn9DZPuj6JDkE6uSXvfMLpdapu8KBIaeoJFaR4QVw==", + "dependencies": { + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.13.tgz", + "integrity": "sha512-RLAbau/4uSzKgIKj96mI5WUtG1qtiR0Frn0Ei9zhPj8YOkHM+1Bb8SgdVvmR/aWJCFIzjo2KFnDiRZ75Xf5NdQ==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/markdown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.1.0.tgz", + "integrity": "sha512-JYOI6Lkqbl83semCANkO3CKbKc0pONwinyagBufWBm+k4yhIcqfCF8B8fpEpvJLmIy7CAfwiq7dQ/PzUZA340g==", + "dependencies": { + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@mdi/font": { + "version": "7.2.96", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.2.96.tgz", + "integrity": "sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w==" + }, + "node_modules/@mdi/js": { + "version": "7.3.67", + "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.3.67.tgz", + "integrity": "sha512-MnRjknFqpTC6FifhGHjZ0+QYq2bAkZFQqIj8JA2AdPZbBxUvr8QSgB2yPAJ8/ob/XkR41xlg5majDR3c1JP1hw==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/clone/-/clone-2.1.1.tgz", + "integrity": "sha512-BZIU34bSYye0j/BFcPraiDZ5ka6MJADjcDVELGf7glr9K+iE8NYVjFslJFVWzskSxkLLyCrSPScE82/UUoBSvg==" + }, + "node_modules/@types/command-line-args": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz", + "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==" + }, + "node_modules/@types/command-line-usage": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.2.tgz", + "integrity": "sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg==" + }, + "node_modules/@types/d3": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", + "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", + "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==", + "dev": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", + "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", + "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", + "dev": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", + "dev": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", + "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", + "dev": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", + "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", + "dev": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", + "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "dev": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", + "dev": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "dev": true + }, + "node_modules/@types/d3-geo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", + "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", + "dev": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "dev": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", + "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.3.tgz", + "integrity": "sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==", + "dev": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", + "dev": true + }, + "node_modules/@types/geojson": { + "version": "7946.0.4", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.4.tgz", + "integrity": "sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "peer": true + }, + "node_modules/@types/lodash": { + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "peer": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "peer": true + }, + "node_modules/@types/node": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.0.tgz", + "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ==" + }, + "node_modules/@types/pad-left": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/pad-left/-/pad-left-2.1.1.tgz", + "integrity": "sha512-Xd22WCRBydkGSApl5Bw0PhAOHKSVjNL3E3AwzKaps96IMraPqy5BvZIsBVK6JLwdybUzjHnuWVwpDd0JjTfHXA==" + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", + "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.1.tgz", + "integrity": "sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.7", + "@babel/plugin-transform-typescript": "^7.20.7", + "@vue/babel-plugin-jsx": "^1.1.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-9.1.0.tgz", + "integrity": "sha512-j/852/ZYQ5wDvCD3HE2q4uqJwJAceer2FwoEch1nFo+zTOsPrbzbE3cuWIs3kvu5hdFsGTMYwRwjI6fqZKDMxQ==", + "dev": true, + "dependencies": { + "vue-eslint-parser": "^8.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^8.0.1" + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/vue-eslint-parser": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apache-arrow": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-13.0.0.tgz", + "integrity": "sha512-3gvCX0GDawWz6KFNC28p65U+zGh/LZ6ZNKWNu74N6CQlKzxeoWHpi4CgEQsgRSEMuyrIIXi1Ea2syja7dwcHvw==", + "dependencies": { + "@types/command-line-args": "5.2.0", + "@types/command-line-usage": "5.0.2", + "@types/node": "20.3.0", + "@types/pad-left": "2.1.1", + "command-line-args": "5.2.1", + "command-line-usage": "7.0.1", + "flatbuffers": "23.5.26", + "json-bignum": "^0.0.3", + "pad-left": "^2.1.0", + "tslib": "^2.5.3" + }, + "bin": { + "arrow2csv": "bin/arrow2csv.js" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001621", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", + "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk-template/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/chalk-template/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk-template/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/codemirror": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", + "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", + "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^3.0.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", + "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", + "dependencies": { + "commander": "7", + "d3-array": "1 - 3", + "d3-geo": "1.12.0 - 3" + }, + "bin": { + "geo2svg": "bin/geo2svg.js", + "geograticule": "bin/geograticule.js", + "geoproject": "bin/geoproject.js", + "geoquantize": "bin/geoquantize.js", + "geostitch": "bin/geostitch.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-svg-annotation": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/d3-svg-annotation/-/d3-svg-annotation-2.5.1.tgz", + "integrity": "sha512-PXW39bunDsn2K6uiCUlZ919fnC29o8oIDzNJtKvz6xOMeNv53LyNkucn40YjLherNCrlx5JGsyEtw/DZcjAa4Q==", + "dependencies": { + "d3-dispatch": "1.0.2", + "d3-drag": "1.2.3", + "d3-selection": "1.4.0", + "d3-shape": "1.0.4", + "d3-transition": "1.0.3" + } + }, + "node_modules/d3-svg-annotation/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/d3-svg-annotation/node_modules/d3-dispatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.2.tgz", + "integrity": "sha512-Kr/bYOYhM/6g7V8BWuEpWA7OvoieYQxo98863SRRGZjSFjveJxl8KUlyA0d5uf02Ox+rmOzE/3zomhKfNk/ZDQ==" + }, + "node_modules/d3-svg-annotation/node_modules/d3-drag": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", + "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/d3-svg-annotation/node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/d3-svg-annotation/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/d3-svg-annotation/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/d3-svg-annotation/node_modules/d3-selection": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz", + "integrity": "sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg==" + }, + "node_modules/d3-svg-annotation/node_modules/d3-shape": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.0.4.tgz", + "integrity": "sha512-cfgoSGygKqHOG9n2rslAqeCdEK5RB7gKK5lihJi0zhU+Zksc5jEnkM7mmN+FCQO63Yl8QBOHcV3BxL+aNnmazw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-svg-annotation/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/d3-svg-annotation/node_modules/d3-transition": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.0.3.tgz", + "integrity": "sha512-Facxcbma0nA2GVrx7B/Mgnn5ju6SwUMzGa9YcYmQjpqmaIq1Zbp5vVJLjtH6b08Lu0vcX7O6a4z+AlLmdCxrCQ==", + "dependencies": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-timer": "1" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.590", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.590.tgz", + "integrity": "sha512-hohItzsQcG7/FBsviCYMtQwUSWvVF7NVqPOnJCErWsAshsP/CR2LAXdmq276RbESNdhxiAq5/vRo1g2pxGXVww==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz", + "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==", + "dev": true, + "dependencies": { + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^8.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-vue/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/vue-eslint-parser": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "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==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatbuffers": { + "version": "23.5.26", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-23.5.26.tgz", + "integrity": "sha512-vE+SI9vrJDwi1oETtTIFldC/o9GsVKRM+s6EL0nQgxXlYV1Vc4Tk30hj4xGICftInKQKj1F3up2n8UbIVobISQ==" + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/highlight.js": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", + "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-bignum": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", + "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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/json-stringify-pretty-compact": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz", + "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/lint-staged": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "dev": true, + "dependencies": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/listr2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assignwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", + "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-update/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-abbr": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz", + "integrity": "sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg==" + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it-deflist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz", + "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==" + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" + }, + "node_modules/markdown-it-footnote": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", + "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==" + }, + "node_modules/markdown-it-highlightjs": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/markdown-it-highlightjs/-/markdown-it-highlightjs-3.6.0.tgz", + "integrity": "sha512-ex+Lq3cVkprh0GpGwFyc53A/rqY6GGzopPCG1xMsf8Ya3XtGC8Uw9tChN1rWbpyDae7tBBhVHVcMM29h4Btamw==", + "dependencies": { + "highlight.js": "^11.3.1", + "lodash.flow": "^3.5.0" + } + }, + "node_modules/markdown-it-ins": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz", + "integrity": "sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==" + }, + "node_modules/markdown-it-mark": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz", + "integrity": "sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==" + }, + "node_modules/markdown-it-sub": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz", + "integrity": "sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q==" + }, + "node_modules/markdown-it-sup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz", + "integrity": "sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ==" + }, + "node_modules/markdown-it-task-lists": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", + "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==" + }, + "node_modules/markdown-it-toc-done-right": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-toc-done-right/-/markdown-it-toc-done-right-4.2.0.tgz", + "integrity": "sha512-UB/IbzjWazwTlNAX0pvWNlJS8NKsOQ4syrXZQ/C72j+jirrsjVRT627lCaylrKJFBQWfRsPmIVQie8x38DEhAQ==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "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==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pad-left": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", + "integrity": "sha512-HJxs9K9AztdIQIAIa/OIazRAUW/L6B9hbQDxO4X07roW3eo9XqZc2ur9bn1StH9CnbbI9EgvejHQX7CBpCF1QA==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/primeicons": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-6.0.1.tgz", + "integrity": "sha512-KDeO94CbWI4pKsPnYpA1FPjo79EsY9I+M8ywoPBSf9XMXoe/0crjbUK7jcQEDHuc0ZMRIZsxH3TYLv4TUtHmAA==" + }, + "node_modules/primevue": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/primevue/-/primevue-3.50.0.tgz", + "integrity": "sha512-vYpQzvIXSmF0hWUkviHEGnwbFY/G8jI2RSxoa75noJloI2rWhzOX+JarJ8iaesVOr7b2se31N/p7zOx6uh3ddQ==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-read-all": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", + "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz", + "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==" + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/table-layout": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", + "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", + "dependencies": { + "@75lb/deep-merge": "^1.1.1", + "array-back": "^6.2.2", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.0", + "stream-read-all": "^3.0.1", + "typical": "^7.1.1", + "wordwrapjs": "^5.1.0" + }, + "bin": { + "table-layout": "bin/cli.js" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vega": { + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-5.25.0.tgz", + "integrity": "sha512-lr+uj0mhYlSN3JOKbMNp1RzZBenWp9DxJ7kR3lha58AFNCzzds7pmFa7yXPbtbaGhB7Buh/t6n+Bzk3Y0VnF5g==", + "dependencies": { + "vega-crossfilter": "~4.1.1", + "vega-dataflow": "~5.7.5", + "vega-encode": "~4.9.2", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.1.0", + "vega-force": "~4.2.0", + "vega-format": "~1.1.1", + "vega-functions": "~5.13.2", + "vega-geo": "~4.4.1", + "vega-hierarchy": "~4.1.1", + "vega-label": "~1.2.1", + "vega-loader": "~4.5.1", + "vega-parser": "~6.2.0", + "vega-projection": "~1.6.0", + "vega-regression": "~1.2.0", + "vega-runtime": "~6.1.4", + "vega-scale": "~7.3.0", + "vega-scenegraph": "~4.10.2", + "vega-statistics": "~1.9.0", + "vega-time": "~2.1.1", + "vega-transforms": "~4.10.2", + "vega-typings": "~0.24.0", + "vega-util": "~1.17.2", + "vega-view": "~5.11.1", + "vega-view-transforms": "~4.5.9", + "vega-voronoi": "~4.2.1", + "vega-wordcloud": "~4.1.4" + } + }, + "node_modules/vega-canvas": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.7.tgz", + "integrity": "sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q==" + }, + "node_modules/vega-crossfilter": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.1.1.tgz", + "integrity": "sha512-yesvlMcwRwxrtAd9IYjuxWJJuAMI0sl7JvAFfYtuDkkGDtqfLXUcCzHIATqW6igVIE7tWwGxnbfvQLhLNgK44Q==", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-dataflow": { + "version": "5.7.5", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.5.tgz", + "integrity": "sha512-EdsIl6gouH67+8B0f22Owr2tKDiMPNNR8lEvJDcxmFw02nXd8juimclpLvjPQriqn6ta+3Dn5txqfD117H04YA==", + "dependencies": { + "vega-format": "^1.1.1", + "vega-loader": "^4.5.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-embed": { + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-6.22.1.tgz", + "integrity": "sha512-5a3SVhPwG5/Mz3JbcJV4WE38s/7AFrkANtPxoln7E8fbNLIbrurIennaAxB9+l0QOAg63lPSuJBNMUkM6yXvLA==", + "bundleDependencies": [ + "yallist" + ], + "dependencies": { + "fast-json-patch": "^3.1.1", + "json-stringify-pretty-compact": "^3.0.0", + "semver": "~7.4.0", + "tslib": "^2.5.0", + "vega-interpreter": "^1.0.5", + "vega-schema-url-parser": "^2.2.0", + "vega-themes": "^2.13.0", + "vega-tooltip": "^0.32.0", + "yallist": "*" + }, + "peerDependencies": { + "vega": "^5.21.0", + "vega-lite": "*" + } + }, + "node_modules/vega-embed/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vega-embed/node_modules/semver": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", + "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vega-embed/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "inBundle": true + }, + "node_modules/vega-encode": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-4.9.2.tgz", + "integrity": "sha512-c3J0LYkgYeXQxwnYkEzL15cCFBYPRaYUon8O2SZ6O4PhH4dfFTXBzSyT8+gh8AhBd572l2yGDfxpEYA6pOqdjg==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "vega-dataflow": "^5.7.5", + "vega-scale": "^7.3.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-event-selector": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz", + "integrity": "sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==" + }, + "node_modules/vega-expression": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.0.tgz", + "integrity": "sha512-u8Rzja/cn2PEUkhQN3zUj3REwNewTA92ExrcASNKUJPCciMkHJEjESwFYuI6DWMCq4hQElQ92iosOAtwzsSTqA==", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-force": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-4.2.0.tgz", + "integrity": "sha512-aE2TlP264HXM1r3fl58AvZdKUWBNOGkIvn4EWyqeJdgO2vz46zSU7x7TzPG4ZLuo44cDRU5Ng3I1eQk23Asz6A==", + "dependencies": { + "d3-force": "^3.0.0", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-format": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-1.1.1.tgz", + "integrity": "sha512-Rll7YgpYbsgaAa54AmtEWrxaJqgOh5fXlvM2wewO4trb9vwM53KBv4Q/uBWCLK3LLGeBXIF6gjDt2LFuJAUtkQ==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-format": "^3.1.0", + "d3-time-format": "^4.1.0", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-functions": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.13.2.tgz", + "integrity": "sha512-YE1Xl3Qi28kw3vdXVYgKFMo20ttd3+SdKth1jUNtBDGGdrOpvPxxFhZkVqX+7FhJ5/1UkDoAYs/cZY0nRKiYgA==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.0", + "vega-dataflow": "^5.7.5", + "vega-expression": "^5.1.0", + "vega-scale": "^7.3.0", + "vega-scenegraph": "^4.10.2", + "vega-selections": "^5.4.1", + "vega-statistics": "^1.8.1", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-geo": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.4.1.tgz", + "integrity": "sha512-s4WeZAL5M3ZUV27/eqSD3v0FyJz3PlP31XNSLFy4AJXHxHUeXT3qLiDHoVQnW5Om+uBCPDtTT1ROx1smGIf2aA==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.0", + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.5", + "vega-projection": "^1.6.0", + "vega-statistics": "^1.8.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-hierarchy": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.1.1.tgz", + "integrity": "sha512-h5mbrDtPKHBBQ9TYbvEb/bCqmGTlUX97+4CENkyH21tJs7naza319B15KRK0NWOHuhbGhFmF8T0696tg+2c8XQ==", + "dependencies": { + "d3-hierarchy": "^3.1.2", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-interpreter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-1.0.5.tgz", + "integrity": "sha512-po6oTOmeQqr1tzTCdD15tYxAQLeUnOVirAysgVEemzl+vfmvcEP7jQmlc51jz0jMA+WsbmE6oJywisQPu/H0Bg==" + }, + "node_modules/vega-label": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-1.2.1.tgz", + "integrity": "sha512-n/ackJ5lc0Xs9PInCaGumYn2awomPjJ87EMVT47xNgk2bHmJoZV1Ve/1PUM6Eh/KauY211wPMrNp/9Im+7Ripg==", + "dependencies": { + "vega-canvas": "^1.2.6", + "vega-dataflow": "^5.7.3", + "vega-scenegraph": "^4.9.2", + "vega-util": "^1.15.2" + } + }, + "node_modules/vega-lite": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-5.14.1.tgz", + "integrity": "sha512-VFvi0QtUoLQqwfAXTGjo0Acw/OTjiK3zOrcO/HyksGnnNDBHWM1GTcFryiWZYoAi99ehvv7tI/q94O46+fGRSQ==", + "dependencies": { + "@types/clone": "~2.1.1", + "clone": "~2.1.2", + "fast-deep-equal": "~3.1.3", + "fast-json-stable-stringify": "~2.1.0", + "json-stringify-pretty-compact": "~3.0.0", + "tslib": "~2.5.0", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.1.0", + "vega-util": "~1.17.2", + "yargs": "~17.7.2" + }, + "bin": { + "vl2pdf": "bin/vl2pdf", + "vl2png": "bin/vl2png", + "vl2svg": "bin/vl2svg", + "vl2vg": "bin/vl2vg" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "vega": "^5.24.0" + } + }, + "node_modules/vega-lite/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, + "node_modules/vega-loader": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.5.1.tgz", + "integrity": "sha512-qy5x32SaT0YkEujQM2yKqvLGV9XWQ2aEDSugBFTdYzu/1u4bxdUSRDREOlrJ9Km3RWIOgFiCkobPmFxo47SKuA==", + "dependencies": { + "d3-dsv": "^3.0.1", + "node-fetch": "^2.6.7", + "topojson-client": "^3.1.0", + "vega-format": "^1.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-parser": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-6.2.0.tgz", + "integrity": "sha512-as+QnX8Qxe9q51L1C2sVBd+YYYctP848+zEvkBT2jlI2g30aZ6Uv7sKsq7QTL6DUbhXQKR0XQtzlanckSFdaOQ==", + "dependencies": { + "vega-dataflow": "^5.7.5", + "vega-event-selector": "^3.0.1", + "vega-functions": "^5.13.1", + "vega-scale": "^7.3.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-projection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.6.0.tgz", + "integrity": "sha512-LGUaO/kpOEYuTlul+x+lBzyuL9qmMwP1yShdUWYLW+zXoeyGbs5OZW+NbPPwLYqJr5lpXDr/vGztFuA/6g2xvQ==", + "dependencies": { + "d3-geo": "^3.1.0", + "d3-geo-projection": "^4.0.0", + "vega-scale": "^7.3.0" + } + }, + "node_modules/vega-regression": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.2.0.tgz", + "integrity": "sha512-6TZoPlhV/280VbxACjRKqlE0Nv48z5g4CSNf1FmGGTWS1rQtElPTranSoVW4d7ET5eVQ6f9QLxNAiALptvEq+g==", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.3", + "vega-statistics": "^1.9.0", + "vega-util": "^1.15.2" + } + }, + "node_modules/vega-runtime": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-6.1.4.tgz", + "integrity": "sha512-0dDYXyFLQcxPQ2OQU0WuBVYLRZnm+/CwVu6i6N4idS7R9VXIX5581EkCh3pZ20pQ/+oaA7oJ0pR9rJgJ6rukRQ==", + "dependencies": { + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-scale": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-7.3.0.tgz", + "integrity": "sha512-pMOAI2h+e1z7lsqKG+gMfR6NKN2sTcyjZbdJwntooW0uFHwjLGjMSY7kSd3nSEquF0HQ8qF7zR6gs1eRwlGimw==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-scenegraph": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.10.2.tgz", + "integrity": "sha512-R8m6voDZO5+etwNMcXf45afVM3XAtokMqxuDyddRl9l1YqSJfS+3u8hpolJ50c2q6ZN20BQiJwKT1o0bB7vKkA==", + "dependencies": { + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "vega-canvas": "^1.2.7", + "vega-loader": "^4.5.1", + "vega-scale": "^7.3.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-schema-url-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-2.2.0.tgz", + "integrity": "sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw==" + }, + "node_modules/vega-selections": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.4.1.tgz", + "integrity": "sha512-EtYc4DvA+wXqBg9tq+kDomSoVUPCmQfS7hUxy2qskXEed79YTimt3Hcl1e1fW226I4AVDBEqTTKebmKMzbSgAA==", + "dependencies": { + "d3-array": "3.2.2", + "vega-expression": "^5.0.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-selections/node_modules/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-statistics": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.9.0.tgz", + "integrity": "sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==", + "dependencies": { + "d3-array": "^3.2.2" + } + }, + "node_modules/vega-themes": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.14.0.tgz", + "integrity": "sha512-9dLmsUER7gJrDp8SEYKxBFmXmpyzLlToKIjxq3HCvYjz8cnNrRGyAhvIlKWOB3ZnGvfYV+vnv3ZRElSNL31nkA==", + "peerDependencies": { + "vega": "*", + "vega-lite": "*" + } + }, + "node_modules/vega-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-2.1.1.tgz", + "integrity": "sha512-z1qbgyX0Af2kQSGFbApwBbX2meenGvsoX8Nga8uyWN8VIbiySo/xqizz1KrP6NbB6R+x5egKmkjdnyNThPeEWA==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-time": "^3.1.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-tooltip": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.32.0.tgz", + "integrity": "sha512-Sc4/vZsXDM9nOiHrxc8hfpc9lYc7Nr0FIYYkIi90v2d6IoE6thm6T4Exo2m7cMK4rwevwf6c4/FABwjOMIs4MQ==", + "dependencies": { + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-transforms": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.10.2.tgz", + "integrity": "sha512-sJELfEuYQ238PRG+GOqQch8D69RYnJevYSGLsRGQD2LxNz3j+GlUX6Pid+gUEH5HJy22Q5L0vsTl2ZNhIr4teQ==", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.5", + "vega-statistics": "^1.8.1", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-typings": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.24.1.tgz", + "integrity": "sha512-WNw6tDxwMsynQ9osJb3RZi3g8GZruxVgXfe8N7nbqvNOgDQkUuVjqTZiwGg5kqjmLqx09lRRlskgp/ov7lEGeg==", + "dependencies": { + "@types/geojson": "7946.0.4", + "vega-event-selector": "^3.0.1", + "vega-expression": "^5.0.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-util": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.17.2.tgz", + "integrity": "sha512-omNmGiZBdjm/jnHjZlywyYqafscDdHaELHx1q96n5UOz/FlO9JO99P4B3jZg391EFG8dqhWjQilSf2JH6F1mIw==" + }, + "node_modules/vega-view": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-5.11.1.tgz", + "integrity": "sha512-RoWxuoEMI7xVQJhPqNeLEHCezudsf3QkVMhH5tCovBqwBADQGqq9iWyax3ZzdyX1+P3eBgm7cnLvpqtN2hU8kA==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-timer": "^3.0.1", + "vega-dataflow": "^5.7.5", + "vega-format": "^1.1.1", + "vega-functions": "^5.13.1", + "vega-runtime": "^6.1.4", + "vega-scenegraph": "^4.10.2", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-view-transforms": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.5.9.tgz", + "integrity": "sha512-NxEq4ZD4QwWGRrl2yDLnBRXM9FgCI+vvYb3ZC2+nVDtkUxOlEIKZsMMw31op5GZpfClWLbjCT3mVvzO2xaTF+g==", + "dependencies": { + "vega-dataflow": "^5.7.5", + "vega-scenegraph": "^4.10.2", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-voronoi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.2.1.tgz", + "integrity": "sha512-zzi+fxU/SBad4irdLLsG3yhZgXWZezraGYVQfZFWe8kl7W/EHUk+Eqk/eetn4bDeJ6ltQskX+UXH3OP5Vh0Q0Q==", + "dependencies": { + "d3-delaunay": "^6.0.2", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-wordcloud": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.1.4.tgz", + "integrity": "sha512-oeZLlnjiusLAU5vhk0IIdT5QEiJE0x6cYoGNq1th+EbwgQp153t4r026fcib9oq15glHFOzf81a8hHXHSJm1Jw==", + "dependencies": { + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.5", + "vega-scale": "^7.3.0", + "vega-statistics": "^1.8.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vite": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/vue-codemirror": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vue-codemirror/-/vue-codemirror-6.1.1.tgz", + "integrity": "sha512-rTAYo44owd282yVxKtJtnOi7ERAcXTeviwoPXjIc6K/IQYUsoDkzPvw/JDFtSP6T7Cz/2g3EHaEyeyaQCKoDMg==", + "dependencies": { + "@codemirror/commands": "6.x", + "@codemirror/language": "6.x", + "@codemirror/state": "6.x", + "@codemirror/view": "6.x" + }, + "peerDependencies": { + "codemirror": "6.x", + "vue": "3.x" + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-google-charts": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vue-google-charts/-/vue-google-charts-1.1.0.tgz", + "integrity": "sha512-wGAgAynIIUKmP5eJUFlx69e8gjIDpyqHlVsvFyrnd2tGZk3a6FI83dRhdssxPyOc9y41+2QEfqUV9SsR+n6s5A==", + "peerDependencies": { + "vue": "^3.0.0-0 || ^2.6.0" + } + }, + "node_modules/vue-pivottable": { + "version": "0.4.63", + "resolved": "git+ssh://git@github.com/Mikhail-iontsev/vue-pivottable.git#b45de1207d0cdfd4efc758d83d49da382368496b", + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "vue": "^3.2.45", + "vuedraggable": "^2.23.0" + } + }, + "node_modules/vue-pivottable/node_modules/sortablejs": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz", + "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==" + }, + "node_modules/vue-pivottable/node_modules/vuedraggable": { + "version": "2.24.3", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz", + "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==", + "dependencies": { + "sortablejs": "1.10.2" + } + }, + "node_modules/vue-router": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue3-markdown-it": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/vue3-markdown-it/-/vue3-markdown-it-1.0.10.tgz", + "integrity": "sha512-mTvHu0zl7jrh7ojgaZ+tTpCLiS4CVg4bTgTu4KGhw/cRRY5YgIG8QgFAPu6kCzSW6Znc9a52Beb6hFvF4hSMkQ==", + "dependencies": { + "markdown-it": "^12.3.2", + "markdown-it-abbr": "^1.0.4", + "markdown-it-anchor": "^8.4.1", + "markdown-it-deflist": "^2.1.0", + "markdown-it-emoji": "^2.0.0", + "markdown-it-footnote": "^3.0.3", + "markdown-it-highlightjs": "^3.6.0", + "markdown-it-ins": "^3.0.1", + "markdown-it-mark": "^3.0.1", + "markdown-it-sub": "^1.0.0", + "markdown-it-sup": "^1.0.0", + "markdown-it-task-lists": "^2.1.1", + "markdown-it-toc-done-right": "^4.2.0" + } + }, + "node_modules/vuedraggable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz", + "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==", + "dependencies": { + "sortablejs": "1.14.0" + }, + "peerDependencies": { + "vue": "^3.0.1" + } + }, + "node_modules/vuex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", + "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.11" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "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==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrapjs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/yorkie/node_modules/execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/yorkie/node_modules/normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/yorkie/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 896ff68a..886494aa 100644 --- a/package.json +++ b/package.json @@ -1,63 +1,79 @@ { "name": "ares", - "version": "0.1.0", + "version": "0.4.0", "description": "Apex Research Exploration System (ARES)", "author": "Frank DeFalco", "private": true, "scripts": { - "serve": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint" + "serve": "vite --open", + "preview": "vite preview --open --port 8080", + "build": "vite build --out-dir dist", + "lint": "eslint src", + "lint:fix": "eslint src --fix", + "postinstall": "npm install --prefix ./doc" }, "dependencies": { - "axios": "^0.27.2", - "core-js": "^3.6.5", + "@codemirror/lang-markdown": "^6.2.2", + "@codemirror/lang-sql": "^6.5.4", + "@codemirror/theme-one-dark": "^6.1.2", + "@duckdb/duckdb-wasm": "1.28.0", + "@jamescoyle/svg-icon": "^0.1.1", + "@jamescoyle/vue-icon": "^0.1.2", + "@mdi/font": "^7.0.96", + "@mdi/js": "^7.3.67", + "axios": "1.6.0", + "codemirror": "^6.0.1", + "d3": "^7.8.5", "d3-dsv": "^3.0.1", "d3-format": "^3.0.1", + "d3-svg-annotation": "^2.5.1", "d3-time-format": "^4.0.0", + "file-saver": "^2.0.5", + "jszip": "^3.10.1", + "jwt-decode": "^4.0.0", "lodash": "^4.17.21", - "markdown-it-vue": "^1.1.6", + "primeicons": "^6.0.1", + "primevue": "^3.7.1", + "uuid": "^9.0.1", + "vega": "^5.25.0", "vega-embed": "^6.20.2", - "vega-lite": "^5.5.0", - "vue": "^2.6.14", - "vue-codemirror": "^4.0.6", - "vue-google-charts": "^0.3.3", - "vue-pivottable": "^0.4.2", - "vue-router": "^3.5.3", - "vuedraggable": "^2.24.3", - "vuetify": "^2.6.0", - "vuex": "^3.6.2" + "vega-lite": "^5.6.0", + "vue": "^3.2.45", + "vue-codemirror": "^6.1.1", + "vue-google-charts": "^1.1.0", + "vue-pivottable": "github:Mikhail-iontsev/vue-pivottable", + "vue-router": "^4.0.3", + "vue3-markdown-it": "^1.0.10", + "vuedraggable": "^4.1.0", + "vuex": "^4.1.0", + "yorkie": "^2.0.0" }, "devDependencies": { - "@babel/eslint-parser": "^7.19.1", - "@mdi/font": "^7.0.96", - "@vue/cli-plugin-babel": "^5.0.8", - "@vue/cli-plugin-eslint": "^5.0.8", - "@vue/cli-plugin-router": "^5.0.8", - "@vue/cli-service": "^5.0.8", - "@vue/eslint-config-prettier": "^7.0.0", - "comlink-loader": "^2.0.0", - "eslint": "^8.22.0", - "eslint-plugin-vue": "^9.5.1", - "eslint-plugin-vuetify": "^1.1.0", - "fibers": "^5.0.0", + "@types/d3": "^7.4.0", + "@types/d3-format": "^3.0.1", + "@types/d3-time-format": "^4.0.0", + "@types/file-saver": "^2.0.5", + "@types/lodash": "^4.14.191", + "@types/uuid": "^9.0.8", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", + "@vitejs/plugin-vue": "^4.0.0", + "@vitejs/plugin-vue-jsx": "^3.0.0", + "@vue/eslint-config-typescript": "^9.1.0", + "autoprefixer": "^10.4.16", + "eslint": "^8.57.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-vue": "^8.7.1", "lint-staged": "^13.0.3", - "sass": "^1.55.0", - "sass-loader": "^13.0.2", - "vue-template-compiler": "^2.6.14" - }, - "gitHooks": { - "pre-commit": "lint-staged" - }, - "lint-staged": { - "*.js": [ - "vue-cli-service lint", - "git add" - ], - "*.vue": [ - "vue-cli-service lint", - "git add" - ] + "postcss": "^8.4.31", + "prettier": "^2.8.3", + "sass": "^1.58.0", + "tailwindcss": "^3.3.5", + "typescript": "~4.9.5", + "vite": "4.5.5", + "vue-eslint-parser": "^9.4.3", + "yorkie": "^2.0.0" }, "browserslist": [ "> 1%", diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..33ad091d --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/doc/index.md b/public/doc/index.md index e7b0f190..a88c6bdf 100644 --- a/public/doc/index.md +++ b/public/doc/index.md @@ -208,7 +208,7 @@ ARES presents research generated through the suite of OHDSI related packages. ARES leverages many open source libraries and tools to achieve its goals without which the task would be entirely insurmountable. - Vue -- Vuetify +- PrimeVue - axios - Vega - Vega-lite diff --git a/public/env/env.json b/public/env/env.json new file mode 100644 index 00000000..2b0cf8b0 --- /dev/null +++ b/public/env/env.json @@ -0,0 +1,5 @@ +{ + "WEB_API_URL": "./", + "WEB_API_ENABLED": false, + "DUCKDB_ENABLED": false +} diff --git a/public/favicon-dark.png b/public/favicon-dark.png new file mode 100644 index 00000000..9d06bdb5 Binary files /dev/null and b/public/favicon-dark.png differ diff --git a/public/ares_32x32.png b/public/favicon-light.png similarity index 100% rename from public/ares_32x32.png rename to public/favicon-light.png diff --git a/public/fonts/Roboto/LICENSE.txt b/public/fonts/Roboto/LICENSE.txt new file mode 100644 index 00000000..75b52484 --- /dev/null +++ b/public/fonts/Roboto/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/public/fonts/Roboto/Roboto-Black.ttf b/public/fonts/Roboto/Roboto-Black.ttf new file mode 100644 index 00000000..0112e7da Binary files /dev/null and b/public/fonts/Roboto/Roboto-Black.ttf differ diff --git a/public/fonts/Roboto/Roboto-Black.woff2 b/public/fonts/Roboto/Roboto-Black.woff2 new file mode 100644 index 00000000..beeec681 Binary files /dev/null and b/public/fonts/Roboto/Roboto-Black.woff2 differ diff --git a/public/fonts/Roboto/Roboto-Bold.ttf b/public/fonts/Roboto/Roboto-Bold.ttf new file mode 100644 index 00000000..43da14d8 Binary files /dev/null and b/public/fonts/Roboto/Roboto-Bold.ttf differ diff --git a/public/fonts/Roboto/Roboto-Bold.woff2 b/public/fonts/Roboto/Roboto-Bold.woff2 new file mode 100644 index 00000000..b102004e Binary files /dev/null and b/public/fonts/Roboto/Roboto-Bold.woff2 differ diff --git a/public/fonts/Roboto/Roboto-Light.ttf b/public/fonts/Roboto/Roboto-Light.ttf new file mode 100644 index 00000000..e7307e72 Binary files /dev/null and b/public/fonts/Roboto/Roboto-Light.ttf differ diff --git a/public/fonts/Roboto/Roboto-Light.woff2 b/public/fonts/Roboto/Roboto-Light.woff2 new file mode 100644 index 00000000..3e13c5f3 Binary files /dev/null and b/public/fonts/Roboto/Roboto-Light.woff2 differ diff --git a/public/fonts/Roboto/Roboto-Medium.ttf b/public/fonts/Roboto/Roboto-Medium.ttf new file mode 100644 index 00000000..ac0f908b Binary files /dev/null and b/public/fonts/Roboto/Roboto-Medium.ttf differ diff --git a/public/fonts/Roboto/Roboto-Medium.woff2 b/public/fonts/Roboto/Roboto-Medium.woff2 new file mode 100644 index 00000000..8b1aebb2 Binary files /dev/null and b/public/fonts/Roboto/Roboto-Medium.woff2 differ diff --git a/public/fonts/Roboto/Roboto-Regular.ttf b/public/fonts/Roboto/Roboto-Regular.ttf new file mode 100644 index 00000000..ddf4bfac Binary files /dev/null and b/public/fonts/Roboto/Roboto-Regular.ttf differ diff --git a/public/fonts/Roboto/Roboto-Regular.woff2 b/public/fonts/Roboto/Roboto-Regular.woff2 new file mode 100644 index 00000000..0aa90fc1 Binary files /dev/null and b/public/fonts/Roboto/Roboto-Regular.woff2 differ diff --git a/public/fonts/Roboto/Roboto-Thin.ttf b/public/fonts/Roboto/Roboto-Thin.ttf new file mode 100644 index 00000000..2e0dee6a Binary files /dev/null and b/public/fonts/Roboto/Roboto-Thin.ttf differ diff --git a/public/fonts/Roboto/Roboto-Thin.woff2 b/public/fonts/Roboto/Roboto-Thin.woff2 new file mode 100644 index 00000000..85c029e1 Binary files /dev/null and b/public/fonts/Roboto/Roboto-Thin.woff2 differ diff --git a/public/index.html b/public/index.html deleted file mode 100644 index 7fef29e3..00000000 --- a/public/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - ARES - - - - -
- - - \ No newline at end of file diff --git a/src/Roboto.css b/src/Roboto.css new file mode 100644 index 00000000..5d6e540b --- /dev/null +++ b/src/Roboto.css @@ -0,0 +1,41 @@ +@font-face { + font-family: 'Roboto'; + src: url('/fonts/Roboto/Roboto-Thin.woff2') format('woff2'), + url('/fonts/Roboto/Roboto-Thin.ttf') format('truetype'); + font-weight: 100; /* Thin */ +} + +@font-face { + font-family: 'Roboto'; + src: url('/fonts/Roboto/Roboto-Light.woff2') format('woff2'), + url('/fonts/Roboto/Roboto-Light.ttf') format('truetype'); + font-weight: 300; /* Light */ +} + +@font-face { + font-family: 'Roboto'; + src: url('/fonts/Roboto/Roboto-Regular.woff2') format('woff2'), + url('/fonts/Roboto/Roboto-Regular.ttf') format('truetype'); + font-weight: 400; /* Regular */ +} + +@font-face { + font-family: 'Roboto'; + src: url('/fonts/Roboto/Roboto-Medium.woff2') format('woff2'), + url('/fonts/Roboto/Roboto-Medium.ttf') format('truetype'); + font-weight: 500; /* Medium */ +} + +@font-face { + font-family: 'Roboto'; + src: url('/fonts/Roboto/Roboto-Bold.woff2') format('woff2'), + url('/fonts/Roboto/Roboto-Bold.ttf') format('truetype'); + font-weight: 700; /* Bold */ +} + +@font-face { + font-family: 'Roboto'; + src: url('/fonts/Roboto/Roboto-Black.woff2') format('woff2'), + url('/fonts/Roboto/Roboto-Black.ttf') format('truetype'); + font-weight: 900; /* Bold */ +} \ No newline at end of file diff --git a/src/app/App.vue b/src/app/App.vue index 17a98429..286e7f55 100644 --- a/src/app/App.vue +++ b/src/app/App.vue @@ -1,45 +1,191 @@ - - diff --git a/src/app/plugins/tailwind/components/accordion.ts b/src/app/plugins/tailwind/components/accordion.ts new file mode 100644 index 00000000..a353e755 --- /dev/null +++ b/src/app/plugins/tailwind/components/accordion.ts @@ -0,0 +1,86 @@ +export default { + accordiontab: { + root: { + class: "mb-1", + }, + header: ({ props }) => ({ + class: [ + // State + { + "select-none pointer-events-none cursor-default opacity-60": + props?.disabled, + }, + ], + }), + headerAction: ({ context }) => ({ + class: [ + //Font + "font-bold", + "leading-none", + + // Alignments + "flex items-center", + "relative", + + // Sizing + "p-5", + + // Shape + "rounded-t-md", + { + "rounded-br-md rounded-bl-md": !context.active, + "rounded-br-0 rounded-bl-0": context.active, + }, + + // Color + "border border-surface-200 dark:border-surface-700", + "bg-surface-50 dark:bg-surface-800", + "text-surface-600 dark:text-surface-0/80", + { "text-surface-900": context.active }, + + // Transition + "transition duration-200 ease-in-out", + "transition-shadow duration-200", + + // States + "hover:bg-surface-100 dark:hover:bg-surface-700", + "hover:text-surface-900", + "focus:outline-none focus:outline-offset-0 focus-visible:ring focus-visible:ring-primary-400/50 ring-inset dark:focus-visible:ring-primary-300/50", // Focus + + // Misc + "cursor-pointer no-underline select-none", + ], + }), + headerIcon: { + class: "inline-block mr-2", + }, + headerTitle: { + class: "leading-none", + }, + content: { + class: [ + // Spacing + "p-5", + + //Shape + "rounded-tl-none rounded-tr-none rounded-br-lg rounded-bl-lg", + "border-t-0", + + // Color + "bg-surface-0 dark:bg-surface-800", + "border border-surface-200 dark:border-surface-700", + "text-surface-700 dark:text-surface-0/80", + ], + }, + transition: { + enterFromClass: "max-h-0", + enterActiveClass: + "overflow-hidden transition-[max-height] duration-1000 ease-[cubic-bezier(0.42,0,0.58,1)]", + enterToClass: "max-h-[1000px]", + leaveFromClass: "max-h-[1000px]", + leaveActiveClass: + "overflow-hidden transition-[max-height] duration-[450ms] ease-[cubic-bezier(0,1,0,1)]", + leaveToClass: "max-h-0", + }, + }, +}; diff --git a/src/app/plugins/tailwind/components/badge.ts b/src/app/plugins/tailwind/components/badge.ts new file mode 100644 index 00000000..6886b498 --- /dev/null +++ b/src/app/plugins/tailwind/components/badge.ts @@ -0,0 +1,40 @@ +export default { + root: ({ props }) => ({ + class: [ + // Font + "font-bold", + { + "text-xs leading-[1.5rem]": props.size == null, + "text-lg leading-[2.25rem]": props.size == "large", + "text-2xl leading-[3rem]": props.size == "xlarge", + }, + + // Alignment + "text-center inline-block", + + // Size + "px-2", + { + "min-w-[1.5rem] h-[1.5rem]": props.size == null, + "min-w-[2.25rem] h-[2.25rem]": props.size == "large", + "min-w-[3rem] h-[3rem]": props.size == "xlarge", + }, + + // Shape + "rounded-full", + + // Color + "text-white", + { + "bg-primary-500 dark:bg-primary-400": + props.severity == null || props.severity == "primary", + "bg-surface-500 dark:bg-surface-400": props.severity == "secondary", + "bg-green-500 dark:bg-green-400": props.severity == "success", + "bg-blue-600 dark:bg-blue-500": props.severity == "info", + "bg-orange-500 dark:bg-orange-400": props.severity == "warning", + "bg-purple-500 dark:bg-purple-400": props.severity == "help", + "bg-red-500 dark:bg-red-400": props.severity == "danger", + }, + ], + }), +}; diff --git a/src/app/plugins/tailwind/components/button.ts b/src/app/plugins/tailwind/components/button.ts new file mode 100644 index 00000000..6cfcb88a --- /dev/null +++ b/src/app/plugins/tailwind/components/button.ts @@ -0,0 +1,459 @@ +export default { + root: ({ props, context }) => ({ + class: [ + "relative", + + // Alignments + "items-center inline-flex text-center align-bottom justify-center", + + // Sizes & Spacing + { + "px-4 py-3 leading-none": props.size === null && props.label !== null, + "text-xs py-2 px-3": props.size === "small", + "py-3 px-4": props.size === "large", + "text-xl w-full py-1": props.size === "block", + "overflow-visible": props.size === "icon", + }, + { + "p-0": props.label == null && props.size !== "icon", + "h-10 w-10": props.size === "icon", + }, + + // Shapes + { "shadow-lg": props.raised }, + { rounded: !props.rounded, "rounded-full": props.rounded }, + + // Link Button + { "text-primary-600 bg-transparent border-transparent": props.link }, + + // Plain Button + { + " bg-none border border-blue": + props.plain && !props.outlined && !props.text, + }, + // Plain Text Button + // { "text-whi": props.plain && props.text }, + // Plain Outlined Button + { + "text-surface-500 border border-gray-500": + props.plain && props.outlined, + }, + + // Text Button + { "bg-transparent border-transparent": props.text && !props.plain }, + + // Outlined Button + { "bg-transparent border": props.outlined && !props.plain }, + + // --- Severity Buttons --- + + // Primary Button + { + "text-white dark:text-surface-900": + !props.link && + props.severity === null && + !props.text && + !props.outlined && + !props.plain, + "bg-primary-500 dark:bg-primary-400": + !props.link && + props.severity === null && + !props.text && + !props.outlined && + !props.plain, + "border border-primary-500 dark:border-primary-400": + !props.link && + props.severity === null && + !props.text && + !props.outlined && + !props.plain, + }, + // Primary Text Button + { + "text-primary-500 dark:text-primary-400": + props.text && props.severity === null && !props.plain, + }, + // Primary Outlined Button + { + "text-primary-500 border border-primary-500 hover:bg-primary-300/20": + props.outlined && props.severity === null && !props.plain, + }, + + // Secondary Button + { + "text-white dark:text-surface-900": + props.severity === "secondary" && + !props.text && + !props.outlined && + !props.plain, + "bg-surface-500 dark:bg-surface-400": + props.severity === "secondary" && + !props.text && + !props.outlined && + !props.plain, + "border border-surface-500 dark:border-surface-400": + props.severity === "secondary" && + !props.text && + !props.outlined && + !props.plain, + }, + // Secondary Text Button + { + "text-surface-500 dark:text-surface-400": + props.text && props.severity === "secondary" && !props.plain, + }, + // Secondary Outlined Button + { + "text-surface-500 border border-surface-500 hover:bg-surface-300/20": + props.outlined && props.severity === "secondary" && !props.plain, + }, + + // Success Button + { + "text-white dark:text-surface-900": + props.severity === "success" && + !props.text && + !props.outlined && + !props.plain, + "bg-green-500 dark:bg-green-400": + props.severity === "success" && + !props.text && + !props.outlined && + !props.plain, + "border border-green-500 dark:border-green-400": + props.severity === "success" && + !props.text && + !props.outlined && + !props.plain, + }, + // Success Text Button + { + "text-surface-500 dark:text-surface-400": + props.text && props.severity === "secondary" && !props.plain, + }, + // Success Outlined Button + { + "text-green-500 border border-green-500 hover:bg-green-300/20": + props.outlined && props.severity === "success" && !props.plain, + }, + + // Info Button + { + "text-white dark:text-surface-900": + props.severity === "info" && + !props.text && + !props.outlined && + !props.plain, + "bg-blue-500 dark:bg-blue-400": + props.severity === "info" && + !props.text && + !props.outlined && + !props.plain, + "border border-blue-500 dark:border-blue-400": + props.severity === "info" && + !props.text && + !props.outlined && + !props.plain, + }, + // Info Text Button + { + "text-blue-500 dark:text-blue-400": + props.text && props.severity === "info" && !props.plain, + }, + // Info Outlined Button + { + "text-blue-500 border border-blue-500 hover:bg-blue-300/20 ": + props.outlined && props.severity === "info" && !props.plain, + }, + + // Warning Button + { + "text-white dark:text-surface-900": + props.severity === "warning" && + !props.text && + !props.outlined && + !props.plain, + "bg-orange-500 dark:bg-orange-400": + props.severity === "warning" && + !props.text && + !props.outlined && + !props.plain, + "border border-orange-500 dark:border-orange-400": + props.severity === "warning" && + !props.text && + !props.outlined && + !props.plain, + }, + // Warning Text Button + { + "text-orange-500 dark:text-orange-400": + props.text && props.severity === "warning" && !props.plain, + }, + // Warning Outlined Button + { + "text-orange-500 border border-orange-500 hover:bg-orange-300/20": + props.outlined && props.severity === "warning" && !props.plain, + }, + + // Help Button + { + "text-white dark:text-surface-900": + props.severity === "help" && + !props.text && + !props.outlined && + !props.plain, + "bg-purple-500 dark:bg-purple-400": + props.severity === "help" && + !props.text && + !props.outlined && + !props.plain, + "border border-purple-500 dark:border-purple-400": + props.severity === "help" && + !props.text && + !props.outlined && + !props.plain, + }, + // Help Text Button + { + "text-purple-500 dark:text-purple-400": + props.text && props.severity === "help" && !props.plain, + }, + // Help Outlined Button + { + "text-purple-500 border border-purple-500 hover:bg-purple-300/20": + props.outlined && props.severity === "help" && !props.plain, + }, + + // Danger Button + { + "text-white dark:text-surface-900": + props.severity === "danger" && + !props.text && + !props.outlined && + !props.plain, + "bg-red-500 dark:bg-red-400": + props.severity === "danger" && + !props.text && + !props.outlined && + !props.plain, + "border border-red-500 dark:border-red-400": + props.severity === "danger" && + !props.text && + !props.outlined && + !props.plain, + }, + // Danger Text Button + { + "text-red-500 dark:text-red-400": + props.text && props.severity === "danger" && !props.plain, + }, + // Danger Outlined Button + { + "text-red-500 border border-red-500 hover:bg-red-300/20": + props.outlined && props.severity === "danger" && !props.plain, + }, + + // --- Severity Button States --- + "focus:outline-none focus:outline-offset-0 focus:ring", + + // Link + { + "focus:ring-primary-400/50 dark:focus:ring-primary-300/50": props.link, + }, + + // Plain + { + "hover:bg-primary-500 hover:text-white hover:border-gray-600": + props.plain && !props.outlined && !props.text, + }, + // Text & Outlined Button + { + "hover:bg-surface-300/20": + props.plain && (props.text || props.outlined), + }, + + // Primary + { + "hover:bg-primary-400 dark:hover:bg-primary-500": + !props.link && + props.severity === null && + !props.text && + !props.outlined && + !props.plain, + }, + // { + // "focus:ring-primary-400/50 dark:focus:ring-primary-300/50": + // !props.link && + // props.severity === null && + // !props.text && + // !props.outlined && + // !props.plain, + // }, + // Text & Outlined Button + { + "hover:bg-primary-300/20": + (props.text || props.outlined) && + props.severity === null && + !props.plain, + }, + + // Secondary + { + "hover:bg-surface-600 dark:hover:bg-surface-300 hover:border-surface-600 dark:hover:border-surface-300": + props.severity === "secondary" && + !props.text && + !props.outlined && + !props.plain, + }, + { + "focus:ring-surface-400/50 dark:focus:ring-surface-300/50": + props.severity === "secondary", + }, + // Text & Outlined Button + { + "hover:bg-surface-300/20": + (props.text || props.outlined) && + props.severity === "secondary" && + !props.plain, + }, + + // Success + { + "hover:bg-green-600 dark:hover:bg-green-300 hover:border-green-600 dark:hover:border-green-300": + props.severity === "success" && + !props.text && + !props.outlined && + !props.plain, + }, + { + "focus:transparent dark:focus:transparent": + props.severity === "success", + }, + // Text & Outlined Button + { + "hover:bg-green-300/20": + (props.text || props.outlined) && + props.severity === "success" && + !props.plain, + }, + + // Info + { + "hover:bg-blue-600 dark:hover:bg-blue-300 hover:border-blue-600 dark:hover:border-blue-300": + props.severity === "info" && + !props.text && + !props.outlined && + !props.plain, + }, + { + "focus:ring-blue-400/50 dark:focus:ring-blue-300/50": + props.severity === "info", + }, + // Text & Outlined Button + { + "hover:bg-blue-300/20": + (props.text || props.outlined) && + props.severity === "info" && + !props.plain, + }, + + // Warning + { + "hover:bg-orange-600 dark:hover:bg-orange-300 hover:border-orange-600 dark:hover:border-orange-300": + props.severity === "warning" && + !props.text && + !props.outlined && + !props.plain, + }, + { + "focus:ring-orange-400/50 dark:focus:ring-orange-300/50": + props.severity === "warning", + }, + // Text & Outlined Button + { + "hover:bg-orange-300/20": + (props.text || props.outlined) && + props.severity === "warning" && + !props.plain, + }, + + // Help + { + "hover:bg-purple-600 dark:hover:bg-purple-300 hover:border-purple-600 dark:hover:border-purple-300": + props.severity === "help" && + !props.text && + !props.outlined && + !props.plain, + }, + { + "focus:ring-purple-400/50 dark:focus:ring-purple-300/50": + props.severity === "help", + }, + // Text & Outlined Button + { + "hover:bg-purple-300/20": + (props.text || props.outlined) && + props.severity === "help" && + !props.plain, + }, + + // Warning + { + "hover:bg-red-600 dark:hover:bg-red-300 hover:border-red-600 dark:hover:border-red-300": + props.severity === "danger" && + !props.text && + !props.outlined && + !props.plain, + }, + { + "focus:ring-red-400/50 dark:focus:ring-red-300/50": + props.severity === "danger", + }, + // Text & Outlined Button + { + "hover:bg-red-300/20": + (props.text || props.outlined) && + props.severity === "danger" && + !props.plain, + }, + + // Disabled + { "opacity-60 pointer-events-none cursor-default": context.disabled }, + + // Transitions + "transition duration-200 ease-in-out", + + // Misc + "cursor-pointer overflow-hidden select-none", + ], + }), + label: ({ props }) => ({ + class: [ + "duration-200", + "font-bold", + { + "hover:underline": props.link, + }, + { "flex-1": props.label !== null, "invisible w-0": props.label == null }, + ], + }), + icon: ({ props }) => ({ + class: [ + "mx-0", + { + "mr-2": props.iconPos == "left" && props.label != null, + "ml-2 order-1": props.iconPos == "right" && props.label != null, + "mb-2": props.iconPos == "top" && props.label != null, + "mt-2": props.iconPos == "bottom" && props.label != null, + }, + ], + }), + badge: ({ props }) => ({ + class: [ + { + "ml-2 w-4 h-4 leading-none flex items-center justify-center": + props.badge, + }, + ], + }), +}; diff --git a/src/app/plugins/tailwind/components/card.ts b/src/app/plugins/tailwind/components/card.ts new file mode 100644 index 00000000..98478e32 --- /dev/null +++ b/src/app/plugins/tailwind/components/card.ts @@ -0,0 +1,37 @@ +export default { + root: { + class: [ + //Shape + "rounded-md", + "shadow-md", + + //Color + "bg-surface-0 dark:bg-surface-900", + "text-surface-700 dark:text-surface-0", + ], + }, + body: { + // class: "p-1", + }, + title: { + class: "text-2xl font-bold mb-2", + }, + subtitle: { + class: [ + //Font + "font-normal", + + //Spacing + "mb-2", + + //Color + "text-surface-600 dark:text-surface-0/60", + ], + }, + content: { + // class: "py-1", // Vertical padding. + }, + footer: { + class: "pt-5", // Top padding. + }, +}; diff --git a/src/app/plugins/tailwind/components/carousel.ts b/src/app/plugins/tailwind/components/carousel.ts new file mode 100644 index 00000000..0d48452c --- /dev/null +++ b/src/app/plugins/tailwind/components/carousel.ts @@ -0,0 +1,12 @@ +export default { + content: { + class: ["p-3 flex flex-row"], + }, + container: { + class: ["flex flex-row justify-between w-full"], + }, + itemsContent: { + class: [], + }, + itemsContainer: { class: ["flex"] }, +}; diff --git a/src/app/plugins/tailwind/components/cascadeSelect.ts b/src/app/plugins/tailwind/components/cascadeSelect.ts new file mode 100644 index 00000000..d15c73f5 --- /dev/null +++ b/src/app/plugins/tailwind/components/cascadeSelect.ts @@ -0,0 +1,242 @@ +export default { + root: ({ props, state, parent }) => ({ + class: [ + // Display and Position + "inline-flex", + "relative", + + // Shape + { "rounded-md": parent.instance.$name !== "InputGroup" }, + { + "first:rounded-l-md rounded-none last:rounded-r-md": + parent.instance.$name == "InputGroup", + }, + { + "border-0 border-y border-l last:border-r": + parent.instance.$name == "InputGroup", + }, + { + "first:ml-0 ml-[-1px]": + parent.instance.$name == "InputGroup" && !props.showButtons, + }, + + // Color and Background + "bg-surface-0 dark:bg-surface-800", + + "border border-surface-300", + { "dark:border-surface-700": parent.instance.$name != "InputGroup" }, + { "dark:border-surface-600": parent.instance.$name == "InputGroup" }, + { "border-surface-300 dark:border-surface-600": !props.invalid }, + + // Invalid State + { "border-red-500 dark:border-red-400": props.invalid }, + + // Transitions + "transition-all", + "duration-200", + + // States + { + "hover:border-primary-500 dark:hover:border-primary-300": + !props.invalid, + }, + { + "outline-none outline-offset-0 ring ring-primary-400/50 dark:ring-primary-300/50": + state.focused, + }, + + // Misc + "cursor-pointer", + "select-none", + { + "opacity-60": props.disabled, + "pointer-events-none": props.disabled, + "cursor-default": props.disabled, + }, + ], + }), + label: ({ props }) => ({ + class: [ + //Font + "leading-none", + + // Flex & Alignment + " flex flex-auto", + + // Sizing and Spacing + "w-[1%]", + "p-3", + + //Shape + "rounded-none", + + // Color and Background + "bg-transparent", + "border-0", + { + "text-surface-800 dark:text-white/80": props.modelValue, + "text-surface-400 dark:text-surface-500": !props.modelValue, + }, + "placeholder:text-surface-400 dark:placeholder:text-surface-500", + + // Transitions + "transition", + "duration-200", + + // States + "focus:outline-none focus:shadow-none", + + // Misc + "relative", + "cursor-pointer", + "overflow-hidden overflow-ellipsis", + "whitespace-nowrap", + "appearance-none", + ], + }), + dropdownbutton: { + class: [ + // Flexbox + "flex items-center justify-center", + "shrink-0", + + // Color and Background + "bg-transparent", + "text-surface-500", + + // Size + "w-12", + + // Shape + "rounded-tr-md", + "rounded-br-md", + ], + }, + panel: { + class: [ + // Position + "absolute top-0 left-0", + + // Shape + "border-0 dark:border", + "rounded-md", + "shadow-md", + + // Color + "bg-surface-0 dark:bg-surface-800", + "text-surface-800 dark:text-white/80", + "dark:border-surface-800", + ], + }, + wrapper: { + class: [ + // Sizing + "max-h-[200px]", + + // Misc + "overflow-auto", + ], + }, + list: { + class: "py-0 px-0 list-none m-1", + }, + item: ({ context }) => ({ + class: [ + // Font + "font-normal", + "leading-none", + + // Shape + "rounded", + + // Spacing + "my-2 mx-1", + "py-1 px-2", + + // Colors + { + "text-surface-700 dark:text-white/80": + !context.focused && !context.active, + "bg-primary-100 dark:bg-surface-600/60 text-surface-700 dark:text-white/80": + context.focused && !context.active, + "bg-surface-100 dark:bg-surface-700 text-primary-700 dark:text-white/80": + (context.focused && context.active) || + context.active || + (!context.focused && context.active), + }, + + // Hover States + { + "hover:bg-primary-200 dark:hover:bg-surface-600/80": !context.active, + "hover:text-surface-700 hover:bg-primary-200 dark:hover:text-white dark:hover:bg-surface-600/80": + context.active, + }, + + // Transitions + "transition-shadow", + "duration-200", + + // Misc + "cursor-pointer", + "overflow-hidden", + "whitespace-nowrap", + ], + }), + content: { + class: [ + "relative", + + // Flexbox + "flex", + "items-center", + + // Spacing + // "py-3", + // "px-5", + + // Misc + "no-underline", + "overflow-hidden", + "cursor-pointer", + "select-none", + ], + }, + groupicon: { + class: [ + // Alignment + "ml-auto", + ], + }, + sublist: { + class: [ + // Size + "w-full", + + // Spacing + "list-none", + "p-1", + "m-1", + + // Shape + "shadow-none sm:shadow-md", + "border-0", + + // Position + "static sm:absolute", + "z-10", + + // Color + "bg-surface-0 dark:bg-surface-800", + ], + }, + separator: { + class: "border-t border-surface-200 dark:border-surface-600 my-1", + }, + transition: { + enterFromClass: "opacity-0 scale-y-[0.8]", + enterActiveClass: + "transition-[transform,opacity] duration-[120ms] ease-[cubic-bezier(0,0,0.2,1)]", + leaveActiveClass: "transition-opacity duration-100 ease-linear", + leaveToClass: "opacity-0", + }, +}; diff --git a/src/app/plugins/tailwind/components/checkBox.ts b/src/app/plugins/tailwind/components/checkBox.ts new file mode 100644 index 00000000..01443a32 --- /dev/null +++ b/src/app/plugins/tailwind/components/checkBox.ts @@ -0,0 +1,106 @@ +export default { + root: { + class: [ + "relative", + + // Alignment + "inline-flex", + "align-bottom", + + // Size + "w-6", + "h-6", + + // Misc + "cursor-pointer", + "select-none", + ], + }, + box: ({ props, context }) => ({ + class: [ + // Alignment + "flex", + "items-center", + "justify-center", + + // Size + "w-6", + "h-6", + + // Shape + "rounded-md", + "border-2", + + // Colors + { + "border-surface-200 bg-surface-0 dark:border-surface-700 dark:bg-surface-900": + !context.checked && !props.invalid, + "border-primary-500 bg-primary-500 dark:border-primary-400 dark:bg-primary-400": + context.checked, + }, + + // Invalid State + { "border-red-500 dark:border-red-400": props.invalid }, + + // States + { + "peer-hover:border-primary-500 dark:peer-hover:border-primary-400": + !props.disabled && !context.checked && !props.invalid, + "peer-hover:bg-primary-600 dark:peer-hover:bg-primary-300 peer-hover:border-primary-700 dark:peer-hover:border-primary-300": + !props.disabled && context.checked, + "peer-focus-visible:border-primary-500 dark:peer-focus-visible:border-primary-400 peer-focus-visible:ring-2 peer-focus-visible:ring-primary-400/20 dark:peer-focus-visible:ring-primary-300/20": + !props.disabled, + "cursor-default opacity-60": props.disabled, + }, + + // Transitions + "transition-colors", + "duration-200", + ], + }), + input: { + class: [ + "peer", + + // Size + "w-full ", + "h-full", + + // Position + "absolute", + "top-0 left-0", + "z-10", + + // Spacing + "p-0", + "m-0", + + // Shape + "opacity-0", + "rounded-md", + "outline-none", + "border-2 border-surface-200 dark:border-surface-700", + + // Misc + "appearance-none", + "cursor-pointer", + ], + }, + icon: { + class: [ + // Font + "text-base leading-none", + + // Size + "w-4", + "h-4", + + // Colors + "text-white dark:text-surface-900", + + // Transitions + "transition-all", + "duration-200", + ], + }, +}; diff --git a/src/app/plugins/tailwind/components/chip.ts b/src/app/plugins/tailwind/components/chip.ts new file mode 100644 index 00000000..3eb5c7d9 --- /dev/null +++ b/src/app/plugins/tailwind/components/chip.ts @@ -0,0 +1,42 @@ +export default { + root: { + class: [ + // Flexbox + "inline-flex items-center", + + // Spacing + "px-3 gap-2", + + // Shape + "rounded-[16px]", + + // Colors + "text-surface-700 dark:text-white/70", + "bg-surface-200 dark:bg-surface-700", + ], + }, + label: { + class: "leading-6 my-1.5 mx-0", + }, + icon: { + class: "leading-6 mr-2", + }, + image: { + class: ["w-9 h-9 -ml-3 mr-2", "rounded-full"], + }, + removeIcon: { + class: [ + // Shape + "rounded-md leading-6", + + // Size + "w-4 h-4", + + // Transition + "transition duration-200 ease-in-out", + + // Misc + "cursor-pointer", + ], + }, +}; diff --git a/src/app/plugins/tailwind/components/dataTable.ts b/src/app/plugins/tailwind/components/dataTable.ts new file mode 100644 index 00000000..dddba3f1 --- /dev/null +++ b/src/app/plugins/tailwind/components/dataTable.ts @@ -0,0 +1,426 @@ +export default { + root: ({ props }) => ({ + class: [ + "relative", + { + "flex flex-col h-full": + props.scrollable && props.scrollHeight === "flex", + }, + ], + }), + loadingoverlay: { + class: [ + "fixed w-full h-full t-0 l-0 bg-surface-100/40", + "transition duration-200", + "absolute flex items-center justify-center z-2", + "dark:bg-surface-900/40", // Dark Mode + ], + }, + loadingicon: { + class: "w-8 h-8", + }, + wrapper: ({ props }) => ({ + class: [ + { + relative: props.scrollable, + "flex flex-col grow h-full": + props.scrollable && props.scrollHeight === "flex", + }, + ], + }), + header: ({ props }) => ({ + class: [ + "text-slate-700 border-surface-200 font-bold p-4", + "dark:border-surface-700 dark:text-white/80 dark:bg-surface-800", // Dark Mode + // props.showGridlines + // ? "border-x border-t border-b-0" + // : "border-y border-x-0", + ], + }), + table: { + class: "w-full border-spacing-0", + }, + thead: ({ context }) => ({ + class: [ + { + "bg-transparent top-0 z-[1]": context.scrollable, + }, + ], + }), + tbody: ({ instance, context }) => ({ + class: [ + { + "sticky z-[1]": instance.frozenRow && context.scrollable, + }, + ], + }), + tfoot: ({ context }) => ({ + class: [ + { + "bg-slate-50 bottom-0 z-[1]": context.scrollable, + }, + ], + }), + footer: { + class: [ + "bg-slate-50 text-slate-700 border-t-0 border-b border-x-0 border-surface-200 font-bold p-4", + "dark:border-surface-700 dark:text-white/80 dark:bg-surface-800", // Dark Mode + ], + }, + column: { + filterInput: { + class: ["w-full"], + }, + headercell: ({ context, props }) => ({ + class: [ + "text-left border-0 border-b border-solid border-surface-200 dark:border-surface-700 font-bold", + "transition duration-200", + context?.size === "small" ? "p-2" : "py-2", // Size + context.sorted + ? "bg-surface-50 text-primary-700" + : "bg-transparent text-slate-700", // Sort + context.sorted + ? "dark:text-white/80 dark:bg-surface-700" + : "dark:text-white/80 dark:bg-surface-800", // Dark Mode + { + "sticky z-[1]": props.frozen || props.frozen === "", // Frozen Columns + "border-x border-y": context?.showGridlines, + "overflow-hidden space-nowrap border-y relative bg-clip-padding": + context.resizable, // Resizable + }, + ], + }), + headercontent: { + class: "flex items-center", + }, + bodycell: ({ props, context }) => ({ + class: [ + "text-left border-0 border-b border-solid border-surface-200", + context?.size === "small" + ? "p-2" + : context?.size === "large" + ? "p-5" + : "p-4", // Size + "dark:text-white/80 dark:border-surface-700", // Dark Mode + { + "sticky bg-inherit": props.frozen || props.frozen === "", // Frozen Columns + "border-x border-y": context?.showGridlines, + }, + ], + }), + footercell: ({ context }) => ({ + class: [ + "text-left border-0 border-b border-solid border-surface-200 font-bold", + "bg-slate-50 text-slate-700", + "transition duration-200", + context?.size === "small" + ? "p-2" + : context?.size === "large" + ? "p-5" + : "p-4", // Size + "dark:text-white/80 dark:bg-surface-800 dark:border-surface-700", // Dark Mode + { + "border-x border-y": context?.showGridlines, + }, + ], + }), + sorticon: ({ context }) => ({ + class: [ + "ml-2", + context.sorted + ? "text-primary-700 dark:text-white/80" + : "text-slate-700 dark:text-white/70", + ], + }), + sortbadge: { + class: [ + "flex items-center justify-center align-middle", + "rounded-[50%] w-[1.143rem] leading-[1.143rem] ml-2", + "text-primary-700 bg-primary-50", + "dark:text-white/80 dark:bg-primary-400", // Dark Mode + ], + }, + columnfilter: { + class: "flex flex-row justify-stretch", + }, + filteroverlay: { + class: [ + "bg-surface-0 text-surface-600 border-0 rounded-md min-w-[12.5rem]", + "dark:bg-surface-800 dark:border-surface-700 dark:text-white/80", //Dark Mode + ], + }, + filtermatchmodedropdown: { + root: { + class: "min-[0px]:flex mb-2", + }, + }, + filterrowitems: { + class: "m-0 p-0 py-3 list-none", + }, + filterrowitem: ({ context }) => ({ + class: [ + "m-0 py-3 px-5 bg-transparent", + "transition duration-200", + context?.highlighted + ? "text-primary-700 bg-primary-100 dark:text-white/80 dark:bg-primary-300" + : "text-surface-600 bg-transparent dark:text-white/80 dark:bg-transparent", + ], + }), + filteroperator: { + class: [ + "px-5 py-3 border-b border-solid border-surface-200 text-slate-700 bg-slate-50 rounded-t-md", + "dark:border-surface-700 dark:text-white/80 dark:bg-surface-800", // Dark Mode + ], + }, + filteroperatordropdown: { + root: { + class: "min-[0px]:flex", + }, + }, + filterconstraint: { + class: + "p-5 border-b border-solid border-surface-200 dark:border-surface-700", + }, + filteraddrule: { + class: "py-3 px-5", + }, + filteraddrulebutton: { + root: { + class: "justify-center w-full min-[0px]:text-sm", + }, + label: { + class: "flex-auto grow-0", + }, + icon: { + class: "mr-2", + }, + }, + filterremovebutton: { + root: { + class: "ml-2", + }, + label: { + class: "grow-0", + }, + }, + filterbuttonbar: { + class: "flex items-center justify-between p-5", + }, + filterclearbutton: { + root: { + class: + "w-auto min-[0px]:text-sm border-primary-500 text-primary-500 px-4 py-3", + }, + }, + filterapplybutton: { + root: { + class: "w-auto min-[0px]:text-sm px-4 py-3", + }, + }, + filtermenubutton: ({ context }) => ({ + class: [ + "inline-flex justify-center items-center cursor-pointer no-underline overflow-hidden relative ml-2", + "w-8 h-8 rounded-[50%]", + "transition duration-200", + "hover:text-slate-700 hover:bg-surface-300/20", // Hover + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50", // Focus + "dark:text-white/70 dark:hover:text-white/80 dark:bg-surface-800", // Dark Mode + { + "bg-primary-50 text-primary-700": context.active, + }, + ], + }), + headerfilterclearbutton: ({ context }) => ({ + class: [ + "inline-flex justify-center items-center cursor-pointer no-underline overflow-hidden relative", + "text-left bg-transparent m-0 p-0 border-none select-none ml-2", + { + invisible: !context.hidden, + }, + ], + }), + columnresizer: { + class: + "block absolute top-0 right-0 m-0 w-2 h-full p-0 cursor-col-resize border border-transparent", + }, + rowreordericon: { + class: "cursor-move", + }, + roweditorinitbutton: { + class: [ + "inline-flex items-center justify-center overflow-hidden relative", + "text-left cursor-pointer select-none", + "w-8 h-8 border-0 rounded-[50%]", + "transition duration-200", + "text-slate-700 border-transparent", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50", //Focus + "hover:text-slate-700 hover:bg-surface-300/20", //Hover + "dark:text-white/70", // Dark Mode + ], + }, + roweditorsavebutton: { + class: [ + "inline-flex items-center justify-center overflow-hidden relative", + "text-left cursor-pointer select-none", + "w-8 h-8 border-0 rounded-[50%]", + "transition duration-200", + "text-slate-700 border-transparent", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50", //Focus + "hover:text-slate-700 hover:bg-surface-300/20", //Hover + "dark:text-white/70", // Dark Mode + ], + }, + roweditorcancelbutton: { + class: [ + "inline-flex items-center justify-center overflow-hidden relative", + "text-left cursor-pointer select-none", + "w-8 h-8 border-0 rounded-[50%]", + "transition duration-200", + "text-slate-700 border-transparent", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50", //Focus + "hover:text-slate-700 hover:bg-surface-300/20", //Hover + "dark:text-white/70", // Dark Mode + ], + }, + radiobuttonwrapper: { + class: [ + "relative inline-flex cursor-pointer select-none align-bottom", + "w-6 h-6", + ], + }, + radiobutton: ({ context }) => ({ + class: [ + "flex justify-center items-center", + "border-2 w-6 h-6 text-surface-700 rounded-full transition duration-200 ease-in-out", + context.checked + ? "border-primary-500 bg-primary-500 dark:border-primary-400 dark:bg-primary-400" + : "border-surface-200 bg-surface-0 dark:border-surface-700 dark:bg-surface-800", + { + "hover:border-primary-500 dark:hover:border-primary-400 focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 ring-inset dark:focus:ring-primary-300/50": + !context.disabled, + "cursor-default opacity-60": context.disabled, + }, + ], + }), + radiobuttonicon: ({ context }) => ({ + class: [ + "transform rounded-full", + "block w-3 h-3 transition duration-200 bg-surface-0 dark:bg-surface-800", + { + "backface-hidden scale-10 invisible": context.checked === false, + "transform scale-100 visible": context.checked === true, + }, + ], + }), + headercheckboxwrapper: { + class: [ + "cursor-pointer inline-flex relative select-none align-bottom", + "w-6 h-6", + ], + }, + headercheckbox: ({ context }) => ({ + class: [ + "flex items-center justify-center", + "border-2 w-6 h-6 text-surface-600 rounded-lg transition-colors duration-200", + context.checked + ? "border-primary-500 bg-primary-500 dark:border-primary-400 dark:bg-primary-400" + : "border-surface-200 bg-surface-0 dark:border-surface-700 dark:bg-surface-800", + { + "hover:border-primary-500 dark:hover:border-primary-400 focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 ring-inset dark:focus:ring-primary-300/50": + !context.disabled, + "cursor-default opacity-60": context.disabled, + }, + ], + }), + headercheckboxicon: { + class: + "w-4 h-4 transition-all duration-200 text-white text-base dark:text-surface-900", + }, + checkboxwrapper: { + class: [ + "cursor-pointer inline-flex relative select-none align-bottom", + "w-6 h-6", + ], + }, + checkbox: ({ context }) => ({ + class: [ + "flex items-center justify-center", + "border-2 w-6 h-6 text-surface-600 rounded-lg transition-colors duration-200", + context.checked + ? "border-primary-500 bg-primary-500 dark:border-primary-400 dark:bg-primary-400" + : "border-surface-200 bg-surface-0 dark:border-surface-700 dark:bg-surface-800", + { + "hover:border-primary-500 dark:hover:border-primary-400 focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 ring-inset dark:focus:ring-primary-300/50": + !context.disabled, + "cursor-default opacity-60": context.disabled, + }, + ], + }), + checkboxicon: { + class: + "w-4 h-4 transition-all duration-200 text-white text-base dark:text-surface-900", + }, + transition: { + enterFromClass: "opacity-0 scale-y-[0.8]", + enterActiveClass: + "transition-[transform,opacity] duration-[120ms] ease-[cubic-bezier(0,0,0.2,1)]", + leaveActiveClass: "transition-opacity duration-100 ease-linear", + leaveToClass: "opacity-0", + }, + }, + bodyrow: ({ context }) => ({ + class: [ + context.selected + ? "bg-primary-50 text-primary-700 dark:bg-primary-300" + : "bg-surface-0 text-surface-600 dark:bg-surface-800", + context.stripedRows + ? context.index % 2 === 0 + ? "bg-surface-0 text-surface-600 dark:bg-surface-800" + : "bg-primary-100/50 text-surface-600 dark:bg-surface-800" + : "", + "transition duration-200", + "focus:outline focus:outline-[0.15rem] focus:outline-primary-200 focus:outline-offset-[-0.15rem]", // Focus + "dark:text-white/80 dark:focus:outline dark:focus:outline-[0.15rem] dark:focus:outline-primary-300 dark:focus:outline-offset-[-0.15rem]", // Dark Mode + { + "cursor-pointer": context.selectable, + "hover:bg-surface-300/20 hover:text-surface-600": + context.selectable && !context.selected, // Hover + }, + ], + }), + rowexpansion: { + class: + "bg-surface-0 text-surface-600 dark:bg-surface-800 dark:text-white/80", + }, + rowgroupheader: { + class: [ + "sticky z-[1]", + "bg-surface-0 text-surface-600", + "dark:bg-surface-800", + "transition duration-200", + ], + }, + rowgroupfooter: { + class: [ + "sticky z-[1]", + "bg-surface-0 text-surface-600", + "dark:bg-surface-800", + "transition duration-200", + ], + }, + rowgrouptoggler: { + class: [ + "text-left m-0 p-0 cursor-pointer select-none", + "inline-flex items-center justify-center overflow-hidden relative", + "w-8 h-8 text-surface-500 border-0 bg-transparent rounded-[50%]", + "transition duration-200", + "dark:text-white/70", // Dark Mode + ], + }, + rowgrouptogglericon: { + class: "inline-block w-4 h-4", + }, + resizehelper: { + class: "absolute hidden w-px z-10 bg-primary-500 dark:bg-primary-300", + }, +}; diff --git a/src/app/plugins/tailwind/components/dialog.ts b/src/app/plugins/tailwind/components/dialog.ts new file mode 100644 index 00000000..cc1b6ea3 --- /dev/null +++ b/src/app/plugins/tailwind/components/dialog.ts @@ -0,0 +1,245 @@ +export default { + root: ({ state }) => ({ + class: [ + // Shape + "rounded-md", + "shadow-lg", + "border-0", + + // Size + "max-h-[90vh]", + "m-0", + + // Color + "dark:border", + "dark:border-surface-700", + + // Transitions + "transform", + "scale-100", + + // Maximized State + { + "transition-none": state.maximized, + "transform-none": state.maximized, + "!w-screen": state.maximized, + "!h-screen": state.maximized, + "!max-h-full": state.maximized, + "!top-0": state.maximized, + "!left-0": state.maximized, + }, + ], + }), + header: { + class: [ + // Flexbox and Alignment + "shrink-0", + "text-center", + + // Spacing + "p-3", + + // Shape + "border-t-0", + "rounded-tl-md", + "rounded-tr-md", + + // Colors + "bg-primary-500 dark:bg-primary-400", + "text-white dark:text-surface-0/80", + ], + }, + title: { + class: ["font-bold text-lg text-center uppercase"], + }, + icons: { + class: ["flex items-center"], + }, + closeButton: { + class: ["hidden"], + // class: [ + // "relative", + // + // // Flexbox and Alignment + // "flex items-center justify-center", + // + // // Size and Spacing + // "mr-2", + // "last:mr-0", + // "w-8 h-8", + // + // // Shape + // "border-0", + // "rounded-full", + // + // // Colors + // "text-surface-500", + // "bg-transparent", + // + // // Transitions + // "transition duration-200 ease-in-out", + // + // // States + // "hover:text-surface-700 dark:hover:text-white/80", + // "hover:bg-surface-100 dark:hover:bg-surface-800/80", + // "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-inset", + // "focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + // + // // Misc + // "overflow-hidden", + // ], + }, + maximizablebutton: { + class: [ + "relative", + + // Flexbox and Alignment + "flex items-center justify-center", + + // Size and Spacing + "mr-2", + "last:mr-0", + "w-8 h-8", + + // Shape + "border-0", + "rounded-full", + + // Colors + "text-surface-500", + "bg-transparent", + + // Transitions + "transition duration-200 ease-in-out", + + // States + "hover:text-surface-700 dark:hover:text-white/80", + "hover:bg-surface-100 dark:hover:bg-surface-800/80", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-inset", + "focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + + // Misc + "overflow-hidden", + ], + }, + closeButtonIcon: { + class: [ + // Display + "inline-block", + + // Size + "w-4", + "h-4", + ], + }, + maximizableicon: { + class: [ + // Display + "inline-block", + + // Size + "w-4", + "h-4", + ], + }, + content: ({ state, instance }) => ({ + class: [ + // Spacing + "h-full", + "p-1", + + // Shape + { + grow: state.maximized, + "rounded-bl-md": !instance.$slots.footer, + "rounded-br-md": !instance.$slots.footer, + }, + + // Colors + "bg-surface-0 dark:bg-surface-800", + "text-surface-700 dark:text-surface-0/80", + + // Misc + "overflow-y-auto", + ], + }), + footer: { + class: [ + // Flexbox and Alignment + "flex items-center justify-end", + "shrink-0", + "text-right", + "gap-2", + + // Spacing + "px-6", + "pb-6", + + // Shape + "border-t-0", + "rounded-b-md", + + // Colors + "bg-surface-0 dark:bg-surface-800", + "text-surface-700 dark:text-surface-0/80", + ], + }, + mask: ({ props, state }) => ({ + class: [ + // Transitions + "transition", + "duration-200", + { "p-5": !state.maximized }, + + // Background and Effects + { "bg-black/40": props.modal, "backdrop-blur-sm": props.modal }, + ], + }), + transition: ({ props }) => { + return props.position === "top" + ? { + enterFromClass: + "opacity-0 scale-75 translate-x-0 -translate-y-full translate-z-0", + enterActiveClass: "transition-all duration-200 ease-out", + leaveActiveClass: "transition-all duration-200 ease-out", + leaveToClass: + "opacity-0 scale-75 translate-x-0 -translate-y-full translate-z-0", + } + : props.position === "bottom" + ? { + enterFromClass: "opacity-0 scale-75 translate-y-full", + enterActiveClass: "transition-all duration-200 ease-out", + leaveActiveClass: "transition-all duration-200 ease-out", + leaveToClass: + "opacity-0 scale-75 translate-x-0 translate-y-full translate-z-0", + } + : props.position === "left" || + props.position === "topleft" || + props.position === "bottomleft" + ? { + enterFromClass: + "opacity-0 scale-75 -translate-x-full translate-y-0 translate-z-0", + enterActiveClass: "transition-all duration-200 ease-out", + leaveActiveClass: "transition-all duration-200 ease-out", + leaveToClass: + "opacity-0 scale-75 -translate-x-full translate-y-0 translate-z-0", + } + : props.position === "right" || + props.position === "topright" || + props.position === "bottomright" + ? { + enterFromClass: + "opacity-0 scale-75 translate-x-full translate-y-0 translate-z-0", + enterActiveClass: "transition-all duration-200 ease-out", + leaveActiveClass: "transition-all duration-200 ease-out", + leaveToClass: + "opacity-0 scale-75 opacity-0 scale-75 translate-x-full translate-y-0 translate-z-0", + } + : { + enterFromClass: "opacity-0 scale-75", + enterActiveClass: "transition-all duration-200 ease-out", + leaveActiveClass: "transition-all duration-200 ease-out", + leaveToClass: "opacity-0 scale-75", + }; + }, +}; diff --git a/src/app/plugins/tailwind/components/divider.ts b/src/app/plugins/tailwind/components/divider.ts new file mode 100644 index 00000000..e384132a --- /dev/null +++ b/src/app/plugins/tailwind/components/divider.ts @@ -0,0 +1,72 @@ +export default { + root: ({ props }) => ({ + class: [ + // Flex and Position + "flex relative", + { "justify-center": props.layout == "vertical" }, + { "items-center": props.layout == "vertical" }, + { + "justify-start": props?.align == "left" && props.layout == "horizontal", + "justify-center": + props?.align == "center" && props.layout == "horizontal", + "justify-end": props?.align == "right" && props.layout == "horizontal", + "items-center": props?.align == "top" && props.layout == "vertical", + "items-start": props?.align == "center" && props.layout == "vertical", + "items-end": props?.align == "bottom" && props.layout == "vertical", + }, + + // Spacing + { + "my-5 mx-0 py-0 px-5": props.layout == "horizontal", + "mx-4 md:mx-5 py-5": props.layout == "vertical", + }, + + // Size + { + "w-full": props.layout == "horizontal", + "min-h-full": props.layout == "vertical", + }, + + // Before: Line + "before:block", + + // Position + { + "before:absolute before:left-0 before:top-1/2": + props.layout == "horizontal", + "before:absolute before:left-1/2 before:top-0 before:transform before:-translate-x-1/2": + props.layout == "vertical", + }, + + // Size + { + "before:w-full": props.layout == "horizontal", + "before:min-h-full": props.layout == "vertical", + }, + + // Shape + { + "before:border-solid": props.type == "solid", + "before:border-dotted": props.type == "dotted", + "before:border-dashed": props.type == "dashed", + }, + + // Color + { + "before:border-t before:border-surface-200 before:dark:border-surface-600": + props.layout == "horizontal", + "before:border-l before:border-surface-200 before:dark:border-surface-600": + props.layout == "vertical", + }, + ], + }), + content: { + class: [ + // Space and Position + "px-1 z-10", + + // Color + "bg-surface-0 dark:bg-surface-800", + ], + }, +}; diff --git a/src/app/plugins/tailwind/components/dropdown.ts b/src/app/plugins/tailwind/components/dropdown.ts new file mode 100644 index 00000000..652865fe --- /dev/null +++ b/src/app/plugins/tailwind/components/dropdown.ts @@ -0,0 +1,314 @@ +export default { + root: ({ props, state, parent }) => ({ + class: [ + // Display and Position + "inline-flex", + "relative", + + // Shape + { "rounded-md": parent.instance.$name !== "InputGroup" }, + { + "first:rounded-l-md rounded-none last:rounded-r-md": + parent.instance.$name == "InputGroup", + }, + { + "border-0 border-y border-l last:border-r": + parent.instance.$name == "InputGroup", + }, + { + "first:ml-0 ml-[-1px]": + parent.instance.$name == "InputGroup" && !props.showButtons, + }, + + // Color and Background + "bg-surface-0 dark:bg-surface-800", + + "border border-surface-300", + { "dark:border-surface-700": parent.instance.$name != "InputGroup" }, + { "dark:border-surface-600": parent.instance.$name == "InputGroup" }, + { "border-surface-300 dark:border-surface-600": !props.invalid }, + + // Invalid State + { "border-red-500 dark:border-red-400": props.invalid }, + + // Transitions + "transition-all", + "duration-200", + + // States + { + "hover:border-primary-500 dark:hover:border-primary-300": + !props.invalid, + }, + { + "outline-none outline-offset-0 ring ring-primary-400/50 dark:ring-primary-300/50": + state.focused, + }, + + // Misc + "cursor-pointer", + "select-none", + { + "opacity-60": props.disabled, + "pointer-events-none": props.disabled, + "cursor-default": props.disabled, + }, + ], + }), + input: ({ props }) => ({ + class: [ + //Font + "font-sans", + "leading-none", + + // Display + "block", + "flex-auto", + + // Color and Background + "bg-transparent", + "border-0", + { + "text-surface-800 dark:text-white/80": props.modelValue != undefined, + "text-surface-400 dark:text-surface-500": props.modelValue == undefined, + }, + "placeholder:text-surface-400 dark:placeholder:text-surface-500", + + // Sizing and Spacing + "w-[1%]", + "p-3", + { "pr-7": props.showClear }, + + //Shape + "rounded-sm", + + // Transitions + "transition", + "duration-200", + + // States + "focus:outline-none focus:shadow-none", + + // Misc + "relative", + "cursor-pointer", + "overflow-hidden overflow-ellipsis", + "whitespace-nowrap", + "appearance-none", + ], + }), + trigger: { + class: [ + // Flexbox + "flex items-center justify-center", + "shrink-0", + + // Color and Background + "bg-transparent", + "text-surface-500", + + // Size + "w-12", + + // Shape + "rounded-tr-md", + "rounded-br-md", + ], + }, + panel: { + class: [ + // Position + "absolute top-0 left-0", + + // Shape + "border-0 dark:border", + "rounded-md", + "shadow-md", + + // Color + "bg-surface-0 dark:bg-surface-800", + "text-surface-800 dark:text-white/80", + "dark:border-surface-700", + ], + }, + wrapper: { + class: [ + // Sizing + "max-h-[200px]", + + // Misc + "overflow-auto", + ], + }, + list: { + class: "py-0 px-0 list-none m-1", + }, + item: ({ context }) => ({ + class: [ + // Font + "font-normal", + "leading-none", + + // Position + "relative", + + // Shape + "rounded", + + // Spacing + "my-2 mx-1", + "py-1 px-2", + + // Color + { + "text-surface-700 dark:text-white/80": + !context.focused && !context.selected && !context.disabled, + }, + { + "text-surface-600 dark:text-white/70": + !context.focused && !context.selected && context.disabled, + }, + { + "bg-primary-100 dark:bg-surface-600/60 text-surface-700 dark:text-white/80": + context.focused && !context.selected, + }, + { + "bg-surface-100 dark:bg-surface-700 text-primary-700 dark:text-white/80": + context.focused && context.selected, + }, + { + "bg-surface-100 dark:bg-surface-700 text-primary-700 dark:text-white/80": + !context.focused && context.selected, + }, + + //States + { + "hover:bg-primary-200 dark:hover:bg-surface-600/80": + !context.focused && !context.selected, + }, + { + "hover:text-surface-700 hover:bg-primary-200 dark:hover:text-white dark:hover:bg-surface-600/80": + context.focused && !context.selected, + }, + "focus-visible:outline-none focus-visible:outline-offset-0 focus-visible:ring focus-visible:ring-inset focus-visible:ring-primary-400/50 dark:focus-visible:ring-primary-300/50", + + // Transitions + "transition-shadow", + "duration-200", + + // Misc + { "pointer-events-none cursor-default": context.disabled }, + { "cursor-pointer": !context.disabled }, + "overflow-hidden", + "whitespace-nowrap", + ], + }), + itemgroup: { + class: [ + //Font + "font-bold", + + // Spacing + "m-0", + "py-3 px-5", + + // Color + "text-surface-800 dark:text-white/80", + "bg-surface-0 dark:bg-surface-600/80", + + // Misc + "cursor-auto", + ], + }, + emptymessage: { + class: [ + // Font + "leading-none", + + // Spacing + "py-3 px-5", + + // Color + "text-surface-800 dark:text-white/80", + "bg-transparent", + ], + }, + header: { + class: [ + // Spacing + "py-3 px-5", + "m-0", + + //Shape + "border-b", + "rounded-tl-md", + "rounded-tr-md", + + // Color + "text-surface-700 dark:text-white/80", + "bg-surface-100 dark:bg-surface-800", + "border-surface-300 dark:border-surface-700", + ], + }, + filtercontainer: { + class: "relative", + }, + filterinput: { + class: [ + // Font + "font-sans", + "leading-none", + + // Sizing + "pr-7 py-3 px-3", + "-mr-7", + "w-full", + + //Color + "text-surface-700 dark:text-white/80", + "bg-surface-0 dark:bg-surface-900", + "border-surface-200 dark:border-surface-700", + + // Shape + "border", + "rounded-lg", + "appearance-none", + + // Transitions + "transition", + "duration-200", + + // States + "hover:border-primary-500 dark:hover:border-primary-300", + "focus:ring focus:outline-none focus:outline-offset-0", + "focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + + // Misc + "appearance-none", + ], + }, + filtericon: { + class: ["absolute", "top-1/2 right-3", "-mt-2"], + }, + clearicon: { + class: [ + // Color + "text-surface-500", + + // Position + "absolute", + "top-1/2", + "right-12", + + // Spacing + "-mt-2", + ], + }, + transition: { + enterFromClass: "opacity-0 scale-y-[0.8]", + enterActiveClass: + "transition-[transform,opacity] duration-[120ms] ease-[cubic-bezier(0,0,0.2,1)]", + leaveActiveClass: "transition-opacity duration-100 ease-linear", + leaveToClass: "opacity-0", + }, +}; diff --git a/src/app/plugins/tailwind/components/floatLabel.ts b/src/app/plugins/tailwind/components/floatLabel.ts new file mode 100644 index 00000000..cbb8f0d5 --- /dev/null +++ b/src/app/plugins/tailwind/components/floatLabel.ts @@ -0,0 +1,26 @@ +export default { + root: { + class: [ + "block relative", + + // Base Label Appearance + "[&>*:last-child]:text-surface-900/60 dark:[&>*:last-child]:text-white/60", + "[&>*:last-child]:absolute", + "[&>*:last-child]:top-[-10px]", + "[&>*:last-child]:-translate-y-1/2", + "[&>*:last-child]:left-3", + "[&>*:last-child]:pointer-events-none", + "[&>*:last-child]:transition-all", + "[&>*:last-child]:duration-200", + "[&>*:last-child]:ease", + + // Focus Label Appearance + "[&>*:last-child]:has-[:focus]:-top-3", + "[&>*:last-child]:has-[:focus]:text-sm", + + // Filled Input Label Appearance + "[&>*:last-child]:has-[.filled]:-top-3", + "[&>*:last-child]:has-[.filled]:text-sm", + ], + }, +}; diff --git a/src/app/plugins/tailwind/components/inputGroup.ts b/src/app/plugins/tailwind/components/inputGroup.ts new file mode 100644 index 00000000..355e69a2 --- /dev/null +++ b/src/app/plugins/tailwind/components/inputGroup.ts @@ -0,0 +1,5 @@ +export default { + root: { + class: ["flex items-stretch"], + }, +}; diff --git a/src/app/plugins/tailwind/components/inputGroupAddon.ts b/src/app/plugins/tailwind/components/inputGroupAddon.ts new file mode 100644 index 00000000..a7448421 --- /dev/null +++ b/src/app/plugins/tailwind/components/inputGroupAddon.ts @@ -0,0 +1,28 @@ +export default { + root: { + class: [ + // Flex + "flex items-center justify-center", + + // Shape + "first:rounded-l-md", + "last:rounded-r-md", + "border-y", + + "last:border-r", + "border-l", + "border-r-0", + + // Space + "p-3", + + // Size + "min-w-[3rem]", + + // Color + "bg-surface-50 dark:bg-surface-800", + "text-surface-600 dark:text-surface-400", + "border-surface-300 dark:border-surface-600", + ], + }, +}; diff --git a/src/app/plugins/tailwind/components/inputSwitch.ts b/src/app/plugins/tailwind/components/inputSwitch.ts new file mode 100644 index 00000000..9bee6546 --- /dev/null +++ b/src/app/plugins/tailwind/components/inputSwitch.ts @@ -0,0 +1,101 @@ +export default { + root: ({ props }) => ({ + class: [ + // Alignments + "inline-flex relative", + "flex-shrink-0", + + // Size + "h-5 w-10", + + // States + "focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-gray-900", + { + "opacity-60 select-none pointer-events-none cursor-default": + props.disabled, + }, + ], + }), + slider: ({ props }) => ({ + class: [ + // Position + "absolute top-0 left-0 right-0 bottom-0", + { + "before:transform before:translate-x-5": + props.modelValue == props.trueValue, + }, + + // Shape + "rounded-2xl", + + // Before: + "before:absolute before:top-1/2", + "before:-mt-2", + "before:h-4 before:w-4", + "before:rounded-full", + "before:transition-duration-200 before:transition before:ease-in-out", + "before:bg-surface-0 before:dark:bg-surface-900", + "before:shadow", + { "before:transform before:translate-x-4": props.modelValue }, + + // Colors + "border", + { + "bg-surface-200 dark:bg-surface-700": !( + props.modelValue == props.trueValue + ), + "bg-primary-500 dark:bg-primary-400": + props.modelValue == props.trueValue, + }, + + { "border-transparent": !props.invalid }, + + // Invalid State + { "border-red-500 dark:border-red-400": props.invalid }, + + // States + { + "peer-hover:bg-surface-300 dark:peer-hover:bg-surface-600 ": + !(props.modelValue == props.trueValue) && !props.disabled, + }, + { + "peer-hover:bg-primary-600 dark:peer-hover:bg-surface-300 ": + props.modelValue == props.trueValue && !props.disabled, + }, + "peer-focus-visible:ring peer-focus-visible:ring-primary-400/50 dark:peer-focus-visible:ring-primary-300/50", + + // Transition + "transition-colors duration-200", + + // Misc + "cursor-pointer", + ], + }), + input: { + class: [ + "peer", + + // Size + "w-full ", + "h-full", + + // Position + "absolute", + "top-0 left-0", + "z-10", + + // Spacing + "p-0", + "m-0", + + // Shape + "opacity-0", + "rounded-[2.5rem]", + "outline-none", + + // Misc + "appearance-none", + "cursor-pointer", + ], + }, +}; diff --git a/src/app/plugins/tailwind/components/inputText.ts b/src/app/plugins/tailwind/components/inputText.ts new file mode 100644 index 00000000..8c84b25d --- /dev/null +++ b/src/app/plugins/tailwind/components/inputText.ts @@ -0,0 +1,63 @@ +export default { + root: ({ props, context, parent }) => ({ + class: [ + // Font + "font-sans leading-none", + + // Flex + { "flex-1 w-[1%]": parent.instance.$name == "InputGroup" }, + + // Spacing + "m-0", + { + "px-4 py-4": props.size == "large", + "px-2 py-2": props.size == "small", + "p-3": props.size == null, + }, + + // Shape + { "rounded-md": parent.instance.$name !== "InputGroup" }, + { + "first:rounded-l-md rounded-none last:rounded-r-md": + parent.instance.$name == "InputGroup", + }, + { + "border-0 border-y border-l last:border-r": + parent.instance.$name == "InputGroup", + }, + { + "first:ml-0 -ml-px": + parent.instance.$name == "InputGroup" && !props.showButtons, + }, + + // Colors + "text-surface-800 dark:text-white/80", + "placeholder:text-surface-400 dark:placeholder:text-surface-500", + "bg-surface-0 dark:bg-surface-800", + "border", + { "border-surface-300 dark:border-surface-600": !props.invalid }, + + // Invalid State + "invalid:focus:ring-red-200", + "invalid:hover:border-red-500", + { "border-red-500 dark:border-red-400": props.invalid }, + + // States + { + "hover:border-primary-500 dark:hover:border-primary-400": + !context.disabled && !props.invalid, + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-500/50 dark:focus:ring-primary-400/50 focus:z-10": + !context.disabled, + "opacity-60 select-none pointer-events-none cursor-default": + context.disabled, + }, + + // Filled State *for FloatLabel + { filled: parent.instance?.$name == "FloatLabel" && context.filled }, + + // Misc + "appearance-none", + "transition-colors duration-200", + ], + }), +}; diff --git a/src/app/plugins/tailwind/components/menu.ts b/src/app/plugins/tailwind/components/menu.ts new file mode 100644 index 00000000..c6236c7f --- /dev/null +++ b/src/app/plugins/tailwind/components/menu.ts @@ -0,0 +1,99 @@ +export default { + root: { + class: [ + // Sizing and Shape + "min-w-[12rem]", + "rounded-md", + // Spacing + "py-2", + // Colors + "bg-surface-0 dark:bg-surface-700", + "text-surface-700 dark:text-white/80", + "border border-surface-200 dark:border-surface-700", + ], + }, + menu: { + class: [ + // Spacings and Shape + "list-none", + "m-0", + "p-0", + "outline-none", + ], + }, + content: ({ context }) => ({ + class: [ + //Shape + "rounded-none", + "p-2", + // Colors + "text-surface-700 dark:text-white/80", + { + "bg-surface-200 text-surface-700 dark:bg-surface-300/10 dark:text-white": + context.focused, + }, + // Transitions + "transition-shadow", + "duration-200", + // States + "hover:text-surface-700 dark:hover:text-white/80", + "hover:bg-surface-100 dark:bg-surface-700 dark:hover:bg-surface-400/10", + ], + }), + action: { + class: [ + "relative", + // Flexbox + + "flex", + "items-center", + + // Spacing + "py-3", + "px-5", + + // Color + "text-surface-700 dark:text-white/80", + + // Misc + "no-underline", + "overflow-hidden", + "cursor-pointer", + "select-none", + ], + }, + icon: { + class: [ + // Spacing + "mr-2", + + // Color + "text-surface-600 dark:text-white/70", + ], + }, + label: { + class: ["leading-none"], + }, + submenuheader: { + class: [ + // Font + "font-bold", + // Spacing + "m-0", + "py-3 px-5", + // Shape + "rounded-tl-none", + "rounded-tr-none", + // Colors + "bg-surface-0 dark:bg-surface-700", + "text-surface-700 dark:text-white", + ], + }, + transition: { + enterFromClass: "opacity-0 scale-y-[0.8]", + enterActiveClass: + "transition-[transform,opacity] duration-[120ms] ease-[cubic-bezier(0,0,0.2,1)]", + leaveActiveClass: "transition-opacity duration-100 ease-linear", + leaveToClass: "opacity-0", + }, +}; diff --git a/src/app/plugins/tailwind/components/message.ts b/src/app/plugins/tailwind/components/message.ts new file mode 100644 index 00000000..b94db983 --- /dev/null +++ b/src/app/plugins/tailwind/components/message.ts @@ -0,0 +1,88 @@ +export default { + root: ({ props }) => ({ + class: [ + // Spacing and Shape + "my-4 mx-0", + "rounded-md", + + // Colors + { + "bg-blue-100/70 dark:bg-blue-500/20": props.severity == "info", + "bg-green-100/70 dark:bg-green-500/20": props.severity == "success", + "bg-orange-100/70 dark:bg-orange-500/20": props.severity == "warn", + "bg-red-500 dark:bg-red-700": props.severity == "error", + }, + { + "border-blue-500 dark:border-blue-400": props.severity == "info", + "border-green-500 dark:border-green-400": props.severity == "success", + "border-orange-500 dark:border-orange-400": props.severity == "warn", + "border-red-500 dark:border-red-400": props.severity == "error", + }, + { + "text-blue-700 dark:text-blue-300": props.severity == "info", + "text-green-700 dark:text-green-300": props.severity == "success", + "text-orange-700 dark:text-orange-300": props.severity == "warn", + "text-white": props.severity == "error", + }, + ], + }), + wrapper: { + class: [ + // Flexbox + "flex items-center", + + // Spacing + "py-5 px-7", + ], + }, + icon: { + class: [ + // Sizing and Spacing + "w-8 h-8", + "text-lg leading-none mr-2 shrink-0", + ], + }, + text: { + class: [ + // Font and Text + "text-base leading-none", + "w-full", + "font-medium", + "rounded-b-md", + ], + }, + button: { + class: [ + // Flexbox + "flex items-center justify-center", + + // Size + "w-8 h-8", + + // Spacing and Misc + "ml-auto relative", + + // Shape + "rounded-full", + + // Colors + "bg-transparent", + + // Transitions + "transition duration-200 ease-in-out", + + // States + "hover:bg-surface-0/50 dark:hover:bg-surface-0/10", + + // Misc + "overflow-hidden", + ], + }, + transition: { + enterFromClass: "opacity-0", + enterActiveClass: "transition-opacity duration-300", + leaveFromClass: "max-h-40", + leaveActiveClass: "overflow-hidden transition-all duration-300 ease-in", + leaveToClass: "max-h-0 opacity-0 !m-0", + }, +}; diff --git a/src/app/plugins/tailwind/components/multiSelect.ts b/src/app/plugins/tailwind/components/multiSelect.ts new file mode 100644 index 00000000..e3c5027d --- /dev/null +++ b/src/app/plugins/tailwind/components/multiSelect.ts @@ -0,0 +1,593 @@ +export default { + root: ({ props, state }) => ({ + class: [ + // Display and Position + "inline-flex", + "relative", + + // Shape + "rounded-md", + + // Color and Background + "bg-surface-0 dark:bg-surface-800", + "border", + { "border-surface-300 dark:border-surface-600": !props.invalid }, + + // Invalid State + { "border-red-500 dark:border-red-400": props.invalid }, + + // Transitions + "transition-all", + "duration-200", + + // States + { + "hover:border-primary-500 dark:hover:border-primary-300": + !props.invalid, + }, + { + "outline-none outline-offset-0 ring ring-primary-400/50 dark:ring-primary-300/50": + state.focused, + }, + + // Misc + "cursor-pointer", + "select-none", + { + "opacity-60": props.disabled, + "pointer-events-none": props.disabled, + "cursor-default": props.disabled, + }, + ], + }), + labelContainer: { + class: "overflow-hidden flex flex-auto cursor-pointer ", + }, + label: ({ props }) => ({ + class: [ + "leading-none", + "block ", + + // Spacing + { + "p-3": props.display !== "chip", + "py-3 px-3": props.display === "chip" && !props?.modelValue?.length, + "py-1.5 px-3": + props.display === "chip" && props?.modelValue?.length > 0, + }, + + // Color + { + "text-surface-800 dark:text-white/80": props.modelValue?.length, + "text-surface-400 dark:text-surface-500": !props.modelValue?.length, + }, + "placeholder:text-surface-400 dark:placeholder:text-surface-500", + + // Transitions + "transition duration-200", + + // Misc + "overflow-hidden whitespace-nowrap cursor-pointer overflow-ellipsis", + ], + }), + token: { + class: [ + // Flex + "inline-flex items-center", + + // Spacings + "py-1.5 px-3 mr-2", + + // Shape + "rounded-[1.14rem]", + + // Colors + "bg-surface-200 dark:bg-surface-700", + "text-surface-700 dark:text-white/70", + + // Misc + "cursor-default", + ], + }, + removeTokenIcon: { + class: [ + // Shape + "rounded-md leading-6", + + // Spacing + "ml-2", + + // Size + "w-4 h-4", + + // Transition + "transition duration-200 ease-in-out", + + // Misc + "cursor-pointer", + ], + }, + trigger: { + class: [ + // Flexbox + "flex items-center justify-center", + "shrink-0", + + // Color and Background + "bg-transparent", + "text-surface-500", + + // Size + "w-12", + + // Shape + "rounded-tr-md", + "rounded-br-md", + ], + }, + panel: { + class: [ + // Position + "absolute top-0 left-0", + + // Shape + "border-0 dark:border", + "rounded-md", + "shadow-md", + + // Color + "bg-surface-0 dark:bg-surface-800", + "text-surface-800 dark:text-white/80", + "dark:border-surface-700", + ], + }, + header: { + class: [ + "flex items-center justify-between", + // Spacing + "py-3 px-5", + "m-0", + + //Shape + "border-b", + "rounded-tl-md", + "rounded-tr-md", + + // Color + "text-surface-700 dark:text-white/80", + "bg-surface-100 dark:bg-surface-800", + "border-surface-300 dark:border-surface-700", + ], + }, + headerCheckboxContainer: { + class: [ + "relative", + + // Alignment + "inline-flex", + "align-bottom", + + // Size + "w-6", + "h-6", + + // Misc + "cursor-pointer", + "select-none", + ], + }, + headerCheckbox: { + root: { + class: [ + "relative", + + // Alignment + "inline-flex", + "align-bottom", + + // Size + "w-6", + "h-6", + + // Spacing + "mr-2", + + // Misc + "cursor-pointer", + "select-none", + ], + }, + box: ({ props, context }) => ({ + class: [ + // Alignment + "flex", + "items-center", + "justify-center", + + // Size + "w-6", + "h-6", + + // Shape + "rounded-md", + "border-2", + + // Colors + { + "border-surface-200 bg-surface-0 dark:border-surface-700 dark:bg-surface-900": + !context.checked, + "border-primary-500 bg-primary-500 dark:border-primary-400 dark:bg-primary-400": + context.checked, + }, + + // States + { + "peer-hover:border-primary-500 dark:peer-hover:border-primary-400": + !props.disabled && !context.checked, + "peer-hover:bg-primary-600 dark:peer-hover:bg-primary-300 peer-hover:border-primary-700 dark:peer-hover:border-primary-300": + !props.disabled && context.checked, + "peer-focus-visible:border-primary-500 dark:peer-focus-visible:border-primary-400 peer-focus-visible:ring-2 peer-focus-visible:ring-primary-400/20 dark:peer-focus-visible:ring-primary-300/20": + !props.disabled, + "cursor-default opacity-60": props.disabled, + }, + + // Transitions + "transition-colors", + "duration-200", + ], + }), + input: { + class: [ + "peer", + + // Size + "w-full ", + "h-full", + + // Position + "absolute", + "top-0 left-0", + "z-10", + + // Spacing + "p-0", + "m-0", + + // Shape + "opacity-0", + "rounded-md", + "outline-none", + "border-2 border-surface-200 dark:border-surface-700", + + // Misc + "appearance-none", + "cursor-pointer", + ], + }, + icon: { + class: [ + // Font + "text-base leading-none", + + // Size + "w-4", + "h-4", + + // Colors + "text-white dark:text-surface-900", + + // Transitions + "transition-all", + "duration-200", + ], + }, + }, + itemCheckbox: { + root: { + class: [ + "relative", + + // Alignment + "inline-flex", + "align-bottom", + + // Size + "w-6", + "h-6", + + // Spacing + "mr-2", + + // Misc + "cursor-pointer", + "select-none", + ], + }, + box: ({ props, context }) => ({ + class: [ + // Alignment + "flex", + "items-center", + "justify-center", + + // Size + "w-6", + "h-6", + + // Shape + "rounded-md", + "border-2", + + // Colors + { + "border-surface-200 bg-surface-0 dark:border-surface-700 dark:bg-surface-900": + !context.checked, + "border-primary-500 bg-primary-500 dark:border-primary-400 dark:bg-primary-400": + context.checked, + }, + + // States + { + "peer-hover:border-primary-500 dark:peer-hover:border-primary-400": + !props.disabled && !context.checked, + "peer-hover:bg-primary-600 dark:peer-hover:bg-primary-300 peer-hover:border-primary-700 dark:peer-hover:border-primary-300": + !props.disabled && context.checked, + "peer-focus-visible:border-primary-500 dark:peer-focus-visible:border-primary-400 peer-focus-visible:ring-2 peer-focus-visible:ring-primary-400/20 dark:peer-focus-visible:ring-primary-300/20": + !props.disabled, + "cursor-default opacity-60": props.disabled, + }, + + // Transitions + "transition-colors", + "duration-200", + ], + }), + input: { + class: [ + "peer", + + // Size + "w-full ", + "h-full", + + // Position + "absolute", + "top-0 left-0", + "z-10", + + // Spacing + "p-0", + "m-0", + + // Shape + "opacity-0", + "rounded-md", + "outline-none", + "border-2 border-surface-200 dark:border-surface-700", + + // Misc + "appearance-none", + "cursor-pointer", + ], + }, + icon: { + class: [ + // Font + "text-base leading-none", + + // Size + "w-4", + "h-4", + + // Colors + "text-white dark:text-surface-900", + + // Transitions + "transition-all", + "duration-200", + ], + }, + }, + closeButton: { + class: [ + "relative", + + // Flexbox and Alignment + "flex items-center justify-center", + + // Size and Spacing + "mr-2", + "last:mr-0", + "w-8 h-8", + + // Shape + "border-0", + "rounded-full", + + // Colors + "text-surface-500", + "bg-transparent", + + // Transitions + "transition duration-200 ease-in-out", + + // States + "hover:text-surface-700 dark:hover:text-white/80", + "hover:bg-surface-100 dark:hover:bg-surface-800/80", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-inset", + "focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + + // Misc + "overflow-hidden", + ], + }, + closeButtonIcon: { + class: "w-4 h-4 inline-block", + }, + wrapper: { + class: [ + // Sizing + "max-h-[200px]", + + // Misc + "overflow-auto", + ], + }, + list: { + class: "py-0 px-0 list-none m-1", + }, + item: ({ context }) => ({ + class: [ + // Font + "font-normal", + "leading-none", + + // Flexbox + "flex items-center", + + // Position + "relative", + + // Shape + "border-0", + "rounded", + + // Spacing + "my-2 mx-1", + "py-1 px-2", + + // Color + { + "text-surface-700 dark:text-white/80": + !context.focused && !context.selected && !context.disabled, + }, + { + "text-surface-600 dark:text-white/70": + !context.focused && !context.selected && context.disabled, + }, + { + "bg-primary-100 dark:bg-surface-600/60 text-surface-700 dark:text-white/80": + context.focused && !context.selected, + }, + { + "bg-surface-100 dark:bg-surface-700 text-primary-700 dark:text-white/80": + context.focused && context.selected, + }, + { + "bg-surface-100 dark:bg-surface-700 text-primary-700 dark:text-white/80": + !context.focused && context.selected, + }, + + //States + { + "hover:bg-primary-200 dark:hover:bg-surface-600/80": + !context.focused && !context.selected, + }, + { + "hover:text-surface-700 hover:bg-primary-200 dark:hover:text-white dark:hover:bg-surface-600/80": + context.focused && !context.selected, + }, + + // Transitions + "transition-shadow", + "duration-200", + + // Misc + "cursor-pointer", + "overflow-hidden", + "whitespace-nowrap", + ], + }), + itemgroup: { + class: [ + //Font + "font-bold", + + // Spacing + "m-0", + "p-3 px-5", + + // Color + "text-surface-800 dark:text-white/80", + "bg-surface-0 dark:bg-surface-600/80", + + // Misc + "cursor-auto", + ], + }, + filtercontainer: { + class: "relative w-full mx-2", + }, + filterinput: { + class: [ + // Font + "font-sans", + "leading-none", + + // Sizing + "pr-7 py-3 px-3", + "-mr-7", + "w-full", + + //Color + "text-surface-700 dark:text-white/80", + "bg-surface-0 dark:bg-surface-900", + "border-surface-200 dark:border-surface-700", + "placeholder:text-surface-400 dark:placeholder:text-surface-500", + + // Shape + "border", + "rounded-lg", + "appearance-none", + + // Transitions + "transition", + "duration-200", + + // States + "hover:border-primary-500 dark:hover:border-primary-300", + "focus:ring focus:outline-none focus:outline-offset-0", + "focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + + // Misc + "appearance-none", + ], + }, + filtericon: { + class: ["absolute", "top-1/2 right-3", "-mt-2"], + }, + clearicon: { + class: [ + // Color + "text-surface-500", + + // Position + "absolute", + "top-1/2", + "right-12", + + // Spacing + "-mt-2", + ], + }, + emptymessage: { + class: [ + // Font + "leading-none", + + // Spacing + "py-3 px-5", + + // Color + "text-surface-800 dark:text-white/80", + "bg-transparent", + ], + }, + transition: { + enterFromClass: "opacity-0 scale-y-[0.8]", + enterActiveClass: + "transition-[transform,opacity] duration-[120ms] ease-[cubic-bezier(0,0,0.2,1)]", + leaveActiveClass: "transition-opacity duration-100 ease-linear", + leaveToClass: "opacity-0", + }, +}; diff --git a/src/app/plugins/tailwind/components/paginator.ts b/src/app/plugins/tailwind/components/paginator.ts new file mode 100644 index 00000000..0c7e69d5 --- /dev/null +++ b/src/app/plugins/tailwind/components/paginator.ts @@ -0,0 +1,204 @@ +export default { + root: { + class: [ + "flex items-center justify-center flex-wrap", + "bg-surface-0 text-surface-500 border-0 px-4 py-2 rounded-md", + "dark:bg-surface-800 dark:text-white/60 dark:border-surface-700", // Dark Mode + ], + }, + firstpagebutton: ({ context }) => ({ + class: [ + "relative inline-flex items-center justify-center user-none overflow-hidden leading-none", + "border-0 text-surface-500 min-w-[3rem] h-12 m-[0.143rem] rounded-md", + "transition duration-200", + "dark:text-white", //Dark Mode + { + "cursor-default pointer-events-none opacity-60": context.disabled, + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50": + !context.disabled, // Focus + }, + ], + }), + previouspagebutton: ({ context }) => ({ + class: [ + "relative inline-flex items-center justify-center user-none overflow-hidden leading-none", + "border-0 text-surface-500 min-w-[3rem] h-12 m-[0.143rem] rounded-md", + "transition duration-200", + "dark:text-white", //Dark Mode + { + "cursor-default pointer-events-none opacity-60": context.disabled, + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50": + !context.disabled, // Focus + }, + ], + }), + nextpagebutton: ({ context }) => ({ + class: [ + "relative inline-flex items-center justify-center user-none overflow-hidden leading-none", + "border-0 text-surface-500 min-w-[3rem] h-12 m-[0.143rem] rounded-md", + "transition duration-200", + "dark:text-white", //Dark Mode + { + "cursor-default pointer-events-none opacity-60": context.disabled, + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50": + !context.disabled, // Focus + }, + ], + }), + lastpagebutton: ({ context }) => ({ + class: [ + "relative inline-flex items-center justify-center user-none overflow-hidden leading-none", + "border-0 text-surface-500 min-w-[3rem] h-12 m-[0.143rem] rounded-md", + "transition duration-200", + "dark:text-white", //Dark Mode + { + "cursor-default pointer-events-none opacity-60": context.disabled, + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50": + !context.disabled, // Focus + }, + ], + }), + pagebutton: ({ context }) => ({ + class: [ + "relative inline-flex items-center justify-center user-none overflow-hidden leading-none", + "border-0 text-surface-500 min-w-[3rem] h-12 m-[0.143rem] rounded-md", + "transition duration-200", + "dark:border-primary-300 dark:text-white", // Dark Mode + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50", // Focus + { + "bg-surface-100 border-primary-50 text-primary-700 dark:bg-surface-700": + context.active, + }, + ], + }), + rowperpagedropdown: { + root: ({ props, state }) => ({ + class: [ + "inline-flex relative cursor-pointer user-none", + "bg-surface-0 border rounded-md", + "transition duration-200", + "h-12 mx-2", + "dark:bg-surface-800 dark:border-surface-700", //DarkMode + { + "outline-none outline-offset-0 shadow-[0_0_0_0.2rem_rgba(191,219,254,1)] border-primary-500": + state.focused && !props.disabled, //Focus + "border-surface-200": !state.focused, + "hover:border-primary-500": !props.disabled, //Hover + }, + ], + }), + input: { + class: [ + "font-sans text-base text-surface-600 p-3 m-0 rounded-md apperance-none", + "block whitespace-nowrap overflow-hidden flex-auto w-[1%] cursor-pointer text-ellipsis border-0 pr-0", + "focus:outline-none focus:outline-offset-0", + "dark:text-white", //Dark Mode + ], + }, + trigger: { + class: [ + "flex items-center justify-center shrink-0", + "text-surface-500 dark:text-white w-12 rounded-r-md", + ], + }, + panel: { + class: [ + "bg-surface-0 text-surface-600 border-0 rounded-md shadow-[0_2px_12px_rgba(0,0,0,0.1)]", + "dark:bg-surface-800 dark:text-white/80 dark:border-surface-700", //Dark Mode + ], + }, + wrapper: { + class: "overflow-auto", + }, + list: { + class: "m-0 p-0 py-3 list-none", + }, + item: ({ context }) => ({ + class: [ + "relative font-normal cursor-pointer space-nowrap overflow-hidden", + "m-0 py-3 px-5 border-none text-surface-600 rounded-none", + "transition duration-200", + "dark:text-white/80", // Dark Mode + { + "text-primary-700 bg-primary-50 dark:text-white/80 dark:bg-primary-300": + !context.focused && context.selected, + "bg-primary-300/40": context.focused && context.selected, + "text-surface-600 bg-surface-300 dark:text-white/80 pdark:bg-surface-900/40": + context.focused && !context.selected, + }, + ], + }), + }, + jumptopageinput: { + root: { + class: "inline-flex mx-2", + }, + input: { + class: [ + "font-sans text-base text-surface-600 p-3 m-0 rounded-md apperance-none", + "block whitespace-nowrap overflow-hidden flex-auto w-[1%] cursor-pointer text-ellipsis border border-surface-200 pr-0", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50 focus:border-primary-300", + "dark:text-white dark:bg-surface-800 dark:border-surface-700", //Dark Mode + "m-0 flex-auto max-w-[3rem]", + ], + }, + }, + jumptopagedropdown: { + root: ({ props, state }) => ({ + class: [ + "inline-flex relative cursor-pointer user-none", + "bg-surface-0 border rounded-md", + "transition duration-200", + "h-12 mx-2", + "dark:bg-surface-800 dark:border-surface-700", //DarkMode + { + "outline-none outline-offset-0 shadow-[0_0_0_0.2rem_rgba(191,219,254,1)] border-primary-500": + state.focused && !props.disabled, //Focus + "border-surface-200": !state.focused, + "hover:border-primary-500": !props.disabled, //Hover + }, + ], + }), + input: { + class: [ + "font-sans text-base text-surface-600 p-3 m-0 rounded-md apperance-none", + "block whitespace-nowrap overflow-hidden flex-auto w-[1%] cursor-pointer text-ellipsis border-0 pr-0", + "focus:outline-none focus:outline-offset-0", + "dark:text-white", //Dark Mode + ], + }, + trigger: { + class: [ + "flex items-center justify-center shrink-0", + "text-surface-500 dark:text-white w-12 rounded-r-md", + ], + }, + panel: { + class: [ + "bg-surface-0 text-surface-600 border-0 rounded-md shadow-[0_2px_12px_rgba(0,0,0,0.1)]", + "dark:bg-surface-800 dark:text-white/80 dark:border-surface-700", //Dark Mode + ], + }, + wrapper: { + class: "overflow-auto", + }, + list: { + class: "m-0 p-0 py-3 list-none", + }, + item: ({ context }) => ({ + class: [ + "relative font-normal cursor-pointer space-nowrap overflow-hidden", + "m-0 py-3 px-5 border-none text-surface-600 rounded-none", + "transition duration-200", + "dark:text-white/80", // Dark Mode + { + "text-primary-700 bg-primary-50 dark:text-white/80 dark:bg-primary-300": + !context.focused && context.selected, + "bg-primary-300/40": context.focused && context.selected, + "text-surface-600 bg-surface-300 dark:text-white/80 pdark:bg-surface-900/40": + context.focused && !context.selected, + }, + ], + }), + }, +}; diff --git a/src/app/plugins/tailwind/components/panel.ts b/src/app/plugins/tailwind/components/panel.ts new file mode 100644 index 00000000..95564462 --- /dev/null +++ b/src/app/plugins/tailwind/components/panel.ts @@ -0,0 +1,47 @@ +export default { + root: { + class: [ + //positioning + + "flex", + "flex-col", + "justify-between", + //Shape + "rounded-lg", + "shadow-md", + + //Color + "bg-surface-0 dark:bg-surface-800", + "text-surface-700 dark:text-surface-0/80", + ], + }, + header: { + class: [ + "flex items-center justify-between", + "rounded-tl-lg rounded-tr-lg bg-gray-100 dark:text-white text-black dark:border-surface-700 dark:bg-surface-700 p-2", + ], + }, + body: { + class: "py-5", + }, + title: { + class: "text-lg uppercase font-medium md:px-4", + }, + subtitle: { + class: [ + //Spacing + "mb-1 px-5 md:px-6", + + //Color + "text-surface-600 dark:text-surface-0/60", + ], + }, + content: { + class: "py-6 px-5 md:px-6", + }, + footer: { + class: [ + "rounded-bl-lg rounded-br-lg bg-gray-100 dark:text-white text-black dark:border-surface-700 dark:bg-surface-700 p-2 relative bottom-0", + ], + }, +}; diff --git a/src/app/plugins/tailwind/components/sidebar.ts b/src/app/plugins/tailwind/components/sidebar.ts new file mode 100644 index 00000000..1adb1987 --- /dev/null +++ b/src/app/plugins/tailwind/components/sidebar.ts @@ -0,0 +1,152 @@ +export default { + root: ({ props }) => ({ + class: [ + // Flexbox + "flex flex-col", + + // Position + "relative", + { + "!transition-none !transform-none !w-screen !h-screen !max-h-full !top-0 !left-0": + props.position == "full", + }, + + // Size + { + "h-full w-1/3": props.position == "left" || props.position == "right", + "h-auto w-full": props.position == "top" || props.position == "bottom", + }, + + // Shape + "border-0 dark:border", + "shadow-lg", + + // Colors + "bg-surface-0 dark:bg-surface-800", + "text-surface-700 dark:text-white/80", + "dark:border-surface-700", + + // Transitions + "transition-transform", + "duration-300", + + // Misc + "pointer-events-auto", + ], + }), + header: { + class: [ + // Flexbox and Alignment + "flex items-center justify-between", + "shrink-0", + + // Spacing + "p-5", + + // Colors + "bg-surface-0 dark:bg-surface-800", + "text-surface-700 dark:text-surface-0/80", + ], + }, + title: { + class: ["font-bold text-lg"], + }, + icons: { + class: ["flex items-center"], + }, + closeButton: { + class: [ + "relative", + + // Flexbox and Alignment + "flex items-center justify-center", + + // Size and Spacing + "mr-2", + "last:mr-0", + "w-8 h-8", + + // Shape + "border-0", + "rounded-full", + + // Colors + "text-surface-500", + "bg-transparent", + + // Transitions + "transition duration-200 ease-in-out", + + // States + "hover:text-surface-700 dark:hover:text-white/80", + "hover:bg-surface-100 dark:hover:bg-surface-800/80", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-inset", + "focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + + // Misc + "overflow-hidden", + ], + }, + closeButtonIcon: { + class: [ + // Display + "inline-block", + + // Size + "w-4", + "h-4", + ], + }, + content: { + class: [ + // Spacing and Size + "p-5", + "pt-0", + "h-full", + "w-full", + + // Growth and Overflow + "grow", + "overflow-y-auto", + ], + }, + mask: ({ props }) => ({ + class: [ + // Transitions + "transition", + "duration-200", + { "p-5": !props.position == "full" }, + + // Background and Effects + { "bg-black/40": props.modal, "backdrop-blur-sm": props.modal }, + ], + }), + transition: ({ props }) => { + return props.position === "top" + ? { + enterFromClass: "translate-x-0 -translate-y-full translate-z-0", + leaveToClass: "translate-x-0 -translate-y-full translate-z-0", + } + : props.position === "bottom" + ? { + enterFromClass: "translate-x-0 translate-y-full translate-z-0", + leaveToClass: "translate-x-0 translate-y-full translate-z-0", + } + : props.position === "left" + ? { + enterFromClass: "-translate-x-full translate-y-0 translate-z-0", + leaveToClass: "-translate-x-full translate-y-0 translate-z-0", + } + : props.position === "right" + ? { + enterFromClass: "translate-x-full translate-y-0 translate-z-0", + leaveToClass: "translate-x-full translate-y-0 translate-z-0", + } + : { + enterFromClass: "opacity-0", + enterActiveClass: "transition-opacity duration-400 ease-in", + leaveActiveClass: "transition-opacity duration-400 ease-in", + leaveToClass: "opacity-0", + }; + }, +}; diff --git a/src/app/plugins/tailwind/components/slider.ts b/src/app/plugins/tailwind/components/slider.ts new file mode 100644 index 00000000..ae8687ac --- /dev/null +++ b/src/app/plugins/tailwind/components/slider.ts @@ -0,0 +1,149 @@ +export default { + root: ({ props }) => ({ + class: [ + "relative", + + // Size + { + "h-1 w-60": props.orientation == "horizontal", + "w-1 h-56": props.orientation == "vertical", + }, + + // Shape + "border-0", + + // Colors + "bg-surface-100 dark:bg-surface-700", + + // States + { + "opacity-60 select-none pointer-events-none cursor-default": + props.disabled, + }, + ], + }), + range: ({ props }) => ({ + class: [ + // Position + "block absolute", + { + "top-0 left-0": props.orientation == "horizontal", + "bottom-0 left-0": props.orientation == "vertical", + }, + + //Size + { + "h-full": props.orientation == "horizontal", + "w-full": props.orientation == "vertical", + }, + + // Colors + "bg-primary-500 dark:bg-primary-400", + ], + }), + handle: ({ props }) => ({ + class: [ + "block", + + // Size + "h-[1.143rem]", + "w-[1.143rem]", + { + "top-[50%] mt-[-0.5715rem] ml-[-0.5715rem]": + props.orientation == "horizontal", + "left-[50%] mb-[-0.5715rem] ml-[-0.5715rem]": + props.orientation == "vertical", + }, + + // Shape + "rounded-full", + "border-2", + + // Colors + "bg-surface-0 dark:bg-surface-600", + "border-primary-500 dark:border-primary-400", + + // States + "hover:bg-primary-500 hover:border-primary-500", + "focus:outline-none focus:outline-offset-0 focus:ring", + "ring-primary-400/50 dark:ring-primary-300/50", + + // Transitions + "transition duration-200", + + // Misc + "cursor-grab", + "touch-action-none", + ], + }), + starthandler: ({ props }) => ({ + class: [ + "block", + + // Size + "h-[1.143rem]", + "w-[1.143rem]", + { + "top-[50%] mt-[-0.5715rem] ml-[-0.5715rem]": + props.orientation == "horizontal", + "left-[50%] mb-[-0.5715rem] ml-[-0.4715rem]": + props.orientation == "vertical", + }, + + // Shape + "rounded-full", + "border-2", + + // Colors + "bg-surface-0 dark:bg-surface-600", + "border-primary-500 dark:border-primary-400", + + // States + "hover:bg-primary-500 hover:border-primary-500", + "focus:outline-none focus:outline-offset-0 focus:ring", + "focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + + // Transitions + "transition duration-200", + + // Misc + "cursor-grab", + "touch-action-none", + ], + }), + endhandler: ({ props }) => ({ + class: [ + "block", + + // Size + "h-[1.143rem]", + "w-[1.143rem]", + { + "top-[50%] mt-[-0.5715rem] ml-[-0.5715rem]": + props.orientation == "horizontal", + "left-[50%] mb-[-0.5715rem] ml-[-0.4715rem]": + props.orientation == "vertical", + }, + + // Shape + "rounded-full", + "border-2", + + // Colors + "bg-surface-0 dark:bg-surface-600", + "border-primary-500 dark:border-primary-400", + + // States + "hover:bg-primary-500 hover:border-primary-500", + "focus:outline-none focus:outline-offset-0 focus:ring", + "focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + + // Transitions + "transition duration-200", + + // Misc + "cursor-grab", + "touch-action-none", + ], + }), +}; diff --git a/src/app/plugins/tailwind/components/tabview.ts b/src/app/plugins/tailwind/components/tabview.ts new file mode 100644 index 00000000..e1ae1d66 --- /dev/null +++ b/src/app/plugins/tailwind/components/tabview.ts @@ -0,0 +1,165 @@ +export default { + navContainer: ({ props }) => ({ + class: [ + // Position + "relative", + + // Misc + { "overflow-hidden": props.scrollable }, + ], + }), + navContent: { + class: [ + // Overflow and Scrolling + "overflow-y-hidden overscroll-contain", + "overscroll-auto", + "scroll-smooth", + "[&::-webkit-scrollbar]:hidden", + ], + }, + previousButton: { + class: [ + // Flexbox and Alignment + "flex items-center justify-center", + + // Position + "!absolute", + "top-0 left-0", + "z-20", + + // Size and Shape + "h-full w-12", + "rounded-none", + + // Colors + "bg-surface-0 dark:bg-surface-800", + "text-primary-500 dark:text-primary-400", + "shadow-md", + ], + }, + nextButton: { + class: [ + // Flexbox and Alignment + "flex items-center justify-center", + + // Position + "!absolute", + "top-0 right-0", + "z-20", + + // Size and Shape + "h-full w-12", + "rounded-none", + + // Colors + "bg-surface-0 dark:bg-surface-800", + "text-primary-500 dark:text-primary-400", + "shadow-md", + ], + }, + nav: { + class: [ + // Flexbox + "flex flex-1", + + // Spacing + "list-none", + "p-0 m-0", + + // Colors + "bg-surface-0 dark:bg-surface-800", + "border-b-2 border-surface-200 dark:border-surface-700", + "text-surface-900 dark:text-surface-0/80", + ], + }, + tabpanel: { + header: ({ props }) => ({ + class: [ + // Spacing + "mr-0", + + // Misc + { + "opacity-60 cursor-default user-select-none select-none pointer-events-none": + props?.disabled, + }, + ], + }), + headerAction: ({ parent, context }) => ({ + class: [ + "relative", + + // Font + "font-bold", + + // Flexbox and Alignment + "flex items-center", + + // Spacing + "p-5", + "-mb-[2px]", + + // Shape + "border-b-2", + "rounded-t-md", + + // Colors and Conditions + { + "border-surface-200 dark:border-surface-700": + parent.state.d_activeIndex !== context.index, + "text-surface-700 dark:text-surface-0/80": + parent.state.d_activeIndex !== context.index, + "bg-surface-0 dark:bg-surface-800": + parent.state.d_activeIndex === context.index, + "border-primary-500 dark:border-primary-400": + parent.state.d_activeIndex === context.index, + "text-primary-500 dark:text-primary-400": + parent.state.d_activeIndex === context.index, + }, + + // States + "focus-visible:outline-none focus-visible:outline-offset-0 focus-visible:ring focus-visible:ring-inset", + "focus-visible:ring-primary-400/50 dark:focus-visible:ring-primary-300/50", + { + "hover:bg-surface-0 dark:hover:bg-surface-800/80": + parent.state.d_activeIndex !== context.index, + "hover:border-surface-400 dark:hover:border-surface-600": + parent.state.d_activeIndex !== context.index, + "hover:text-surface-900 dark:hover:text-surface-0": + parent.state.d_activeIndex !== context.index, + }, + + // Transitions + "transition-all duration-200", + + // Misc + "cursor-pointer select-none text-decoration-none", + "overflow-hidden", + "user-select-none", + ], + }), + headerTitle: { + class: [ + // Text + "leading-none", + "whitespace-nowrap", + "uppercase", + "tracking-widest", + ], + }, + content: { + class: [ + // Spacing + "p-5", + + // Shape + "rounded-b-md", + + // Colors + "bg-surface-0 dark:bg-surface-800", + "text-surface-700 dark:text-surface-0/80", + "border-0", + ], + }, + }, +}; diff --git a/src/app/plugins/tailwind/components/textArea.ts b/src/app/plugins/tailwind/components/textArea.ts new file mode 100644 index 00000000..646ce196 --- /dev/null +++ b/src/app/plugins/tailwind/components/textArea.ts @@ -0,0 +1,22 @@ +export default { + root: ({ context }) => ({ + class: [ + "text-normal", + "p-4", + "border border-surface-300 dark:border-surface-600", + "bg-surface-0 dark:bg-surface-800", + "rounded-md", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + { + "hover:border-primary-500 dark:hover:border-primary-400": + !context.disabled, + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-500/50 dark:focus:ring-primary-400/50": + !context.disabled, + "opacity-60 select-none pointer-events-none cursor-default": + context.disabled, + }, + "appearance-none", + "transition-colors duration-200", + ], + }), +}; diff --git a/src/app/plugins/tailwind/components/toast.ts b/src/app/plugins/tailwind/components/toast.ts new file mode 100644 index 00000000..2aba27f5 --- /dev/null +++ b/src/app/plugins/tailwind/components/toast.ts @@ -0,0 +1,107 @@ +export default { + root: ({ props }) => ({ + class: [ + //Size and Shape + "w-96 rounded-md", + + // Positioning + { + "-translate-x-2/4": + props.position == "top-center" || props.position == "bottom-center", + }, + ], + }), + container: ({ props }) => ({ + class: [ + "my-4 rounded-md w-full", + "border-solid border-0 border-l-[6px]", + "backdrop-blur-[10px] shadow-md", + + // Colors + { + "bg-blue-100/70 dark:bg-blue-500/20": props.message.severity == "info", + "bg-green-100/70 dark:bg-green-500/20": + props.message.severity == "success", + "bg-orange-100/70 dark:bg-orange-500/20": + props.message.severity == "warn", + "bg-red-100/70 dark:bg-red-500/20": props.message.severity == "error", + }, + { + "border-blue-500 dark:border-blue-400": + props.message.severity == "info", + "border-green-500 dark:border-green-400": + props.message.severity == "success", + "border-orange-500 dark:border-orange-400": + props.message.severity == "warn", + "border-red-500 dark:border-red-400": props.message.severity == "error", + }, + { + "text-blue-700 dark:text-blue-300": props.message.severity == "info", + "text-green-700 dark:text-green-300": + props.message.severity == "success", + "text-orange-700 dark:text-orange-300": + props.message.severity == "warn", + "text-red-700 dark:text-red-300": props.message.severity == "error", + }, + ], + }), + content: { + class: "flex items-start p-4", + }, + icon: { + class: [ + // Sizing and Spacing + "w-6 h-6", + "text-lg leading-none mr-2 shrink-0", + ], + }, + text: { + class: [ + // Font and Text + "text-base leading-none", + "ml-2", + "flex-1", + ], + }, + summary: { + class: "font-bold block", + }, + detail: { + class: "mt-2 block", + }, + closebutton: { + class: [ + // Flexbox + "flex items-center justify-center", + + // Size + "w-8 h-8", + + // Spacing and Misc + "ml-auto relative", + + // Shape + "rounded-full", + + // Colors + "bg-transparent", + + // Transitions + "transition duration-200 ease-in-out", + + // States + "hover:bg-surface-0/50 dark:hover:bg-surface-0/10", + + // Misc + "overflow-hidden", + ], + }, + transition: { + enterFromClass: "opacity-0 translate-y-2/4", + enterActiveClass: "transition-[transform,opacity] duration-300", + leaveFromClass: "max-h-[1000px]", + leaveActiveClass: + "!transition-[max-height_.45s_cubic-bezier(0,1,0,1),opacity_.3s,margin-bottom_.3s] overflow-hidden", + leaveToClass: "max-h-0 opacity-0 mb-0", + }, +}; diff --git a/src/app/plugins/tailwind/components/toolbar.ts b/src/app/plugins/tailwind/components/toolbar.ts new file mode 100644 index 00000000..b9aa67ab --- /dev/null +++ b/src/app/plugins/tailwind/components/toolbar.ts @@ -0,0 +1,26 @@ +export default { + root: { + class: [ + // Flex & Alignment + "flex items-center justify-between flex-wrap", + "gap-2", + + // Spacing + "p-3", + + "z-50", + + // Color + "bg-white dark:bg-surface-800 shadow-lg shadow-black", + ], + }, + start: { + class: "flex items-center", + }, + center: { + class: "flex items-center", + }, + end: { + class: "flex items-center", + }, +}; diff --git a/src/app/plugins/tailwind/components/tooltip.ts b/src/app/plugins/tailwind/components/tooltip.ts new file mode 100644 index 00000000..68b6c4e1 --- /dev/null +++ b/src/app/plugins/tailwind/components/tooltip.ts @@ -0,0 +1,74 @@ +export default { + root: ({ context, props }) => ({ + class: [ + // Position and Shadows + "absolute", + "shadow-md", + "p-fadein", + "z-50", + // Spacing + { + "py-0 px-1": + context?.right || + context?.left || + (!context?.right && + !context?.left && + !context?.top && + !context?.bottom), + "py-1 px-0": context?.top || context?.bottom, + }, + ], + }), + arrow: ({ context, props }) => ({ + class: [ + // Position + + "absolute", + + // Size + "w-0", + "h-0", + + // Shape + "border-transparent", + "border-solid", + { + "border-y-[0.25rem] border-r-[0.25rem] border-l-0 border-r-surface-600": + context?.right || + (!context?.right && + !context?.left && + !context?.top && + !context?.bottom), + "border-y-[0.25rem] border-l-[0.25rem] border-r-0 border-l-surface-600": + context?.left, + "border-x-[0.25rem] border-t-[0.25rem] border-b-0 border-t-surface-600": + context?.top, + "border-x-[0.25rem] border-b-[0.25rem] border-t-0 border-b-surface-600": + context?.bottom, + }, + + // Spacing + { + "-mt-1 ": + context?.right || + (!context?.right && + !context?.left && + !context?.top && + !context?.bottom), + "-mt-1": context?.left, + "-ml-1": context?.top || context?.bottom, + }, + ], + }), + text: { + class: [ + "p-3", + "bg-surface-600 dark:bg-surface-700", + "text-white", + "leading-none", + "rounded-md", + "whitespace-pre-line", + "break-words", + ], + }, +}; diff --git a/src/app/plugins/tailwind/components/treeSelect.ts b/src/app/plugins/tailwind/components/treeSelect.ts new file mode 100644 index 00000000..fdf0181a --- /dev/null +++ b/src/app/plugins/tailwind/components/treeSelect.ts @@ -0,0 +1,335 @@ +export default { + root: ({ props, state }) => ({ + class: [ + // Display and Position + "inline-flex", + "relative", + + // Shape + "rounded-md", + + // Color and Background + "bg-surface-0 dark:bg-surface-800", + "border border-surface-300 dark:border-surface-700", + + // Transitions + "transition-all", + "duration-200", + + // States + "hover:border-primary-500 dark:hover:border-primary-300", + { + "outline-none outline-offset-0 ring ring-primary-400/50 dark:ring-primary-300/50": + state.focused, + }, + + // Misc + "cursor-pointer", + "select-none", + { + "opacity-60": props.disabled, + "pointer-events-none": props.disabled, + "cursor-default": props.disabled, + }, + ], + }), + labelContainer: { + class: ["overflow-hidden flex flex-auto cursor-pointer"], + }, + label: { + class: [ + "block leading-5", + + // Space + "p-3", + + // Color + "text-surface-800 dark:text-white/80", + + // Transition + "transition duration-200", + + // Misc + "overflow-hidden whitespace-nowrap cursor-pointer overflow-ellipsis", + ], + }, + trigger: { + class: [ + // Flexbox + "flex items-center justify-center", + "shrink-0", + + // Color and Background + "bg-transparent", + "text-surface-500", + + // Size + "w-12", + + // Shape + "rounded-tr-md", + "rounded-br-md", + ], + }, + panel: { + class: [ + // Position + "absolute top-0 left-0", + + // Shape + "border-0 dark:border", + "rounded-md", + "shadow-md", + + // Color + "bg-surface-0 dark:bg-surface-800", + "text-surface-800 dark:text-white/80", + "dark:border-surface-700", + ], + }, + wrapper: { + class: [ + // Sizing + "max-h-[200px]", + + // Misc + "overflow-auto", + ], + }, + tree: { + root: { + class: [ + // Space + "p-5", + ], + }, + wrapper: { + class: ["overflow-auto"], + }, + container: { + class: [ + // Spacing + "m-0 p-0", + + // Misc + "list-none overflow-auto", + ], + }, + node: { + class: [ + "p-1", + "rounded-md", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-inset focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + ], + }, + content: ({ context, props }) => ({ + class: [ + // Flex and Alignment + "flex items-center", + + // Shape + "rounded-md", + + // Spacing + "p-2", + + // Colors + "text-surface-600 dark:text-white/70", + { + "bg-primary-50 dark:bg-surface-700 text-primary-600 dark:text-surface-0": + context.selected, + }, + + // States + { + "hover:bg-surface-50 dark:hover:bg-surface-700/40": + (props.selectionMode == "single" || + props.selectionMode == "multiple") && + !context.selected, + }, + + // Transition + "transition-shadow duration-200", + + { + "cursor-pointer select-none": + props.selectionMode == "single" || + props.selectionMode == "multiple", + }, + ], + }), + toggler: ({ context }) => ({ + class: [ + // Flex and Alignment + "inline-flex items-center justify-center", + + // Shape + "border-0 rounded-full", + + // Size + "w-8 h-8", + + // Spacing + "mr-2", + + // Colors + "bg-transparent", + { + "text-surface-500 dark:text-white": !context.selected, + "text-primary-600 dark:text-white": context.selected, + invisible: context.leaf, + }, + + // States + "hover:bg-surface-200/20 dark:hover:bg-surface-500/20", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-400/50 dark:focus:ring-primary-300/50", + + // Transition + "transition duration-200", + + // Misc + "cursor-pointer select-none", + ], + }), + checkboxcontainer: { + class: "mr-2", + }, + checkbox: ({ context, props }) => ({ + class: [ + "relative", + + // Alignment + "flex", + "items-center", + "justify-center", + + // Size + "w-6", + "h-6", + + // Shape + "rounded-lg", + "border-2", + + // Colors + "text-surface-600", + { + "border-surface-200 bg-surface-0 dark:border-surface-700 dark:bg-surface-900": + !context.checked, + "border-primary-500 bg-primary-500 dark:border-primary-400 dark:bg-primary-400": + context.checked, + }, + + // States + "focus:outline-none focus:outline-offset-0", + { + "hover:border-primary-500 dark:hover:border-primary-400": + !props.disabled, + "ring ring-primary-400/50 dark:ring-primary-300/50": + !props.disabled && context.focused, + "cursor-default opacity-60": props.disabled, + }, + + // Transitions + "transition-colors", + "duration-200", + + // Misc + "cursor-pointer", + ], + }), + checkboxicon: { + class: [ + // Font + "text-base leading-none", + + // Size + "w-4", + "h-4", + + // Colors + "text-white dark:text-surface-900", + + // Transitions + "transition-all", + "duration-200", + ], + }, + nodeicon: { + class: [ + // Space + "mr-2", + + // Color + "text-surface-600 dark:text-white/70", + ], + }, + subgroup: { + class: ["m-0 list-none p-0 pl-2 mt-1"], + }, + filtercontainer: { + class: [ + "relative block", + + // Space + "mb-2", + + // Size + "w-full", + ], + }, + input: { + class: [ + "relative", + // Font + "font-sans leading-none", + + // Spacing + "m-0", + "p-3 pr-10", + + // Size + "w-full", + + // Shape + "rounded-md", + + // Colors + "text-surface-600 dark:text-surface-200", + "placeholder:text-surface-400 dark:placeholder:text-surface-500", + "bg-surface-0 dark:bg-surface-900", + "border border-surface-300 dark:border-surface-600", + + // States + "hover:border-primary-500 dark:hover:border-primary-400", + "focus:outline-none focus:outline-offset-0 focus:ring focus:ring-primary-500/50 dark:focus:ring-primary-400/50", + + // Transition & Misc + "appearance-none", + "transition-colors duration-200", + ], + }, + loadingicon: { + class: [ + "text-surface-500 dark:text-surface-0/70", + "absolute top-[50%] right-[50%] -mt-2 -mr-2", + ], + }, + searchicon: { + class: [ + // Position + "absolute top-1/2 -mt-2 right-3", + + // Color + "text-surface-600 dark:hover:text-white/70", + ], + }, + }, + transition: { + enterFromClass: "opacity-0 scale-y-[0.8]", + enterActiveClass: + "transition-[transform,opacity] duration-[120ms] ease-[cubic-bezier(0,0,0.2,1)]", + leaveActiveClass: "transition-opacity duration-100 ease-linear", + leaveToClass: "opacity-0", + }, +}; diff --git a/src/app/plugins/tailwind/tailwindStyles.ts b/src/app/plugins/tailwind/tailwindStyles.ts new file mode 100644 index 00000000..e66f19d7 --- /dev/null +++ b/src/app/plugins/tailwind/tailwindStyles.ts @@ -0,0 +1,63 @@ +import button from "@/app/plugins/tailwind/components/button"; +import card from "@/app/plugins/tailwind/components/card"; +import dropdown from "@/app/plugins/tailwind/components/dropdown"; +import panel from "@/app/plugins/tailwind/components/panel"; +import sidebar from "@/app/plugins/tailwind/components/sidebar"; +import tabview from "@/app/plugins/tailwind/components/tabview"; +import inputSwitch from "@/app/plugins/tailwind/components/inputSwitch"; +import inputText from "@/app/plugins/tailwind/components/inputText"; +import menu from "@/app/plugins/tailwind/components/menu"; +import message from "@/app/plugins/tailwind/components/message"; +import dataTable from "@/app/plugins/tailwind/components/dataTable"; +import paginator from "@/app/plugins/tailwind/components/paginator"; +import toolbar from "@/app/plugins/tailwind/components/toolbar"; +import badge from "@/app/plugins/tailwind/components/badge"; +import dialog from "@/app/plugins/tailwind/components/dialog"; +import tooltip from "@/app/plugins/tailwind/components/tooltip"; +import carousel from "@/app/plugins/tailwind/components/carousel"; +import textArea from "@/app/plugins/tailwind/components/textArea"; +import divider from "@/app/plugins/tailwind/components/divider"; +import multiSelect from "@/app/plugins/tailwind/components/multiSelect"; +import inputGroup from "@/app/plugins/tailwind/components/inputGroup"; +import inputGroupAddon from "@/app/plugins/tailwind/components/inputGroupAddon"; +import treeSelect from "@/app/plugins/tailwind/components/treeSelect"; +import slider from "@/app/plugins/tailwind/components/slider"; +import cascadeSelect from "@/app/plugins/tailwind/components/cascadeSelect"; +import floatLabel from "@/app/plugins/tailwind/components/floatLabel"; +import checkBox from "@/app/plugins/tailwind/components/checkBox"; +import accordion from "@/app/plugins/tailwind/components/accordion"; +import toast from "@/app/plugins/tailwind/components/toast"; +import chip from "@/app/plugins/tailwind/components/chip"; + +export const tailwindTheme = { + tabview, + dropdown, + panel, + card, + sidebar, + button, + inputSwitch, + inputText, + menu, + message, + dataTable, + paginator, + toolbar, + badge, + dialog, + tooltip, + carousel, + textArea, + divider, + multiSelect, + inputGroup, + inputGroupAddon, + treeSelect, + slider, + cascadeSelect, + floatLabel, + checkBox, + accordion, + toast, + chip, +}; diff --git a/src/app/plugins/vuetify.js b/src/app/plugins/vuetify.js deleted file mode 100644 index aefcf261..00000000 --- a/src/app/plugins/vuetify.js +++ /dev/null @@ -1,21 +0,0 @@ -import Vue from "vue"; -import Vuetify from "vuetify"; -import "vuetify/dist/vuetify.min.css"; -import "@mdi/font/css/materialdesignicons.css"; - -Vue.use(Vuetify); - -export default new Vuetify({ - theme: { - options: { customProperties: true }, - - themes: { - light: { - accent: "#E0E0E0", - }, - dark: { - accent: "#424242", - }, - }, - }, -}); diff --git a/src/app/providers/router/index.js b/src/app/providers/router/index.js deleted file mode 100644 index 07e943f9..00000000 --- a/src/app/providers/router/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import Vue from "vue"; -import VueRouter from "vue-router"; -import { routes } from "@/processes/exploreReports"; -Vue.use(VueRouter); - -export default new VueRouter({ - base: "/ares/", - routes, -}); diff --git a/src/app/providers/router/index.ts b/src/app/providers/router/index.ts new file mode 100644 index 00000000..7106a346 --- /dev/null +++ b/src/app/providers/router/index.ts @@ -0,0 +1,9 @@ +import { createRouter, createWebHashHistory, Router } from "vue-router"; +import { routes } from "@/processes/exploreReports"; + +const router: Router = createRouter({ + history: createWebHashHistory(), + routes, +}); + +export default router; diff --git a/src/app/providers/store/index.js b/src/app/providers/store/index.js deleted file mode 100644 index 5011f6a8..00000000 --- a/src/app/providers/store/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import Vue from "vue"; -import Vuex from "vuex"; - -Vue.use(Vuex); - -import { explorerStore } from "@/widgets/explorer"; -import { errorStore } from "@/widgets/error"; -import { reportsDataStore } from "@/processes/exploreReports"; -import { settingsStore } from "@/widgets/settings"; - -export default new Vuex.Store({ - modules: { - explorerStore, - reportsDataStore, - errorStore, - settingsStore, - }, -}); diff --git a/src/app/providers/store/index.ts b/src/app/providers/store/index.ts new file mode 100755 index 00000000..a41646cc --- /dev/null +++ b/src/app/providers/store/index.ts @@ -0,0 +1,23 @@ +import { Store } from "vuex"; + +import { explorerStore } from "@/widgets/explorer"; +import { errorStore } from "@/widgets/error"; +import { reportsDataStore } from "@/processes/exploreReports"; +import { settingsStore } from "@/widgets/settings"; +import { webApiStore, authStore } from "@/shared/api/webAPI"; +import { snackbarStore } from "@/widgets/snackbar"; +import notesStore from "@/widgets/notesPanel/model/store/notes.module"; +import contextMenuStore from "@/entities/contextMenu/model/store/contextMenu.module"; +export default new Store({ + modules: { + explorerStore, + reportsDataStore, + errorStore, + settingsStore, + webApiStore, + snackbarStore, + authStore, + notesStore, + contextMenuStore, + }, +}); diff --git a/src/entities/ProgressCircle.vue b/src/entities/ProgressCircle.vue new file mode 100644 index 00000000..7b6c00f0 --- /dev/null +++ b/src/entities/ProgressCircle.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/src/entities/chartMetadataCard/metadataCard.vue b/src/entities/chartMetadataCard/metadataCard.vue new file mode 100755 index 00000000..22884eba --- /dev/null +++ b/src/entities/chartMetadataCard/metadataCard.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/src/entities/contextMenu/contextMenu.vue b/src/entities/contextMenu/contextMenu.vue new file mode 100644 index 00000000..637a0637 --- /dev/null +++ b/src/entities/contextMenu/contextMenu.vue @@ -0,0 +1,92 @@ + + + diff --git a/src/entities/contextMenu/model/store/actions.type.ts b/src/entities/contextMenu/model/store/actions.type.ts new file mode 100644 index 00000000..b426ec93 --- /dev/null +++ b/src/entities/contextMenu/model/store/actions.type.ts @@ -0,0 +1 @@ +export const OPEN_MENU = "openMenu"; diff --git a/src/entities/contextMenu/model/store/contextMenu.module.ts b/src/entities/contextMenu/model/store/contextMenu.module.ts new file mode 100644 index 00000000..d1e23268 --- /dev/null +++ b/src/entities/contextMenu/model/store/contextMenu.module.ts @@ -0,0 +1,40 @@ +import { SET_LOCATION } from "@/entities/contextMenu/model/store/mutations.type"; +import { SET_CONTEXT_MENU_VISIBILITY } from "@/entities/contextMenu/model/store/mutations.type"; +import { OPEN_MENU } from "@/entities/contextMenu/model/store/actions.type"; + +const state = { + visible: false, + location: {}, +}; + +const getters = { + getContextMenuVisibility: function (state) { + return state.visible; + }, + getContextMenuLocation: function (state) { + return state.location; + }, +}; + +const actions = { + [OPEN_MENU]({ commit }, payload) { + commit(SET_LOCATION, payload.location); + commit(SET_CONTEXT_MENU_VISIBILITY, payload.visibility); + }, +}; + +const mutations = { + [SET_LOCATION](state, payload) { + state.location = payload; + }, + [SET_CONTEXT_MENU_VISIBILITY](state, payload) { + state.visible = payload; + }, +}; + +export default { + state, + getters, + actions, + mutations, +}; diff --git a/src/entities/contextMenu/model/store/mutations.type.ts b/src/entities/contextMenu/model/store/mutations.type.ts new file mode 100644 index 00000000..dc436d3b --- /dev/null +++ b/src/entities/contextMenu/model/store/mutations.type.ts @@ -0,0 +1,2 @@ +export const SET_LOCATION = "setLocation"; +export const SET_CONTEXT_MENU_VISIBILITY = "setContextMenuVisibility"; diff --git a/src/entities/pageHeader/PageHeader.vue b/src/entities/pageHeader/PageHeader.vue new file mode 100644 index 00000000..2a1870ce --- /dev/null +++ b/src/entities/pageHeader/PageHeader.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/entities/toggleIcon/ToggleIcon.vue b/src/entities/toggleIcon/ToggleIcon.vue new file mode 100644 index 00000000..676b25d1 --- /dev/null +++ b/src/entities/toggleIcon/ToggleIcon.vue @@ -0,0 +1,77 @@ + + + + diff --git a/src/features/returnToPreviousPage/ReturnButton.vue b/src/features/returnToPreviousPage/ReturnButton.vue index f8333f14..93e58528 100644 --- a/src/features/returnToPreviousPage/ReturnButton.vue +++ b/src/features/returnToPreviousPage/ReturnButton.vue @@ -1,21 +1,33 @@ - diff --git a/src/features/returnToPreviousPage/index.js b/src/features/returnToPreviousPage/index.ts similarity index 87% rename from src/features/returnToPreviousPage/index.js rename to src/features/returnToPreviousPage/index.ts index 66d63549..58a98936 100644 --- a/src/features/returnToPreviousPage/index.js +++ b/src/features/returnToPreviousPage/index.ts @@ -1,3 +1,3 @@ -import ReturnButton from "@/features/returnToPreviousPage/ReturnButton"; +import ReturnButton from "@/features/returnToPreviousPage/ReturnButton.vue"; export default ReturnButton; diff --git a/src/features/selectColumns/SelectColumns.vue b/src/features/selectColumns/SelectColumns.vue deleted file mode 100644 index 58bd0a95..00000000 --- a/src/features/selectColumns/SelectColumns.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - - - diff --git a/src/features/selectColumns/index.js b/src/features/selectColumns/index.js deleted file mode 100644 index a77e5a80..00000000 --- a/src/features/selectColumns/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import SelectColumns from "./SelectColumns"; - -export default SelectColumns; diff --git a/src/features/toggleBaseLine/ToggleBaseLine.vue b/src/features/toggleBaseLine/ToggleBaseLine.vue deleted file mode 100644 index e82e4c24..00000000 --- a/src/features/toggleBaseLine/ToggleBaseLine.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/src/features/toggleBaseLine/index.js b/src/features/toggleBaseLine/index.js deleted file mode 100644 index 67de9db8..00000000 --- a/src/features/toggleBaseLine/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import ToggleBaseLine from "./ToggleBaseLine"; - -export default ToggleBaseLine; diff --git a/src/features/toggleDarkMode/ToggleDarkMode.vue b/src/features/toggleDarkMode/ToggleDarkMode.vue deleted file mode 100644 index 54669f36..00000000 --- a/src/features/toggleDarkMode/ToggleDarkMode.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - - - diff --git a/src/features/toggleDarkMode/index.js b/src/features/toggleDarkMode/index.js deleted file mode 100644 index 1b4fa796..00000000 --- a/src/features/toggleDarkMode/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import ToggleDarkMode from "./ToggleDarkMode"; - -export default ToggleDarkMode; diff --git a/src/features/toggleMinMax/ToggleMinMax.vue b/src/features/toggleMinMax/ToggleMinMax.vue deleted file mode 100644 index e7c5c642..00000000 --- a/src/features/toggleMinMax/ToggleMinMax.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/src/features/toggleMinMax/index.js b/src/features/toggleMinMax/index.js deleted file mode 100644 index 1bd69dcc..00000000 --- a/src/features/toggleMinMax/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import ToggleMinMax from "./ToggleMinMax"; - -export default ToggleMinMax; diff --git a/src/main.js b/src/main.js deleted file mode 100644 index e8c4d169..00000000 --- a/src/main.js +++ /dev/null @@ -1,18 +0,0 @@ -import Vue from "vue"; -import App from "./app/App.vue"; -import store from "./app/providers/store"; -import router from "./app/providers/router"; -import vuetify from "@/app/plugins/vuetify"; -import sync from "./shared/lib/vuex-router-sync"; -import { settingsActions } from "@/widgets/settings"; -// adds reactive router module to global state -sync(store, router); -//loads app settings from the local storage (if there are any saved) -store.dispatch(settingsActions.LOAD_SETTINGS_FROM_STORAGE); - -new Vue({ - vuetify, - router, - store, - render: (h) => h(App), -}).$mount("#app"); diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 00000000..33fd8f1b --- /dev/null +++ b/src/main.ts @@ -0,0 +1,49 @@ +import App from "./app/App.vue"; +import { createApp } from "vue"; +import "@/style.css"; + +import store from "./app/providers/store"; +import router from "./app/providers/router"; +import sync from "./shared/lib/vuex-router-sync"; +import environment from "@/shared/api/environment"; +import PrimeVue from "primevue/config"; +import ToastService from "primevue/toastservice"; + +import { settingsActions } from "@/widgets/settings"; +import "primeicons/primeicons.css"; +import clickOutside from "@/shared/lib/directives/clickOutside"; +import Tooltip from "primevue/tooltip"; + +import { tailwindTheme } from "@/app/plugins/tailwind/tailwindStyles"; +import ConfirmationService from "primevue/confirmationservice"; +import resize from "@/shared/lib/directives/resize"; +import { errorActions } from "@/widgets/error"; +import errorMessages from "@/widgets/error/model/config/errorMessages"; +// adds reactive router module to global state + +sync(store, router); +environment.load().then(() => { + store.dispatch(settingsActions.LOAD_SETTINGS_FROM_STORAGE).then(() => { + const app = createApp(App); + app.config.errorHandler = (err) => { + // Handle the error globally + store.dispatch(errorActions.NEW_ERROR, { + userMessage: errorMessages.technicalError.codeError, + name: err.name, + details: err.message, + stack: err.stack, + type: "unexpected", + }); + }; + app + .directive("click-outside", clickOutside) + .directive("resize", resize) + .directive("tooltip", Tooltip) + .use(store) + .use(router) + .use(PrimeVue, { pt: tailwindTheme }) + .use(ConfirmationService) + .use(ToastService) + .mount("#app"); + }); +}); diff --git a/src/pages/info/Article.vue b/src/pages/info/Article.vue index 08c11af4..131e125a 100644 --- a/src/pages/info/Article.vue +++ b/src/pages/info/Article.vue @@ -1,47 +1,33 @@ + diff --git a/src/pages/info/Home.vue b/src/pages/info/Home.vue index 2772b138..f6269b22 100644 --- a/src/pages/info/Home.vue +++ b/src/pages/info/Home.vue @@ -1,50 +1,49 @@ + diff --git a/src/pages/model/lib/listeners.ts b/src/pages/model/lib/listeners.ts new file mode 100644 index 00000000..aea96618 --- /dev/null +++ b/src/pages/model/lib/listeners.ts @@ -0,0 +1,17 @@ +export const setSelectionAreaSignal = function ( + view, + store, + annotationsParentElement, + brushParentElement, + createAnnotations, + makeAnnotations, + createTooltip, + createBrush +) { + return view.addSignalListener("brush", () => { + const annotations = makeAnnotations(view); + createAnnotations(view, annotations, annotationsParentElement); + createTooltip(view); + createBrush(view, brushParentElement); + }); +}; diff --git a/src/pages/reports/network/NetworkComparisonTool/NetworkComparisonTool.vue b/src/pages/reports/network/NetworkComparisonTool/NetworkComparisonTool.vue new file mode 100644 index 00000000..a63acf89 --- /dev/null +++ b/src/pages/reports/network/NetworkComparisonTool/NetworkComparisonTool.vue @@ -0,0 +1,377 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptDashboard/NetworkConceptDashboard.vue b/src/pages/reports/network/NetworkConceptDashboard/NetworkConceptDashboard.vue new file mode 100644 index 00000000..855f239e --- /dev/null +++ b/src/pages/reports/network/NetworkConceptDashboard/NetworkConceptDashboard.vue @@ -0,0 +1,156 @@ + + + + + + diff --git a/src/pages/reports/network/NetworkConceptDashboard/index.css b/src/pages/reports/network/NetworkConceptDashboard/index.css new file mode 100644 index 00000000..622b38de --- /dev/null +++ b/src/pages/reports/network/NetworkConceptDashboard/index.css @@ -0,0 +1,1221 @@ +/* ve-table */ +/* ve-pagination */ +/* ve-checkbox */ +/* ve-radio */ +/* ve-select */ +/* ve-dropdown */ +/* ve-contextmenu */ +.ve-checkbox { + cursor: pointer; + font-size: 12px; + display: inline-block; + position: relative; + vertical-align: middle; +} +.ve-checkbox:hover .ve-checkbox-inner { + border-color: #108ee9; +} +.ve-checkbox-content { + white-space: nowrap; + cursor: pointer; + outline: none; + display: inline-block; + line-height: 1; + position: relative; + vertical-align: text-bottom; +} +.ve-checkbox-content:hover .ve-checkbox-inner { + border-color: #108ee9; +} +.ve-checkbox-content .ve-checkbox-input { + position: absolute; + left: 0; + z-index: 1; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); + top: 0; + bottom: 0; + right: 0; +} +.ve-checkbox-content .ve-checkbox-input:focus .ve-checkbox-inner { + border-color: #108ee9; +} +.ve-checkbox-content .ve-checkbox-inner { + position: relative; + top: 0; + left: 0; + display: block; + width: 16px; + height: 16px; + border: 1px solid #abbacc; + border-radius: 2px; + background-color: #fff; + transition: all 0.3s; +} +.ve-checkbox-content .ve-checkbox-inner:after { + transform: rotate(45deg) scale(0); + position: absolute; + left: 4px; + top: 2px; + display: table; + width: 6px; + height: 9px; + border: 2px solid #fff; + border-top: 0; + border-left: 0; + content: " "; + transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6); +} +.ve-checkbox .ve-checkbox-checked:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 2px; + border: 1px solid #108ee9; + content: ""; + animation-fill-mode: both; + visibility: hidden; +} +.ve-checkbox .ve-checkbox-checked .ve-checkbox-inner { + background-color: #108ee9; + border-color: #108ee9; +} +.ve-checkbox .ve-checkbox-checked .ve-checkbox-inner:after { + transform: rotate(45deg) scale(1); + position: absolute; + display: table; + border: 2px solid #fff; + border-top: 0; + border-left: 0; + content: " "; + transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; +} +.ve-checkbox .ve-checkbox-indeterminate .ve-checkbox-inner { + border-color: #d9d9d9; + position: relative; + top: 0; + left: 0; + direction: ltr; + background-color: #fff; + border: 1px solid #d9d9d9; + border-radius: 2px; + border-collapse: separate; + transition: all 0.3s; +} +.ve-checkbox .ve-checkbox-indeterminate .ve-checkbox-inner:after { + top: 50%; + left: 50%; + width: 8px; + height: 8px; + background-color: #108ee9; + border: 0; + -webkit-transform: translate(-50%, -50%) scale(1); + transform: translate(-50%, -50%) scale(1); + opacity: 1; + content: " "; +} +.ve-checkbox .ve-checkbox-indeterminate .ve-checkbox-inner:hover { + border-color: #108ee9; +} +.ve-checkbox .ve-checkbox-indeterminate.ve-checkbox-disabled .ve-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ve-checkbox .ve-checkbox-disabled { + cursor: not-allowed; +} +.ve-checkbox .ve-checkbox-disabled.ve-checkbox-checked .ve-checkbox-inner:after { + animation-name: none; + border-color: rgba(0, 0, 0, 0.25); +} +.ve-checkbox .ve-checkbox-disabled .ve-checkbox-input { + cursor: not-allowed; +} +.ve-checkbox .ve-checkbox-disabled .ve-checkbox-inner { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; + border-color: #d9d9d9 !important; + background-color: #f7f7f7; +} +.ve-checkbox .ve-checkbox-disabled .ve-checkbox-inner:after { + animation-name: none; + border-color: #f7f7f7; +} +.ve-checkbox-label { + margin: 0 6px 0 3px; + width: 100%; + color: #000000d9 !important; +} +.ve-contextmenu-popper { + z-index: 9999; + overflow: hidden; + border-radius: 4px; + border: 1px solid #e4e7ed; + background-color: #fff; + box-shadow: 0 2px 12px 0 #0000001a; +} +.ve-contextmenu { + display: flex; + flex-direction: row; +} +.ve-contextmenu-panel { + min-width: 180px; + min-height: 50px; + overflow: hidden; +} +.ve-contextmenu-panel .ve-contextmenu-list { + min-height: 100%; + margin: 0; + padding: 6px 0; + list-style: none; + box-sizing: border-box; +} +.ve-contextmenu-panel .ve-contextmenu-list .ve-contextmenu-node { + display: flex; + align-items: center; + padding: 0 30px 0 20px; + height: 34px; + justify-content: center; + outline: none; + color: #000000d9; + cursor: pointer; +} +.ve-contextmenu-panel .ve-contextmenu-list .ve-contextmenu-node:not(.ve-contextmenu-panel .ve-contextmenu-list .ve-contextmenu-node-disabled):hover { + background: #f5f7fa; + color: #409eff; +} +.ve-contextmenu-panel .ve-contextmenu-list .ve-contextmenu-node-active { + background: #f5f7fa; + color: #409eff; +} +.ve-contextmenu-panel .ve-contextmenu-list .ve-contextmenu-node-label { + flex: 1; + padding: 0 10px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.ve-contextmenu-panel .ve-contextmenu-list .ve-contextmenu-node-icon-postfix { + color: #666; +} +.ve-contextmenu-panel .ve-contextmenu-list .ve-contextmenu-node-disabled { + color: #c0c4cc; + cursor: not-allowed; +} +.ve-contextmenu-panel .ve-contextmenu-list .ve-contextmenu-node-disabled .ve-contextmenu-node-icon-postfix { + color: #c0c4cc; +} +.ve-contextmenu-panel .ve-contextmenu-list .ve-contextmenu-node-separator { + height: 1px; + margin: 5px 0px; +} +.ve-dropdown { + display: inline-table; + margin: 0; +} +.ve-dropdown a, +.ve-dropdown a:visited { + color: #000; + text-decoration: none; + outline: none; +} +.ve-dropdown .ve-dropdown-dt, +.ve-dropdown .ve-dropdown-items { + margin: 0px; + padding: 0px; +} +.ve-dropdown .ve-dropdown-dt-selected { + position: relative; + display: block; + border: 1px solid #c8cdd4; + border-radius: 2px; + font-size: 14px; + height: 32px; + line-height: 32px; +} +.ve-dropdown .ve-dropdown-dt-selected:hover { + color: #108ee9; + border-color: #108ee9; +} +.ve-dropdown .ve-dropdown-dt-selected .ve-dropdown-dt-selected-span { + width: 80%; + display: block !important; + /*修复会被别的样式覆盖的问题*/ + text-align: center; + cursor: pointer; + white-space: nowrap; + overflow: hidden; + padding-left: 2px; +} +.ve-dropdown .ve-dropdown-dt-selected .ve-dropdown-input { + appearance: none; + background-color: #fff; + background-image: none; + border: 1px solid #fff; + box-sizing: border-box; + color: #1f2d3d; + display: inline-block; + font-size: inherit; + line-height: 1; + outline: none; + padding-left: 2px; + transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + width: 80%; + text-align: left; +} +.ve-dropdown-popper { + z-index: 999; + /*操作功能开始*/ +} +.ve-dropdown-popper .ve-dropdown-dd, +.ve-dropdown-popper .ve-dropdown-items { + margin: 0px; + padding: 0px; +} +.ve-dropdown-popper .ve-dropdown-dd { + display: block; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items { + min-height: 50px; + overflow: hidden; + text-overflow: ellipsis; + word-wrap: normal; + white-space: nowrap; + top: 2px; + left: 0px; + list-style: none; + border-radius: 2px; + background-color: #fff; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04); + border: 1px solid #d1dbe5; + padding: 5px 0px; + width: auto; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper { + overflow: auto; + /* 单选 */ + /* 多选 */ +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li { + white-space: nowrap; + font-size: 14px; + height: 32px; + line-height: 32px; + background-color: #fff; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li a { + text-decoration: none; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li:hover { + background-color: #f3f3f3; + color: #108ee9; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li.active { + background-color: #e6f7ff; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li.active a { + color: #108ee9; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li.active:hover { + background-color: #e6f7ff; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li .ve-dropdown-items-li-a { + width: 100%; + display: block; + padding-left: 8px; + padding-right: 8px; + color: #000000d9; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li .ve-dropdown-items-li-a-left { + text-align: left; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li .ve-dropdown-items-li-a-center { + text-align: center; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-li .ve-dropdown-items-li-a-right { + text-align: right; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-multiple { + display: table; + padding: 0 5px; + width: 100%; + text-align: left; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-multiple .ve-checkbox { + width: 100%; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-multiple .ve-checkbox .ve-checkbox-label { + padding-left: 5px; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-multiple span { + font-size: 14px; + font-weight: normal; + color: #108ee9; +} +.ve-dropdown-popper .ve-dropdown-dd .ve-dropdown-items .ve-dropdown-items-warpper .ve-dropdown-items-multiple:hover { + background-color: #f3f3f3; +} +.ve-dropdown-popper .ve-dropdown-operation { + width: 100%; + margin-top: 5px; + padding: 8px 0 3px 0; + font-size: 14px; + border-top: 1px solid #e8e8e8; + display: flex; + justify-content: space-around; +} +.ve-dropdown-popper .ve-dropdown-operation .ve-dropdown-operation-item { + color: #495060; +} +.ve-dropdown-popper .ve-dropdown-operation .ve-dropdown-operation-item.ve-dropdown-filter-disable { + color: #999; +} +.ve-dropdown-popper .ve-dropdown-operation .ve-dropdown-operation-item:not(.ve-dropdown-filter-disable):hover { + color: #108ee9; +} +.ve-dropdown-popper .ve-dropdown-operation:last-child { + float: right; +} +.ve-dropdown-popper .ve-dropdown-operation:hover { + color: #f3f3f3; +} +.ve-icon { + display: inline-block; +} +.ve-loading-parent-relative { + position: relative !important; +} +.ve-loading-parent-lock { + overflow: hidden !important; +} +.ve-loading { + /* plane */ + /* bounce */ + /* wave */ + /* pulse */ + /* flow */ + /* grid */ +} +.ve-loading.ve-loading-overlay { + position: absolute; + z-index: 1999; + margin: 0; + top: 0; + right: 0; + bottom: 0; + left: 0; +} +.ve-loading.ve-loading-fixed { + position: fixed !important; +} +.ve-loading.ve-loading-hide { + display: none; +} +.ve-loading-spin-container { + position: absolute; + top: 50%; + margin-top: -20px; + margin-left: -20px; + width: 100%; + text-align: center; +} +.ve-loading-spin-container .ve-loading-spin { + display: inline-block; +} +.ve-loading-plane { + animation: sk-plane 1.2s infinite ease-in-out; +} +@keyframes sk-plane { + 0% { + transform: perspective(120px) rotateX(0deg) rotateY(0deg); + } + 50% { + transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + } + 100% { + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + } +} +.ve-loading-bounce { + position: relative; +} +.ve-loading-bounce-dot { + width: 100%; + height: 100%; + border-radius: 50%; + /* background-color: var(--sk-color); */ + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + animation: sk-bounce 2s infinite cubic-bezier(0.455, 0.03, 0.515, 0.955); +} +.ve-loading-bounce-dot:nth-child(2) { + animation-delay: -1s; +} +@keyframes sk-bounce { + 0%, + 100% { + transform: scale(0); + } + 45%, + 55% { + transform: scale(1); + } +} +.ve-loading-wave { + display: flex; + justify-content: space-between; +} +.ve-loading-wave-rect { + height: 100%; + width: 15%; + animation: sk-wave 1.2s infinite ease-in-out; +} +.ve-loading-wave-rect:nth-child(1) { + animation-delay: -1.2s; +} +.ve-loading-wave-rect:nth-child(2) { + animation-delay: -1.1s; +} +.ve-loading-wave-rect:nth-child(3) { + animation-delay: -1s; +} +.ve-loading-wave-rect:nth-child(4) { + animation-delay: -0.9s; +} +.ve-loading-wave-rect:nth-child(5) { + animation-delay: -0.8s; +} +@keyframes sk-wave { + 0%, + 40%, + 100% { + transform: scaleY(0.4); + } + 20% { + transform: scaleY(1); + } +} +.ve-loading-pulse { + width: var(--sk-size); + height: var(--sk-size); + background-color: var(--sk-color); + border-radius: 100%; + animation: sk-pulse 1.2s infinite cubic-bezier(0.455, 0.03, 0.515, 0.955); +} +@keyframes sk-pulse { + 0% { + transform: scale(0); + } + 100% { + transform: scale(1); + opacity: 0; + } +} +.ve-loading-flow { + width: calc(var(--sk-size) * 1.3); + height: calc(var(--sk-size) * 1.3); + display: flex; + justify-content: space-between; +} +.ve-loading-flow-dot { + width: 25%; + height: 25%; + background-color: var(--sk-color); + border-radius: 50%; + animation: sk-flow 1.4s cubic-bezier(0.455, 0.03, 0.515, 0.955) 0s infinite both; +} +.ve-loading-flow-dot:nth-child(1) { + animation-delay: -0.3s; +} +.ve-loading-flow-dot:nth-child(2) { + animation-delay: -0.15s; +} +@keyframes sk-flow { + 0%, + 80%, + 100% { + transform: scale(0.3); + } + 40% { + transform: scale(1); + } +} +.ve-loading-grid { + /* Cube positions + * 1 2 3 + * 4 5 6 + * 7 8 9 + */ +} +.ve-loading-grid-cube { + width: 33.33%; + height: 33.33%; + background-color: var(--sk-color); + float: left; + animation: sk-grid 1.3s infinite ease-in-out; +} +.ve-loading-grid-cube:nth-child(1) { + animation-delay: 0.2s; +} +.ve-loading-grid-cube:nth-child(2) { + animation-delay: 0.3s; +} +.ve-loading-grid-cube:nth-child(3) { + animation-delay: 0.4s; +} +.ve-loading-grid-cube:nth-child(4) { + animation-delay: 0.1s; +} +.ve-loading-grid:nth-child(5) { + animation-delay: 0.2s; +} +.ve-loading-grid-cube:nth-child(6) { + animation-delay: 0.3s; +} +.ve-loading-grid-cube:nth-child(7) { + animation-delay: 0s; +} +.ve-loading-grid-cube:nth-child(8) { + animation-delay: 0.1s; +} +.ve-loading-grid-cube:nth-child(9) { + animation-delay: 0.2s; +} +@keyframes sk-grid { + 0%, + 70%, + 100% { + transform: scale3D(1, 1, 1); + } + 35% { + transform: scale3D(0, 0, 1); + } +} +*, +:after, +:before { + box-sizing: border-box; +} +.ve-pagination { + font-size: 14px; + height: 32px; + line-height: 32px; + background-color: #fff; + margin: 0; + padding: 0; + display: inline-block; + margin: 0 4px; + list-style-type: none; +} +.ve-pagination .ve-pagination-total { + float: left; + margin: 0 4px; + color: #000000d9; +} +.ve-pagination .ve-pagination-select { + float: left; + margin: 0 4px; +} +.ve-pagination .ve-pagination-pager { + float: left; +} +.ve-pagination .ve-pagination-goto { + float: left; + margin: 0 4px; + color: #000000d9; +} +.ve-pagination .ve-pagination-goto .ve-pagination-goto-input { + width: 50px; + height: 32px; + padding: 1px 7px; + display: inline-block; + border: 1px solid #c8cdd4; + background-color: #fff; + background-image: none; + transition: border 0.2s ease-in-out, background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + border-radius: 4px; + color: #000000d9; +} +.ve-pagination .ve-pagination-goto .ve-pagination-goto-input:focus { + outline: none !important; + border-color: #108ee9; +} +.ve-pagination .ve-pagination-goto .ve-pagination-goto-input:hover { + border-color: #108ee9; +} +.ve-pagination .ve-pagination-li { + min-width: 32px; + height: 32px; + float: left; + margin-right: 4px; + cursor: pointer; + transition: all 0.1s ease-in-out; + text-align: center; + list-style: none; + background-color: #fff; + border: 1px solid #c8cdd4; + border-radius: 4px; +} +.ve-pagination .ve-pagination-li a { + color: #000000d9; +} +.ve-pagination .ve-pagination-li:hover { + border-color: #108ee9; +} +.ve-pagination .ve-pagination-li:hover a { + color: #108ee9; +} +.ve-pagination .ve-pagination-li.ve-pagination-li-active { + border-color: #108ee9; +} +.ve-pagination .ve-pagination-li.ve-pagination-li-active a { + font-weight: bold; + color: #108ee9; +} +.ve-pagination .ve-pagination-li.ve-pagination-li-active:hover { + border-color: #108ee9; +} +.ve-pagination .ve-pagination-li.ve-pagination-li-active:hover a { + font-weight: bold; + color: #108ee9; +} +.ve-pagination .ve-pagination-prev i, +.ve-pagination .ve-pagination-next i { + color: #666; +} +.ve-pagination .ve-pagination-prev:hover i, +.ve-pagination .ve-pagination-next:hover i { + color: #108ee9; +} +.ve-pagination .ve-pagination-jump-prev:after, +.ve-pagination .ve-pagination-jump-next:after { + content: "\2022\2022\2022"; + display: block; + letter-spacing: 1px; + color: #666; + text-align: center; +} +.ve-pagination .ve-pagination-jump-prev i, +.ve-pagination .ve-pagination-jump-prev:hover:after, +.ve-pagination .ve-pagination-jump-next i, +.ve-pagination .ve-pagination-jump-next:hover:after { + display: none; +} +.ve-pagination .ve-pagination-jump-prev:hover i, +.ve-pagination .ve-pagination-jump-next:hover i { + display: inline; + color: #108ee9; +} +.ve-pagination .ve-pagination-disabled { + cursor: not-allowed; + border-color: #c8cdd4; +} +.ve-pagination .ve-pagination-disabled:hover { + border-color: #c8cdd4; +} +.ve-pagination .ve-pagination-disabled:hover i { + color: #ccc; + cursor: not-allowed; +} +.ve-pagination .ve-pagination-disabled i { + color: #ccc; +} +.ve-radio *, +.ve-radio *:before, +.ve-radio *:after { + box-sizing: border-box; +} +.ve-radio { + margin: 0 8px 0 0; +} +.ve-radio, +.ve-radio .ve-radio-container { + padding: 0; + color: #000000d9; + font-size: 14px; + line-height: 22px; + list-style: none; + position: relative; + display: inline-block; + white-space: nowrap; + cursor: pointer; +} +.ve-radio .ve-radio-container { + margin: 0; + top: -1px; + line-height: 1; + vertical-align: sub; + outline: none; +} +.ve-radio .ve-radio-container .ve-radio-input { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + cursor: pointer; + opacity: 0; +} +.ve-radio .ve-radio-container .ve-radio-inner { + position: relative; + top: 0; + left: 0; + display: block; + width: 16px; + height: 16px; + background-color: #fff; + border: 1px solid #d9d9d9; + border-radius: 100px; + transition: all 0.3s; +} +.ve-radio .ve-radio-container .ve-radio-inner:after { + position: absolute; + top: 3px; + left: 3px; + display: table; + width: 8px; + height: 8px; + background-color: #108ee9; + border-top: 0; + border-left: 0; + border-radius: 8px; + transform: scale(0); + opacity: 0; + transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + content: " "; +} +.ve-radio .ve-radio-container.ve-radio-checked:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border: 1px solid #108ee9; + border-radius: 50%; + visibility: hidden; + animation-fill-mode: both; + content: ""; +} +.ve-radio .ve-radio-container.ve-radio-checked .ve-radio-inner { + border-color: #108ee9; +} +.ve-radio .ve-radio-container.ve-radio-checked .ve-radio-inner:after { + transform: scale(1); + opacity: 1; + transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ve-radio .ve-radio-container.ve-radio-disabled .ve-radio-input { + cursor: not-allowed; +} +.ve-radio .ve-radio-container.ve-radio-disabled .ve-radio-inner { + background-color: #f5f5f5; + border-color: #d9d9d9 !important; + cursor: not-allowed; +} +.ve-radio .ve-radio-container.ve-radio-disabled .ve-radio-inner:after { + background-color: #00000033; +} +.ve-radio .ve-radio-container.ve-radio-disabled + span { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +.ve-radio-label { + padding: 0 4px; + color: #000000d9; +} +.ve-select .ve-select-input { + appearance: none; + background-color: #fff; + background-image: none; + border: 1px solid #fff; + box-sizing: border-box; + color: #1f2d3d; + display: inline-block; + font-size: inherit; + line-height: 1; + outline: none; + padding-left: 2px; + transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + width: 80%; + text-align: left; +} +.ve-select .ve-select-selected-span { + width: 80%; + display: block !important; + /*修复会被别的样式覆盖的问题*/ + text-align: center; + cursor: pointer; + white-space: nowrap; + overflow: hidden; + padding-left: 2px; + color: #000000d9; +} +.ve-select .ve-select-toggle-icon { + display: inline-flex; + position: absolute; + line-height: 32px; + top: 0; + right: 5px; + color: #999; +} +.ve-select .ve-select-toggle-icon::before { + transform: rotate(0deg); + transition: transform 0.3s; +} +.ve-select .ve-select-toggle-icon.ve-select-show::before { + transform: rotate(180deg); + transition: transform 0.3s; +} +.ve-table *, +.ve-table *:before, +.ve-table *:after { + box-sizing: border-box; +} +.ve-table { + position: relative; + overflow: hidden; +} +.ve-table .ve-table-container { + position: relative; + overflow-y: auto; + height: 100%; + width: 100%; + user-select: text; +} +.ve-table .ve-table-container .ve-table-content-wrapper { + position: relative; + left: 0; + right: 0; + top: 0; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content { + min-width: 100%; + table-layout: fixed; + border-collapse: separate; + border-spacing: 0; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header tr.ve-table-header-tr { + height: 40px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header tr.ve-table-header-tr th.ve-table-header-th { + background-color: var(--v-accent-base); + padding: 10px; + font-weight: 500; + font-size: 14px; + +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header tr.ve-table-header-tr th.ve-table-header-th.ve-table-cell-indicator { + background-color: var(--v-base); +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header tr.ve-table-header-tr th.ve-table-header-th.ve-table-cell-indicator-active { + background-color: var(--v-base); + color: #fff; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header.ve-table-fixed-header tr th { + position: sticky; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th { + /* filter */ +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th.ve-table-fixed-left, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th.ve-table-fixed-right { + position: sticky; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th .ve-table-checkbox-wrapper { + width: 25px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th .ve-table-sort { + display: inline-block; + position: relative; + width: 16px; + height: 16px; + margin-left: 5px; + color: #bfbfbf; + cursor: pointer; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th .ve-table-sort .ve-table-sort-icon { + position: absolute; + display: block; + font-size: 14px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th .ve-table-sort .ve-table-sort-icon.ve-table-sort-icon-top { + top: 1px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th .ve-table-sort .ve-table-sort-icon.ve-table-sort-icon-bottom { + top: 9px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th .ve-table-sort .ve-table-sort-icon.active { + color: #108ee9; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th .ve-table-filter { + display: inline-block; + position: relative; + width: 0; + height: 16px; + cursor: pointer; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content thead.ve-table-header .ve-table-header-tr .ve-table-header-th .ve-table-filter .ve-table-filter-icon { + color: #000; + position: absolute; + top: 0; + left: 5px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-body-tr, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-expand-tr { + height: 40px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-body-tr td.ve-table-body-td, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-expand-tr td.ve-table-body-td, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-body-tr td.ve-table-expand-td, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-expand-tr td.ve-table-expand-td { + background-color: var(--v-base); + height: inherit; + font-size: 14px; + overflow: hidden; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-body-tr td.ve-table-body-td, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-expand-tr td.ve-table-body-td { + padding: 10px; + white-space: pre-wrap; + overflow: hidden; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-body-tr td.ve-table-operation-col, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-expand-tr td.ve-table-operation-col { + background-color: #fafafa; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-body-tr td.ve-table-operation-col.ve-table-cell-indicator, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-expand-tr td.ve-table-operation-col.ve-table-cell-indicator { + background-color: #eaebec; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-body-tr td.ve-table-operation-col.ve-table-cell-indicator-active, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-expand-tr td.ve-table-operation-col.ve-table-cell-indicator-active { + background-color: #5f6266; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-expand-tr { + display: table-row; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-body-row-scrolling > td { + background-color: #fff; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body.ve-table-stripe tr.ve-table-body-tr:nth-child(2n + 1) td { + background-color: #fafafa; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body.ve-table-row-hover tr.ve-table-body-tr:hover td { +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body.ve-table-row-highlight tr.ve-table-body-tr.ve-table-tr-highlight td { + background-color: #e0f3ff; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body .ve-table-body-tr .ve-table-body-td.ve-table-fixed-left, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body .ve-table-body-tr .ve-table-body-td.ve-table-fixed-right { + position: sticky; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body .ve-table-body-tr .ve-table-body-td .ve-table-row-expand-icon { + cursor: pointer; + display: inline-block; + width: 20px; + height: 20px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body .ve-table-body-tr .ve-table-body-td .ve-table-row-expand-icon i { + display: inline-flex; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body .ve-table-body-tr .ve-table-body-td .ve-table-row-expand-icon i::before { + transform: rotate(0deg); + transition: transform 0.3s; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body .ve-table-body-tr .ve-table-body-td .ve-table-row-expand-icon.ve-table-expand-icon-collapsed i::before { + transform: rotate(90deg); + transition: transform 0.3s; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body .ve-table-body-tr .ve-table-body-td .ve-table-checkbox-wrapper { + width: 25px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body .ve-table-body-tr .ve-table-body-td .ve-table-body-td-span-ellipsis { + overflow: hidden; + display: -webkit-box; + text-overflow: ellipsis; + /* -webkit-line-clamp: 1; */ + -webkit-box-orient: vertical; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body .ve-table-expand-tr .ve-table-expand-td-content { + position: sticky; + left: 0px; + padding: 0 10px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tfoot.ve-table-footer tr.ve-table-footer-tr { + height: 40px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tfoot.ve-table-footer tr.ve-table-footer-tr td.ve-table-footer-td { + background-color: #fafafa; + color: #000000d9; + padding: 10px; + font-size: 14px; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tfoot.ve-table-footer.ve-table-fixed-footer tr td { + position: sticky; +} +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tfoot.ve-table-footer .ve-table-footer-tr .ve-table-footer-td.ve-table-fixed-left, +.ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tfoot.ve-table-footer .ve-table-footer-tr .ve-table-footer-td.ve-table-fixed-right { + position: sticky; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-left .ve-table-selection-current .ve-table-selection-corner, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-left .ve-table-selection-normal-area .ve-table-selection-corner, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-left .ve-table-selection-autofill-area .ve-table-selection-corner { + position: absolute; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-left .ve-table-selection-current .ve-table-selection-border, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-left .ve-table-selection-normal-area .ve-table-selection-border, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-left .ve-table-selection-autofill-area .ve-table-selection-border { + position: absolute; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-left .ve-table-selection-normal-area-layer { + position: absolute; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-middle .ve-table-selection-current .ve-table-selection-corner, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-middle .ve-table-selection-normal-area .ve-table-selection-corner, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-middle .ve-table-selection-autofill-area .ve-table-selection-corner { + position: absolute; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-middle .ve-table-selection-current .ve-table-selection-border, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-middle .ve-table-selection-normal-area .ve-table-selection-border, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-middle .ve-table-selection-autofill-area .ve-table-selection-border { + position: absolute; + z-index: 0; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-middle .ve-table-selection-normal-area-layer { + position: absolute; + z-index: 0; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-right .ve-table-selection-current .ve-table-selection-corner, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-right .ve-table-selection-normal-area .ve-table-selection-corner, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-right .ve-table-selection-autofill-area .ve-table-selection-corner { + position: absolute; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-right .ve-table-selection-current .ve-table-selection-border, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-right .ve-table-selection-normal-area .ve-table-selection-border, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-right .ve-table-selection-autofill-area .ve-table-selection-border { + position: absolute; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-fixed-right .ve-table-selection-normal-area-layer { + position: absolute; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-normal-area-layer { + background-color: #0d65eb; + opacity: 0.1; + pointer-events: none; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-current .ve-table-selection-corner, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-normal-area .ve-table-selection-corner { + display: block; + height: 8px; + width: 8px; + background-color: #4b89ff; + cursor: crosshair; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-current .ve-table-selection-border, +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-normal-area .ve-table-selection-border { + display: block; + background-color: #4b89ff; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-autofill-area .ve-table-selection-border { + display: block; + background-color: #ff000085; +} +.ve-table .ve-table-container .ve-table-content-wrapper .ve-table-selection-wrapper .ve-table-selection-border { + pointer-events: none; +} +.ve-table .ve-table-container .ve-table-virtual-phantom.ve-table-virtual-scroll { + position: absolute; + left: 0; + top: 0; + right: 0; + z-index: -1; +} +.ve-table .ve-table-container.ve-table-container-left-scrolling .ve-table-last-left-fixed-column { + border-right-color: #ddd; +} +.ve-table .ve-table-container.ve-table-container-right-scrolling .ve-table-first-right-fixed-column { + border-left: 1px solid #ddd; +} +.ve-table .ve-table-container.ve-table-autofilling { + cursor: crosshair; +} +.ve-table .ve-table-container.ve-table-enable-cell-selection { + user-select: none; +} +.ve-table .ve-table-container .ve-table-border-x th, +.ve-table .ve-table-container .ve-table-border-x td { + border-bottom: 1px solid #eee; +} +.ve-table .ve-table-container .ve-table-border-x tr:first-child > th, +.ve-table .ve-table-container .ve-table-border-x tr.ve-table-footer-tr:first-child > td { + border-top: 1px solid #eee; +} +.ve-table .ve-table-container .ve-table-border-y th, +.ve-table .ve-table-container .ve-table-border-y td { + border-right: 1px solid #eee; +} +.ve-table .ve-table-container .ve-table-border-y th:first-child, +.ve-table .ve-table-container .ve-table-border-y td:first-child { + border-left: 1px solid #eee; +} +.ve-table.ve-table-border-around { +} +.ve-table.ve-table-border-around .ve-table-container table.ve-table-content.ve-table-border-x tr:last-child > td { + border-bottom: 0px; +} +.ve-table.ve-table-border-around .ve-table-container table.ve-table-content.ve-table-border-x tr:first-child > th { + border-top: 0px; +} +.ve-table.ve-table-border-around .ve-table-container table.ve-table-content.ve-table-border-y th.ve-table-last-column, +.ve-table.ve-table-border-around .ve-table-container table.ve-table-content.ve-table-border-y td:last-child { + border-right: 0px; +} +.ve-table.ve-table-border-around .ve-table-container table.ve-table-content.ve-table-border-y th:first-child, +.ve-table.ve-table-border-around .ve-table-container table.ve-table-content.ve-table-border-y td:first-child { + border-left: 0px; +} +.ve-table .ve-table-edit-input-container { + position: absolute; + right: auto; +} +.ve-table .ve-table-edit-input-container .ve-table-edit-input { + resize: none; + overflow-y: visible; + border: none; + outline-width: 0; + margin: 0; + padding: 1px 5px 0; + font-family: inherit; + line-height: 30px; + font-size: inherit; + border: 2px solid #2196f3; + box-shadow: 1px 2px 5px 0 #1f232966; + display: block; + color: #000; + border-radius: 0; + background-color: #fff; +} +.ve-table .ve-table-column-resizer-handler { + position: absolute; + cursor: col-resize; + top: 0; + bottom: 0; + width: 5px; + height: 40px; +} +.ve-table .ve-table-column-resizer-handler.active { + background-color: #4d90fe; +} +.ve-table .ve-table-column-resizer-line { + position: absolute; + pointer-events: none; + top: 0; + bottom: 0; + width: 0; + border-left: 1px solid #4d90fe; +} diff --git a/src/pages/reports/network/NetworkConceptReport.vue b/src/pages/reports/network/NetworkConceptReport.vue deleted file mode 100644 index 5768da30..00000000 --- a/src/pages/reports/network/NetworkConceptReport.vue +++ /dev/null @@ -1,210 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkConceptReport/NetworkConceptReport.vue b/src/pages/reports/network/NetworkConceptReport/NetworkConceptReport.vue new file mode 100644 index 00000000..1d90c279 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/NetworkConceptReport.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/RecordCountProportionByMonth/RecordCountProportionByMonth.vue b/src/pages/reports/network/NetworkConceptReport/charts/RecordCountProportionByMonth/RecordCountProportionByMonth.vue new file mode 100644 index 00000000..a33237f3 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/RecordCountProportionByMonth/RecordCountProportionByMonth.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/RecordCountProportionByMonth/specRecordProportionByMonth.ts b/src/pages/reports/network/NetworkConceptReport/charts/RecordCountProportionByMonth/specRecordProportionByMonth.ts new file mode 100644 index 00000000..7eadb154 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/RecordCountProportionByMonth/specRecordProportionByMonth.ts @@ -0,0 +1,134 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specRecordProportionByMonth(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + vconcat: [ + { + height: 150, + width: "container", + description: "Domain Data Density", + data: { name: "conceptData" }, + layer: [ + { + mark: { type: "circle" }, + params: [ + { + name: "source", + select: { type: "point", fields: ["SOURCE"] }, + bind: "legend", + }, + ], + encoding: { + opacity: { + condition: { param: "source", value: 1 }, + value: 0.2, + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + scale: { + zero: zeroBaseline, + }, + }, + }, + }, + { + params: [ + { + name: "index", + select: { + type: "point", + fields: ["date"], + on: "mousemove", + nearest: true, + }, + }, + ], + mark: { type: "point" }, + encoding: { + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + scale: { + zero: zeroBaseline, + }, + }, + opacity: { value: 0 }, + }, + }, + { + transform: [ + { + filter: { + and: ["index.date", { param: "index" }], + }, + }, + ], + mark: "rule", + encoding: { + y: { + height: 1, + }, + }, + }, + ], + encoding: { + x: { + field: "date", + type: "temporal", + timeUnit: "yearmonth", + scale: { domain: { selection: "brush" } }, + axis: { title: "" }, + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "Record Proportion per 1000", + scale: { + zero: zeroBaseline, + }, + }, + color: { field: "SOURCE", type: "nominal" }, + + tooltip: [ + { + field: "Y_PREVALENCE_1000PP", + title: "RPP1000", + type: "quantitative", + }, + { + field: "date", + title: "Date", + type: "temporal", + timeUnit: "yearmonth", + }, + ], + }, + }, + { + width: "container", + height: 25, + mark: "line", + data: { name: "conceptData" }, + selection: { + brush: { type: "interval", encodings: ["x"] }, + }, + encoding: { + x: { + field: "date", + type: "temporal", + title: "Date", + timeUnit: "yearmonth", + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "", + }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstDiagnosis/AgeAtFirstDiagnosis.vue b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstDiagnosis/AgeAtFirstDiagnosis.vue new file mode 100644 index 00000000..c589728f --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstDiagnosis/AgeAtFirstDiagnosis.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstDiagnosis/specAgeAtFirstDiagnosis.ts b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstDiagnosis/specAgeAtFirstDiagnosis.ts new file mode 100644 index 00000000..4ff437ec --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstDiagnosis/specAgeAtFirstDiagnosis.ts @@ -0,0 +1,79 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specAgeAtFirstDiagnosis( + zeroBaseline = false, + minMax = false, + labelColor +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + spec: { + height: 100, + width: "container", + encoding: { + y: { + field: "CATEGORY", + type: "nominal", + title: null, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: null, + }, + x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, + }, + }, + { + mark: { type: "bar", size: 14, tooltip: true }, + encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { field: "P25_VALUE", type: "quantitative" }, + x2: { field: "P75_VALUE" }, + color: { field: "CATEGORY", type: "nominal", legend: null }, + }, + }, + { + mark: { type: "tick", color: "white", size: 14 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstExposure/AgeAtFirstExposure.vue b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstExposure/AgeAtFirstExposure.vue new file mode 100644 index 00000000..e2a7c016 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstExposure/AgeAtFirstExposure.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstExposure/specAgeAtFirstExposure.ts b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstExposure/specAgeAtFirstExposure.ts new file mode 100644 index 00000000..d6742bba --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstExposure/specAgeAtFirstExposure.ts @@ -0,0 +1,84 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specAgeAtFirstExposure( + zeroBaseline = false, + minMax = false, + labelColor +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + spec: { + height: 100, + width: "container", + encoding: { + y: { + field: "CATEGORY", + type: "nominal", + title: null, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: null, + }, + x2: { field: "MAX_VALUE" }, + tooltip: { + field: minMax ? "MAX_VALUE" : "P90_VALUE", + }, + }, + }, + { + mark: { type: "bar", size: 14, tooltip: true }, + encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { + field: "P25_VALUE", + type: "quantitative", + }, + x2: { field: "P75_VALUE" }, + color: { field: "CATEGORY", type: "nominal" }, + }, + }, + { + mark: { type: "tick", color: "white", size: 14 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstOccurrence/AgeAtFirstOccurrence.vue b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstOccurrence/AgeAtFirstOccurrence.vue new file mode 100644 index 00000000..7db4e6bc --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstOccurrence/AgeAtFirstOccurrence.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstOccurrence/specAgeAtFirstOccurrence.ts b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstOccurrence/specAgeAtFirstOccurrence.ts new file mode 100644 index 00000000..49c748a0 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/ageAtFirstOccurrence/specAgeAtFirstOccurrence.ts @@ -0,0 +1,78 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specAgeAtFirstOccurrence( + zeroBaseline = false, + minMax = false, + labelColor +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + spec: { + height: 100, + width: "container", + encoding: { + y: { + field: "CATEGORY", + type: "nominal", + title: null, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: null, + }, + x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, + }, + }, + { + mark: { type: "bar", size: 14, tooltip: true }, + encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { field: "P25_VALUE", type: "quantitative" }, + x2: { field: "P75_VALUE" }, + color: { field: "CATEGORY", type: "nominal", legend: null }, + }, + }, + { + mark: { type: "tick", color: "white", size: 14 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/conditionsByType/ConditionsByType.vue b/src/pages/reports/network/NetworkConceptReport/charts/conditionsByType/ConditionsByType.vue new file mode 100644 index 00000000..fcd1a487 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/conditionsByType/ConditionsByType.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/conditionsByType/specConditionsByType.ts b/src/pages/reports/network/NetworkConceptReport/charts/conditionsByType/specConditionsByType.ts new file mode 100644 index 00000000..570e5bcc --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/conditionsByType/specConditionsByType.ts @@ -0,0 +1,73 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specConditionsByType(zeroBaseline = false, minMax, labelColor) { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + transform: [ + { + window: [ + { + op: "sum", + field: "COUNT_VALUE", + as: "TOTAL_VALUE", + }, + ], + frame: [null, null], + }, + { + calculate: "datum.COUNT_VALUE/datum.TOTAL_VALUE", + as: "PERCENT", + }, + ], + spec: { + width: "container", + height: 75, + mark: "bar", + encoding: { + tooltip: [ + { field: "CONCEPT_NAME", title: "Condition Type" }, + { field: "COUNT_VALUE", title: "Number of Records" }, + { field: "PERCENT", title: "% of Records", format: "0.2%" }, + ], + x: { + field: "PERCENT", + aggregate: "sum", + title: "% of Records", + format: "0%", + axis: { + format: "0%", + }, + }, + color: { + field: "CONCEPT_NAME", + type: "nominal", + legend: { + orient: "right", + columns: 2, + title: null, + }, + }, + order: { + aggregate: "sum", + field: "COUNT_VALUE", + sort: "descending", + }, + }, + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/daysSupply/DaysSupply.vue b/src/pages/reports/network/NetworkConceptReport/charts/daysSupply/DaysSupply.vue new file mode 100644 index 00000000..0c2a4deb --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/daysSupply/DaysSupply.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/daysSupply/specDaysSupply.ts b/src/pages/reports/network/NetworkConceptReport/charts/daysSupply/specDaysSupply.ts new file mode 100644 index 00000000..21a36c65 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/daysSupply/specDaysSupply.ts @@ -0,0 +1,67 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specDaysSupply( + zeroBaseline = false, + minMax = false, + labelColor +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "SOURCE", + type: "nominal", + title: null, + }, + spec: { + height: 100, + width: "container", + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: "Days Supply", + }, + x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, + }, + }, + { + mark: { type: "bar", size: 28, tooltip: true }, + encoding: { + tooltip: [ + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { field: "P25_VALUE", type: "quantitative" }, + x2: { field: "P75_VALUE" }, + }, + }, + { + mark: { type: "tick", color: "white", size: 28 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/drugsByType/DrugsByType.vue b/src/pages/reports/network/NetworkConceptReport/charts/drugsByType/DrugsByType.vue new file mode 100644 index 00000000..d1a7ad62 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/drugsByType/DrugsByType.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/drugsByType/specDrugsByType.ts b/src/pages/reports/network/NetworkConceptReport/charts/drugsByType/specDrugsByType.ts new file mode 100644 index 00000000..64ea138a --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/drugsByType/specDrugsByType.ts @@ -0,0 +1,73 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specDrugsByType(zeroBaseline = false, minMax, labelColor) { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + transform: [ + { + window: [ + { + op: "sum", + field: "COUNT_VALUE", + as: "TOTAL_VALUE", + }, + ], + frame: [null, null], + }, + { + calculate: "datum.COUNT_VALUE/datum.TOTAL_VALUE", + as: "PERCENT", + }, + ], + spec: { + width: "container", + height: 75, + mark: "bar", + encoding: { + tooltip: [ + { field: "CONCEPT_NAME", title: "Drug Type" }, + { field: "COUNT_VALUE", title: "Number of Records", format: "," }, + { field: "PERCENT", title: "% of Records", format: "0.2%" }, + ], + x: { + field: "PERCENT", + aggregate: "sum", + title: "% of Records", + format: "0%", + axis: { + format: "0%", + }, + }, + color: { + field: "CONCEPT_NAME", + type: "nominal", + legend: { + orient: "right", + columns: 2, + title: null, + }, + }, + order: { + aggregate: "sum", + field: "COUNT_VALUE", + sort: "descending", + }, + }, + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/lengthOfEra/LengthOfEra.vue b/src/pages/reports/network/NetworkConceptReport/charts/lengthOfEra/LengthOfEra.vue new file mode 100644 index 00000000..273c9d4e --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/lengthOfEra/LengthOfEra.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/lengthOfEra/specLengthOfEra.ts b/src/pages/reports/network/NetworkConceptReport/charts/lengthOfEra/specLengthOfEra.ts new file mode 100644 index 00000000..8bc2d76c --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/lengthOfEra/specLengthOfEra.ts @@ -0,0 +1,66 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specLengthOfEra( + zeroBaseline = false, + minMax = false, + labelColor +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + spec: { + height: 100, + width: "container", + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: "Number of Days", + }, + x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, + }, + }, + { + mark: { type: "bar", size: 28, tooltip: true }, + encoding: { + tooltip: [ + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { field: "P25_VALUE", type: "quantitative" }, + x2: { field: "P75_VALUE" }, + }, + }, + { + mark: { type: "tick", color: "white", size: 28 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/measurementValueDistributionChart/MeasurementValueDistributionChart.vue b/src/pages/reports/network/NetworkConceptReport/charts/measurementValueDistributionChart/MeasurementValueDistributionChart.vue new file mode 100644 index 00000000..3ca78af3 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/measurementValueDistributionChart/MeasurementValueDistributionChart.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specMeasurementValueDistribution.js b/src/pages/reports/network/NetworkConceptReport/charts/measurementValueDistributionChart/specMeasurementValueDistribution.ts similarity index 65% rename from src/widgets/chart/config/chartSpecifications/specMeasurementValueDistribution.js rename to src/pages/reports/network/NetworkConceptReport/charts/measurementValueDistributionChart/specMeasurementValueDistribution.ts index f266a9af..f2211c82 100644 --- a/src/widgets/chart/config/chartSpecifications/specMeasurementValueDistribution.js +++ b/src/pages/reports/network/NetworkConceptReport/charts/measurementValueDistributionChart/specMeasurementValueDistribution.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specMeasurementValueDistribution( zeroBaseline = false, @@ -6,7 +7,8 @@ export function specMeasurementValueDistribution( ) { return { $schema: VEGA_SCHEMA, - height: { step: "20" }, + height: { step: 20 }, + data: { name: "conceptData" }, width: "container", encoding: { y: { @@ -32,8 +34,18 @@ export function specMeasurementValueDistribution( }, }, { - mark: { type: "bar", size: 14, tooltip: {} }, + mark: { type: "bar", size: 14, tooltip: true }, encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], x: { field: "P25_VALUE", type: "quantitative" }, x2: { field: "P75_VALUE" }, color: { field: "CATEGORY", type: "nominal", legend: null }, diff --git a/src/pages/reports/network/NetworkConceptReport/charts/measurementsByType/MeasurementsByType.vue b/src/pages/reports/network/NetworkConceptReport/charts/measurementsByType/MeasurementsByType.vue new file mode 100644 index 00000000..82955c06 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/measurementsByType/MeasurementsByType.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/measurementsByType/specMeasurementsByType.ts b/src/pages/reports/network/NetworkConceptReport/charts/measurementsByType/specMeasurementsByType.ts new file mode 100644 index 00000000..90bb41b9 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/measurementsByType/specMeasurementsByType.ts @@ -0,0 +1,77 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specMeasurementsByType( + zeroBaseline = false, + minMax, + labelColor +) { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + transform: [ + { + window: [ + { + op: "sum", + field: "COUNT_VALUE", + as: "TOTAL_VALUE", + }, + ], + frame: [null, null], + }, + { + calculate: "datum.COUNT_VALUE/datum.TOTAL_VALUE", + as: "PERCENT", + }, + ], + spec: { + width: "container", + height: 75, + mark: "bar", + encoding: { + tooltip: [ + { field: "CONCEPT_NAME", title: "Measurement Type" }, + { field: "COUNT_VALUE", title: "Number of Records" }, + { field: "PERCENT", title: "% of Records", format: "0.2%" }, + ], + x: { + field: "PERCENT", + aggregate: "sum", + title: "% of Records", + format: "0%", + axis: { + format: "0%", + }, + }, + color: { + field: "CONCEPT_NAME", + type: "nominal", + legend: { + orient: "right", + columns: 2, + title: null, + }, + }, + order: { + aggregate: "sum", + field: "COUNT_VALUE", + sort: "descending", + }, + }, + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/quantityDistribution/QuantityDistribution.vue b/src/pages/reports/network/NetworkConceptReport/charts/quantityDistribution/QuantityDistribution.vue new file mode 100644 index 00000000..2e4973b3 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/quantityDistribution/QuantityDistribution.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/quantityDistribution/specQuantity.ts b/src/pages/reports/network/NetworkConceptReport/charts/quantityDistribution/specQuantity.ts new file mode 100644 index 00000000..3b06d212 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/quantityDistribution/specQuantity.ts @@ -0,0 +1,67 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specQuantity( + zeroBaseline = false, + minMax = false, + labelColor +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + spec: { + height: 100, + width: "container", + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: "Amount", + }, + x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, + }, + }, + { + mark: { type: "bar", size: 28, tooltip: true }, + encoding: { + tooltip: [ + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { field: "P25_VALUE", type: "quantitative" }, + x2: { field: "P75_VALUE" }, + }, + }, + { + mark: { type: "tick", color: "white", size: 28 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/recordsByUnit/RecordsByUnit.vue b/src/pages/reports/network/NetworkConceptReport/charts/recordsByUnit/RecordsByUnit.vue new file mode 100644 index 00000000..dd111b9c --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/recordsByUnit/RecordsByUnit.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/recordsByUnit/specRecordsByUnit.ts b/src/pages/reports/network/NetworkConceptReport/charts/recordsByUnit/specRecordsByUnit.ts new file mode 100644 index 00000000..a079a7b8 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/recordsByUnit/specRecordsByUnit.ts @@ -0,0 +1,75 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec, Config } from "vega-lite"; + +export function specRecordsByUnit(zeroBaseline = false, minNax, labelColor) { + return { + $schema: VEGA_SCHEMA, + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + data: { name: "conceptData" }, + transform: [ + { + window: [ + { + op: "sum", + field: "COUNT_VALUE", + as: "TOTAL_VALUE", + }, + ], + frame: [null, null], + }, + { + calculate: "datum.COUNT_VALUE/datum.TOTAL_VALUE", + as: "PERCENT", + }, + ], + + spec: { + width: "container", + autosize: "fit", + height: 75, + mark: "bar", + encoding: { + tooltip: [ + { field: "CONCEPT_NAME", title: "Unit Type" }, + { field: "COUNT_VALUE", title: "Number of Records", format: "," }, + { field: "PERCENT", title: "% of Records", format: "0.2%" }, + ], + x: { + field: "PERCENT", + aggregate: "sum", + title: "% of Records", + format: "0%", + axis: { + format: "0%", + }, + }, + color: { + field: "CONCEPT_NAME", + type: "nominal", + legend: { + orient: "right", + title: null, + columns: 2, + }, + }, + order: { + aggregate: "sum", + field: "COUNT_VALUE", + sort: "descending", + }, + }, + }, + }; +} diff --git a/src/pages/reports/network/NetworkConceptReport/charts/visitDurationByType/VisitDurationByType.vue b/src/pages/reports/network/NetworkConceptReport/charts/visitDurationByType/VisitDurationByType.vue new file mode 100644 index 00000000..f432a5bc --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/visitDurationByType/VisitDurationByType.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/src/pages/reports/network/NetworkConceptReport/charts/visitDurationByType/specVisitDurationByType.ts b/src/pages/reports/network/NetworkConceptReport/charts/visitDurationByType/specVisitDurationByType.ts new file mode 100644 index 00000000..d2dd6ef9 --- /dev/null +++ b/src/pages/reports/network/NetworkConceptReport/charts/visitDurationByType/specVisitDurationByType.ts @@ -0,0 +1,78 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specVisitDurationByType( + zeroBaseline = false, + minMax = false, + labelColor +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + facet: { + row: { + field: "SOURCE", + title: "Source", + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "Source", + type: "nominal", + title: null, + }, + spec: { + height: 100, + width: "container", + encoding: { + y: { + field: "CATEGORY", + type: "nominal", + title: null, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: null, + }, + x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, + }, + }, + { + mark: { type: "bar", size: 14, tooltip: true }, + encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { field: "P25_VALUE", type: "quantitative" }, + x2: { field: "P75_VALUE" }, + color: { field: "CATEGORY", type: "nominal", legend: null }, + }, + }, + { + mark: { type: "tick", color: "white", size: 14 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + }, + }; +} diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/DesiredDomains.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/DesiredDomains.vue deleted file mode 100644 index 97f74690..00000000 --- a/src/pages/reports/network/NetworkDataFeasibilityReport/DesiredDomains.vue +++ /dev/null @@ -1,227 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/DomainRequirements.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/DomainRequirements.vue deleted file mode 100644 index 446624b2..00000000 --- a/src/pages/reports/network/NetworkDataFeasibilityReport/DomainRequirements.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/FinalEstimation.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/FinalEstimation.vue deleted file mode 100644 index 1f615e58..00000000 --- a/src/pages/reports/network/NetworkDataFeasibilityReport/FinalEstimation.vue +++ /dev/null @@ -1,248 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/Range.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/Range.vue deleted file mode 100644 index 359cc40e..00000000 --- a/src/pages/reports/network/NetworkDataFeasibilityReport/Range.vue +++ /dev/null @@ -1,296 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/RequiredConcepts.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/RequiredConcepts.vue deleted file mode 100644 index 4363eeb8..00000000 --- a/src/pages/reports/network/NetworkDataFeasibilityReport/RequiredConcepts.vue +++ /dev/null @@ -1,433 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/VisitTypes.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/VisitTypes.vue deleted file mode 100644 index 94d149cb..00000000 --- a/src/pages/reports/network/NetworkDataFeasibilityReport/VisitTypes.vue +++ /dev/null @@ -1,135 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/components/DesiredDomains.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/components/DesiredDomains.vue new file mode 100644 index 00000000..f44b82fc --- /dev/null +++ b/src/pages/reports/network/NetworkDataFeasibilityReport/components/DesiredDomains.vue @@ -0,0 +1,217 @@ + + + + + + + diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/components/DomainRequirements.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/components/DomainRequirements.vue new file mode 100644 index 00000000..f664849c --- /dev/null +++ b/src/pages/reports/network/NetworkDataFeasibilityReport/components/DomainRequirements.vue @@ -0,0 +1,115 @@ + + + + + + diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/components/FinalEstimation.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/components/FinalEstimation.vue new file mode 100644 index 00000000..20d439b7 --- /dev/null +++ b/src/pages/reports/network/NetworkDataFeasibilityReport/components/FinalEstimation.vue @@ -0,0 +1,319 @@ + + + diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/components/Range.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/components/Range.vue new file mode 100644 index 00000000..1ea50826 --- /dev/null +++ b/src/pages/reports/network/NetworkDataFeasibilityReport/components/Range.vue @@ -0,0 +1,305 @@ + + + + + + + diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/components/RequiredConcepts.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/components/RequiredConcepts.vue new file mode 100644 index 00000000..6545d57e --- /dev/null +++ b/src/pages/reports/network/NetworkDataFeasibilityReport/components/RequiredConcepts.vue @@ -0,0 +1,307 @@ + + + + + + + diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/components/VisitTypes.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/components/VisitTypes.vue new file mode 100644 index 00000000..a1a444f3 --- /dev/null +++ b/src/pages/reports/network/NetworkDataFeasibilityReport/components/VisitTypes.vue @@ -0,0 +1,141 @@ + + + + + + + diff --git a/src/pages/reports/network/NetworkDataFeasibilityReport/index.vue b/src/pages/reports/network/NetworkDataFeasibilityReport/index.vue index 6bfec8ac..8f4c0c92 100644 --- a/src/pages/reports/network/NetworkDataFeasibilityReport/index.vue +++ b/src/pages/reports/network/NetworkDataFeasibilityReport/index.vue @@ -1,161 +1,92 @@ - + + diff --git a/src/pages/reports/network/NetworkDataQualitySummary.vue b/src/pages/reports/network/NetworkDataQualitySummary.vue deleted file mode 100644 index b5075faa..00000000 --- a/src/pages/reports/network/NetworkDataQualitySummary.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkDataQualitySummary/NetworkDataQualitySummary.vue b/src/pages/reports/network/NetworkDataQualitySummary/NetworkDataQualitySummary.vue new file mode 100644 index 00000000..5bec3503 --- /dev/null +++ b/src/pages/reports/network/NetworkDataQualitySummary/NetworkDataQualitySummary.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCategory/NetworkDataQualityIssuesByCategory.vue b/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCategory/NetworkDataQualityIssuesByCategory.vue new file mode 100644 index 00000000..35d567e3 --- /dev/null +++ b/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCategory/NetworkDataQualityIssuesByCategory.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specIssueStratificationByCategory.js b/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCategory/specIssueStratificationByCategory.ts similarity index 95% rename from src/widgets/chart/config/chartSpecifications/specIssueStratificationByCategory.js rename to src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCategory/specIssueStratificationByCategory.ts index 4cfe75db..59290711 100644 --- a/src/widgets/chart/config/chartSpecifications/specIssueStratificationByCategory.js +++ b/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCategory/specIssueStratificationByCategory.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specIssueStratificationByCategory(zeroBaseline = false) { return { @@ -6,6 +7,7 @@ export function specIssueStratificationByCategory(zeroBaseline = false) { width: "container", autosize: "fit", height: 200, + data: { name: "conceptData" }, mark: "bar", transform: [ { diff --git a/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCdmTable/NetworkDataQualityIssuesByCdmTable.vue b/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCdmTable/NetworkDataQualityIssuesByCdmTable.vue new file mode 100644 index 00000000..ef5b3abf --- /dev/null +++ b/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCdmTable/NetworkDataQualityIssuesByCdmTable.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specIssueStratificationByTable.js b/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCdmTable/specIssueStratificationByTable.ts similarity index 95% rename from src/widgets/chart/config/chartSpecifications/specIssueStratificationByTable.js rename to src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCdmTable/specIssueStratificationByTable.ts index 28d91e50..ded6c361 100644 --- a/src/widgets/chart/config/chartSpecifications/specIssueStratificationByTable.js +++ b/src/pages/reports/network/NetworkDataQualitySummary/charts/NetworkDataQualityIssuesByCdmTable/specIssueStratificationByTable.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specIssueStratificationByTable(zeroBaseline = false) { return { @@ -6,6 +7,7 @@ export function specIssueStratificationByTable(zeroBaseline = false) { width: "container", autosize: "fit", height: 300, + data: { name: "conceptData" }, mark: "bar", transform: [ { diff --git a/src/pages/reports/network/NetworkDatastrandReport.vue b/src/pages/reports/network/NetworkDatastrandReport.vue deleted file mode 100644 index 371b1ca8..00000000 --- a/src/pages/reports/network/NetworkDatastrandReport.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkDatastrandReport/NetworkDatastrandReport.vue b/src/pages/reports/network/NetworkDatastrandReport/NetworkDatastrandReport.vue new file mode 100644 index 00000000..271af703 --- /dev/null +++ b/src/pages/reports/network/NetworkDatastrandReport/NetworkDatastrandReport.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/pages/reports/network/NetworkDatastrandReport/specDatastrand.ts b/src/pages/reports/network/NetworkDatastrandReport/specDatastrand.ts new file mode 100644 index 00000000..25d7572a --- /dev/null +++ b/src/pages/reports/network/NetworkDatastrandReport/specDatastrand.ts @@ -0,0 +1,152 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; + +export const specDatastrand = (labelColor) => { + return { + $schema: "https://vega.github.io/schema/vega/v5.json", + description: "Data Strand Visualization", + autosize: { type: "fit-x", contains: "padding" }, + padding: 5, + data: [ + { + name: "source_0", + values: [], + }, + { + name: "data_0", + source: "source_0", + transform: [ + { + type: "filter", + expr: "indexof(['condition occurrence','drug exposure','measurement','observation','procedure occurrence','visit occurrence','device exposure'], lower(datum.domain)) >= 0", + }, + { + type: "joinaggregate", + as: ["total_records"], + ops: ["sum"], + fields: ["count_records"], + groupby: ["cdm_source_key"], + }, + { + type: "formula", + expr: "datum.count_records/datum.total_records", + as: "percent", + }, + { + type: "aggregate", + groupby: [ + "domain", + "percent", + "count_records", + "cdm_source_key", + "cdm_source_abbreviation", + "cdm_release_key", + ], + ops: ["sum", "sum"], + fields: ["percent", "count_records"], + as: ["sum_percent", "sum_count_records"], + }, + { + type: "stack", + groupby: ["cdm_source_key"], + field: "sum_percent", + sort: { field: ["sum_count_records"], order: ["descending"] }, + as: ["sum_percent_start", "sum_percent_end"], + offset: "zero", + }, + { + type: "filter", + expr: 'isValid(datum["sum_percent"]) && isFinite(+datum["sum_percent"])', + }, + ], + }, + ], + signals: [ + { + name: "selectDomain", + on: [{ events: "mousedown", update: "datum" }], + }, + { + name: "width", + init: "isFinite(containerSize()[0]) ? containerSize()[0] : 200", + on: [ + { + update: "isFinite(containerSize()[0]) ? containerSize()[0] : 200", + events: "window:resize", + }, + ], + }, + { name: "y_step", value: 20 }, + { + name: "height", + update: "bandspace(domain('y').length, 3, 3) * y_step", + }, + ], + marks: [ + { + name: "marks", + type: "rect", + style: ["bar"], + from: { data: "data_0" }, + encode: { + enter: { + strokeWidth: { value: 7 }, + }, + update: { + cornerRadius: { value: 10 }, + fill: { scale: "color", field: "domain" }, + tooltip: { + signal: + '{"Data Source": datum["cdm_source_abbreviation"], "Domain": isValid(datum["domain"]) ? datum["domain"] : ""+datum["domain"], "Percent": format(datum["sum_percent"], "0.2%"), "Number of Records": format(datum["count_records"], ",")}', + }, + x: { scale: "x", field: "sum_percent_end" }, + x2: { scale: "x", field: "sum_percent_start" }, + yc: { scale: "y", field: "cdm_source_key" }, + height: { value: 20 }, + }, + }, + }, + ], + scales: [ + { + name: "x", + type: "linear", + domain: { + data: "data_0", + fields: ["sum_percent_start", "sum_percent_end"], + }, + range: [0, { signal: "width" }], + nice: true, + zero: true, + }, + { + name: "y", + type: "band", + domain: { + data: "data_0", + field: "cdm_source_key", + sort: true, + }, + range: { step: { signal: "y_step" } }, + padding: 3, + }, + { + name: "color", + type: "ordinal", + domain: { data: "data_0", field: "domain", sort: true }, + range: "category", + }, + ], + axes: [{ scale: "y", orient: "left", zindex: 0, labelColor }], + legends: [ + { + columns: 2, + columnPadding: 15, + rowPadding: 10, + orient: "right", + fill: "color", + symbolType: "circle", + labelColor: labelColor, + }, + ], + }; +}; diff --git a/src/pages/reports/network/NetworkDiversityReport/NetworkDiversityReport.vue b/src/pages/reports/network/NetworkDiversityReport/NetworkDiversityReport.vue new file mode 100644 index 00000000..d2abd9fc --- /dev/null +++ b/src/pages/reports/network/NetworkDiversityReport/NetworkDiversityReport.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/pages/reports/network/NetworkDiversityReport/charts/ethnicityChart/EthnicityChart.vue b/src/pages/reports/network/NetworkDiversityReport/charts/ethnicityChart/EthnicityChart.vue new file mode 100644 index 00000000..d20a096f --- /dev/null +++ b/src/pages/reports/network/NetworkDiversityReport/charts/ethnicityChart/EthnicityChart.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/pages/reports/network/NetworkDiversityReport/charts/ethnicityChart/specEthnicity.ts b/src/pages/reports/network/NetworkDiversityReport/charts/ethnicityChart/specEthnicity.ts new file mode 100644 index 00000000..f59bd472 --- /dev/null +++ b/src/pages/reports/network/NetworkDiversityReport/charts/ethnicityChart/specEthnicity.ts @@ -0,0 +1,59 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specEthnicity(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + mark: "bar", + data: { name: "conceptData" }, + transform: [ + { + joinaggregate: [ + { + op: "sum", + field: "COUNT_VALUE", + as: "TOTAL_RECORDS", + }, + ], + groupby: ["CHECK_NAME", "DATA_SOURCE_KEY"], + }, + { + calculate: "datum.COUNT_VALUE/datum.TOTAL_RECORDS", + as: "PERCENT", + }, + ], + encoding: { + tooltip: [ + { field: "CONCEPT_NAME", title: "Ethnicity" }, + { field: "COUNT_VALUE", title: "Count" }, + { field: "PERCENT", title: "Percent", format: ",.2%" }, + ], + x: { + field: "PERCENT", + type: "quantitative", + aggregate: "sum", + title: "% of People", + axis: { + format: "0%", + }, + }, + y: { + field: "DATA_SOURCE_KEY", + type: "ordinal", + title: null, + scale: { + zero: zeroBaseline, + }, + }, + color: { + field: "CONCEPT_NAME", + legend: { + orient: "right", + columns: 2, + title: "Ethnicity", + }, + }, + }, + }; +} diff --git a/src/pages/reports/network/NetworkDiversityReport/charts/raceChart/RaceChart.vue b/src/pages/reports/network/NetworkDiversityReport/charts/raceChart/RaceChart.vue new file mode 100644 index 00000000..3da8f4f4 --- /dev/null +++ b/src/pages/reports/network/NetworkDiversityReport/charts/raceChart/RaceChart.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/pages/reports/network/NetworkDiversityReport/charts/raceChart/specRace.ts b/src/pages/reports/network/NetworkDiversityReport/charts/raceChart/specRace.ts new file mode 100644 index 00000000..76c39e60 --- /dev/null +++ b/src/pages/reports/network/NetworkDiversityReport/charts/raceChart/specRace.ts @@ -0,0 +1,65 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specRace(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + mark: "bar", + data: { name: "conceptData" }, + transform: [ + { + window: [ + { + op: "sum", + field: "COUNT_VALUE", + as: "TOTAL_VALUE", + }, + ], + frame: [null, null], + groupby: ["DATA_SOURCE_KEY"], + }, + { + calculate: "datum.COUNT_VALUE/datum.TOTAL_VALUE", + as: "PERCENT", + }, + ], + encoding: { + tooltip: [ + { field: "CONCEPT_NAME", title: "Race" }, + { field: "PERCENT", title: "Percent", format: "0.2%" }, + { field: "COUNT_VALUE", title: "Number of People", format: ",d" }, + ], + x: { + field: "PERCENT", + type: "quantitative", + aggregate: "sum", + title: "% of People", + axis: { + format: "0%", + }, + }, + y: { + field: "DATA_SOURCE_KEY", + type: "ordinal", + title: null, + scale: { + zero: zeroBaseline, + }, + }, + color: { + field: "CONCEPT_NAME", + type: "nominal", + legend: { + orient: "right", + title: "Race", + }, + }, + order: { + aggregate: "sum", + field: "COUNT_VALUE", + sort: "descending", + }, + }, + }; +} diff --git a/src/pages/reports/network/NetworkOverview.vue b/src/pages/reports/network/NetworkOverview.vue deleted file mode 100644 index b7f42b06..00000000 --- a/src/pages/reports/network/NetworkOverview.vue +++ /dev/null @@ -1,217 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkOverview/NetworkOverview.vue b/src/pages/reports/network/NetworkOverview/NetworkOverview.vue new file mode 100644 index 00000000..c8bc87de --- /dev/null +++ b/src/pages/reports/network/NetworkOverview/NetworkOverview.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/src/pages/reports/network/NetworkOverview/components/DataNetworkOverview.vue b/src/pages/reports/network/NetworkOverview/components/DataNetworkOverview.vue new file mode 100644 index 00000000..0fa021d2 --- /dev/null +++ b/src/pages/reports/network/NetworkOverview/components/DataNetworkOverview.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/src/pages/reports/network/NetworkOverview/components/DataSourcesList.vue b/src/pages/reports/network/NetworkOverview/components/DataSourcesList.vue new file mode 100644 index 00000000..fe18524c --- /dev/null +++ b/src/pages/reports/network/NetworkOverview/components/DataSourcesList.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/src/pages/reports/network/NetworkPerformance.vue b/src/pages/reports/network/NetworkPerformance.vue deleted file mode 100644 index d9a598b0..00000000 --- a/src/pages/reports/network/NetworkPerformance.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkPerformance/NetworkPerformance.vue b/src/pages/reports/network/NetworkPerformance/NetworkPerformance.vue new file mode 100644 index 00000000..7da1a240 --- /dev/null +++ b/src/pages/reports/network/NetworkPerformance/NetworkPerformance.vue @@ -0,0 +1,77 @@ + + + + + + diff --git a/src/pages/reports/network/NetworkPopulationReport.vue b/src/pages/reports/network/NetworkPopulationReport.vue deleted file mode 100644 index 0b19d5bd..00000000 --- a/src/pages/reports/network/NetworkPopulationReport.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkPopulationReport/NetworkPopulationReport.vue b/src/pages/reports/network/NetworkPopulationReport/NetworkPopulationReport.vue new file mode 100644 index 00000000..8f34b72b --- /dev/null +++ b/src/pages/reports/network/NetworkPopulationReport/NetworkPopulationReport.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/pages/reports/network/NetworkPopulationReport/charts/ageAtFirstObservation/AgeAtFirstObservation.vue b/src/pages/reports/network/NetworkPopulationReport/charts/ageAtFirstObservation/AgeAtFirstObservation.vue new file mode 100644 index 00000000..5aa0ab6e --- /dev/null +++ b/src/pages/reports/network/NetworkPopulationReport/charts/ageAtFirstObservation/AgeAtFirstObservation.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstObservationBySource.js b/src/pages/reports/network/NetworkPopulationReport/charts/ageAtFirstObservation/specAgeAtFirstObservation.ts similarity index 88% rename from src/widgets/chart/config/chartSpecifications/specAgeAtFirstObservationBySource.js rename to src/pages/reports/network/NetworkPopulationReport/charts/ageAtFirstObservation/specAgeAtFirstObservation.ts index 0f549cbd..ad639695 100644 --- a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstObservationBySource.js +++ b/src/pages/reports/network/NetworkPopulationReport/charts/ageAtFirstObservation/specAgeAtFirstObservation.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specAgeAtFirstObservationBySource(zeroBaseline = false) { +export function specAgeAtFirstObservation(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, height: 200, width: "container", + data: { name: "conceptData" }, encoding: { x: { field: "INTERVAL_INDEX", @@ -14,7 +16,7 @@ export function specAgeAtFirstObservationBySource(zeroBaseline = false) { y: { field: "PERCENT_VALUE", type: "quantitative", - axis: { format: "0.0%" }, + axis: { format: ",.2%" }, title: "% of Population", scale: { zero: zeroBaseline, @@ -22,8 +24,8 @@ export function specAgeAtFirstObservationBySource(zeroBaseline = false) { }, color: { field: "DATA_SOURCE_KEY", + type: "nominal", title: "Data Source", - legend: { orient: "right", columns: 2 }, }, }, layer: [ @@ -53,7 +55,7 @@ export function specAgeAtFirstObservationBySource(zeroBaseline = false) { x: { type: "single", on: "mousemove", - encodings: ["x"], + fields: ["INTERVAL_INDEX"], nearest: true, }, }, diff --git a/src/pages/reports/network/NetworkPopulationReport/charts/cumulativeObservation/CumulativeObservation.vue b/src/pages/reports/network/NetworkPopulationReport/charts/cumulativeObservation/CumulativeObservation.vue new file mode 100644 index 00000000..15a8be12 --- /dev/null +++ b/src/pages/reports/network/NetworkPopulationReport/charts/cumulativeObservation/CumulativeObservation.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specCumulativeObservationBySource.js b/src/pages/reports/network/NetworkPopulationReport/charts/cumulativeObservation/specCumulativeObservation.ts similarity index 88% rename from src/widgets/chart/config/chartSpecifications/specCumulativeObservationBySource.js rename to src/pages/reports/network/NetworkPopulationReport/charts/cumulativeObservation/specCumulativeObservation.ts index e2f41a45..c8f1ac96 100644 --- a/src/widgets/chart/config/chartSpecifications/specCumulativeObservationBySource.js +++ b/src/pages/reports/network/NetworkPopulationReport/charts/cumulativeObservation/specCumulativeObservation.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specCumulativeObservationBySource(zeroBaseline = false) { +export function specCumulativeObservation(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, height: 150, width: "container", + data: { name: "conceptData" }, encoding: { x: { field: "YEARS", @@ -15,18 +17,17 @@ export function specCumulativeObservationBySource(zeroBaseline = false) { field: "PERCENT_PEOPLE", type: "quantitative", title: "% of People", - axis: { format: "0.0%" }, + axis: { format: ",.2%" }, scale: { zero: zeroBaseline, }, }, color: { field: "DATA_SOURCE_KEY", + type: "nominal", title: "Data Source", - legend: { orient: "right", columns: 2 }, }, }, - layer: [ { mark: { type: "line", interpolate: "linear" }, @@ -54,7 +55,7 @@ export function specCumulativeObservationBySource(zeroBaseline = false) { x: { type: "single", on: "mousemove", - encodings: ["x"], + fields: ["YEARS"], nearest: true, }, }, diff --git a/src/pages/reports/network/NetworkUnmappedSourceCodes.vue b/src/pages/reports/network/NetworkUnmappedSourceCodes.vue deleted file mode 100644 index 62d5d84e..00000000 --- a/src/pages/reports/network/NetworkUnmappedSourceCodes.vue +++ /dev/null @@ -1,138 +0,0 @@ - - - - - diff --git a/src/pages/reports/network/NetworkUnmappedSourceCodes/NetworkUnmappedSourceCodes.vue b/src/pages/reports/network/NetworkUnmappedSourceCodes/NetworkUnmappedSourceCodes.vue new file mode 100644 index 00000000..fac7c06f --- /dev/null +++ b/src/pages/reports/network/NetworkUnmappedSourceCodes/NetworkUnmappedSourceCodes.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/pages/reports/release/CohortDrilldownReport/CohortDrilldownReport.vue b/src/pages/reports/release/CohortDrilldownReport/CohortDrilldownReport.vue new file mode 100644 index 00000000..34e081ac --- /dev/null +++ b/src/pages/reports/release/CohortDrilldownReport/CohortDrilldownReport.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/pages/reports/release/CohortDrilldownReport/reports/CohortCharacterizationTable.vue b/src/pages/reports/release/CohortDrilldownReport/reports/CohortCharacterizationTable.vue new file mode 100644 index 00000000..86e74090 --- /dev/null +++ b/src/pages/reports/release/CohortDrilldownReport/reports/CohortCharacterizationTable.vue @@ -0,0 +1,345 @@ + + + + + diff --git a/src/pages/reports/release/CohortDrilldownReport/reports/IndexEventBreakdownTable.vue b/src/pages/reports/release/CohortDrilldownReport/reports/IndexEventBreakdownTable.vue new file mode 100644 index 00000000..298943fc --- /dev/null +++ b/src/pages/reports/release/CohortDrilldownReport/reports/IndexEventBreakdownTable.vue @@ -0,0 +1,329 @@ + + + + + diff --git a/src/pages/reports/release/CohortDrilldownReport/reports/timeDistribution/TimeDistributionChart.vue b/src/pages/reports/release/CohortDrilldownReport/reports/timeDistribution/TimeDistributionChart.vue new file mode 100644 index 00000000..d326047b --- /dev/null +++ b/src/pages/reports/release/CohortDrilldownReport/reports/timeDistribution/TimeDistributionChart.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/pages/reports/release/CohortDrilldownReport/reports/timeDistribution/specCohortTimeDistribution.ts b/src/pages/reports/release/CohortDrilldownReport/reports/timeDistribution/specCohortTimeDistribution.ts new file mode 100644 index 00000000..f6a59861 --- /dev/null +++ b/src/pages/reports/release/CohortDrilldownReport/reports/timeDistribution/specCohortTimeDistribution.ts @@ -0,0 +1,51 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specCohortTimeDistribution( + zeroBaseline = false, + minMax = false, + labelColor +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "min_value" : "p_10_value", + type: "quantitative", + scale: { zero: false }, + title: "Time in Days", + }, + x2: { field: minMax ? "max_value" : "p_90_value" }, + }, + }, + { + mark: { type: "bar", size: 28, tooltip: true }, + encoding: { + tooltip: [ + { field: "min_value", title: "MIN_VALUE" }, + { field: "p_10_value", title: "P10_VALUE" }, + { field: "p_25_value", title: "P25_VALUE" }, + { field: "median_value", title: "MEDIAN_VALUE" }, + { field: "p_75_value", title: "P75_VALUE" }, + { field: "p_90_value", title: "P90_VALUE" }, + { field: "max_value", title: "MAX_VALUE" }, + ], + x: { field: "p_25_value", type: "quantitative" }, + x2: { field: "p_75_value" }, + }, + }, + { + mark: { type: "tick", color: "white", size: 28 }, + encoding: { + x: { field: "median_value", type: "quantitative" }, + }, + }, + ], + height: 100, + width: "container", + }; +} diff --git a/src/pages/reports/release/CohortsTable/CohortsTable.vue b/src/pages/reports/release/CohortsTable/CohortsTable.vue new file mode 100644 index 00000000..3ac844b9 --- /dev/null +++ b/src/pages/reports/release/CohortsTable/CohortsTable.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/pages/reports/release/CohortsTable/components/CohortsIndex.vue b/src/pages/reports/release/CohortsTable/components/CohortsIndex.vue new file mode 100644 index 00000000..e5e33d05 --- /dev/null +++ b/src/pages/reports/release/CohortsTable/components/CohortsIndex.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/pages/reports/release/ConceptReport.vue b/src/pages/reports/release/ConceptReport.vue deleted file mode 100644 index f548b438..00000000 --- a/src/pages/reports/release/ConceptReport.vue +++ /dev/null @@ -1,666 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/ConceptReport/ConceptReport.vue b/src/pages/reports/release/ConceptReport/ConceptReport.vue new file mode 100644 index 00000000..80adbfc0 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/ConceptReport.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/src/pages/reports/release/ConceptReport/charts/AgeAtFirstDiagnosis/AgeAtFirstDiagnosis.vue b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstDiagnosis/AgeAtFirstDiagnosis.vue new file mode 100644 index 00000000..1c025543 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstDiagnosis/AgeAtFirstDiagnosis.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstOccurrence.js b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstDiagnosis/specAgeAtFirstDiagnosis.ts similarity index 59% rename from src/widgets/chart/config/chartSpecifications/specAgeAtFirstOccurrence.js rename to src/pages/reports/release/ConceptReport/charts/AgeAtFirstDiagnosis/specAgeAtFirstDiagnosis.ts index f3c74c7d..e0532f3d 100644 --- a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstOccurrence.js +++ b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstDiagnosis/specAgeAtFirstDiagnosis.ts @@ -1,10 +1,15 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specAgeAtFirstOccurrence(zeroBaseline = false, minMax = false) { +export function specAgeAtFirstDiagnosis( + zeroBaseline = false, + minMax = false +): TopLevelSpec { return { $schema: VEGA_SCHEMA, height: 100, width: "container", + data: { name: "conceptData" }, encoding: { y: { field: "CATEGORY", @@ -29,8 +34,18 @@ export function specAgeAtFirstOccurrence(zeroBaseline = false, minMax = false) { }, }, { - mark: { type: "bar", size: 14, tooltip: {} }, + mark: { type: "bar", size: 14, tooltip: true }, encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], x: { field: "P25_VALUE", type: "quantitative" }, x2: { field: "P75_VALUE" }, color: { field: "CATEGORY", type: "nominal", legend: null }, diff --git a/src/pages/reports/release/ConceptReport/charts/AgeAtFirstExposure/AgeAtFirstExposure.vue b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstExposure/AgeAtFirstExposure.vue new file mode 100644 index 00000000..df9c5d5e --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstExposure/AgeAtFirstExposure.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstExposure.js b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstExposure/specAgeAtFirstExposure.ts similarity index 61% rename from src/widgets/chart/config/chartSpecifications/specAgeAtFirstExposure.js rename to src/pages/reports/release/ConceptReport/charts/AgeAtFirstExposure/specAgeAtFirstExposure.ts index e2808c70..0e3162ee 100644 --- a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstExposure.js +++ b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstExposure/specAgeAtFirstExposure.ts @@ -1,10 +1,15 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specAgeAtFirstExposure(zeroBaseline = false, minMax = false) { +export function specAgeAtFirstExposure( + zeroBaseline = false, + minMax = false +): TopLevelSpec { return { $schema: VEGA_SCHEMA, height: 100, width: "container", + data: { name: "conceptData" }, encoding: { y: { field: "CATEGORY", @@ -32,8 +37,18 @@ export function specAgeAtFirstExposure(zeroBaseline = false, minMax = false) { }, }, { - mark: { type: "bar", size: 14, tooltip: {} }, + mark: { type: "bar", size: 14, tooltip: true }, encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], x: { field: "P25_VALUE", type: "quantitative", diff --git a/src/pages/reports/release/ConceptReport/charts/AgeAtFirstOccurrence/AgeAtFirstOccurrence.vue b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstOccurrence/AgeAtFirstOccurrence.vue new file mode 100644 index 00000000..dfe3bb6f --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstOccurrence/AgeAtFirstOccurrence.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/src/pages/reports/release/ConceptReport/charts/AgeAtFirstOccurrence/specAgeAtFirstOccurrence.ts b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstOccurrence/specAgeAtFirstOccurrence.ts new file mode 100644 index 00000000..e616a469 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/AgeAtFirstOccurrence/specAgeAtFirstOccurrence.ts @@ -0,0 +1,62 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specAgeAtFirstOccurrence( + zeroBaseline = false, + minMax = false +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + height: 100, + width: "container", + data: { name: "conceptData" }, + encoding: { + y: { + field: "CATEGORY", + type: "nominal", + title: null, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: null, + }, + x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, + }, + }, + { + mark: { type: "bar", size: 14, tooltip: true }, + encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { field: "P25_VALUE", type: "quantitative" }, + x2: { field: "P75_VALUE" }, + color: { field: "CATEGORY", type: "nominal", legend: null }, + }, + }, + { + mark: { type: "tick", color: "white", size: 14 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/release/ConceptReport/charts/ConditionsByType/ConditionsByType.vue b/src/pages/reports/release/ConceptReport/charts/ConditionsByType/ConditionsByType.vue new file mode 100644 index 00000000..f3d76e6d --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/ConditionsByType/ConditionsByType.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specConditionsByType.js b/src/pages/reports/release/ConceptReport/charts/ConditionsByType/specConditionsByType.ts similarity index 94% rename from src/widgets/chart/config/chartSpecifications/specConditionsByType.js rename to src/pages/reports/release/ConceptReport/charts/ConditionsByType/specConditionsByType.ts index 6c4a442c..2538ce9f 100644 --- a/src/widgets/chart/config/chartSpecifications/specConditionsByType.js +++ b/src/pages/reports/release/ConceptReport/charts/ConditionsByType/specConditionsByType.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specConditionsByType(zeroBaseline = false) { return { @@ -6,6 +7,7 @@ export function specConditionsByType(zeroBaseline = false) { width: "container", height: 75, mark: "bar", + data: { name: "conceptData" }, transform: [ { window: [ diff --git a/src/pages/reports/release/ConceptReport/charts/DaysSupply/DaysSupply.vue b/src/pages/reports/release/ConceptReport/charts/DaysSupply/DaysSupply.vue new file mode 100644 index 00000000..2620c5ce --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/DaysSupply/DaysSupply.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specDaysSupply.js b/src/pages/reports/release/ConceptReport/charts/DaysSupply/specDaysSupply.ts similarity index 54% rename from src/widgets/chart/config/chartSpecifications/specDaysSupply.js rename to src/pages/reports/release/ConceptReport/charts/DaysSupply/specDaysSupply.ts index 5d563ebd..46d647e2 100644 --- a/src/widgets/chart/config/chartSpecifications/specDaysSupply.js +++ b/src/pages/reports/release/ConceptReport/charts/DaysSupply/specDaysSupply.ts @@ -1,10 +1,16 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specDaysSupply(zeroBaseline = false, minMax = false) { +export function specDaysSupply( + zeroBaseline = false, + minMax = false +): TopLevelSpec { return { $schema: VEGA_SCHEMA, height: 100, width: "container", + data: { name: "conceptData" }, + layer: [ { mark: { type: "rule" }, @@ -19,8 +25,17 @@ export function specDaysSupply(zeroBaseline = false, minMax = false) { }, }, { - mark: { type: "bar", size: 28, tooltip: {} }, + mark: { type: "bar", size: 28, tooltip: true }, encoding: { + tooltip: [ + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], x: { field: "P25_VALUE", type: "quantitative" }, x2: { field: "P75_VALUE" }, }, diff --git a/src/pages/reports/release/ConceptReport/charts/DrugsByType/DrugsByType.vue b/src/pages/reports/release/ConceptReport/charts/DrugsByType/DrugsByType.vue new file mode 100644 index 00000000..f93cc0c0 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/DrugsByType/DrugsByType.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specDrugsByType.js b/src/pages/reports/release/ConceptReport/charts/DrugsByType/specDrugsByType.ts similarity index 94% rename from src/widgets/chart/config/chartSpecifications/specDrugsByType.js rename to src/pages/reports/release/ConceptReport/charts/DrugsByType/specDrugsByType.ts index ee2b02dc..14187ec5 100644 --- a/src/widgets/chart/config/chartSpecifications/specDrugsByType.js +++ b/src/pages/reports/release/ConceptReport/charts/DrugsByType/specDrugsByType.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specDrugsByType(zeroBaseline = false) { return { @@ -6,6 +7,7 @@ export function specDrugsByType(zeroBaseline = false) { width: "container", height: 75, mark: "bar", + data: { name: "conceptData" }, transform: [ { window: [ diff --git a/src/pages/reports/release/ConceptReport/charts/LengthOfEra/LengthOfEra.vue b/src/pages/reports/release/ConceptReport/charts/LengthOfEra/LengthOfEra.vue new file mode 100644 index 00000000..6ee3cb14 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/LengthOfEra/LengthOfEra.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specLengthOfEra.js b/src/pages/reports/release/ConceptReport/charts/LengthOfEra/specLengthOfEra.ts similarity index 55% rename from src/widgets/chart/config/chartSpecifications/specLengthOfEra.js rename to src/pages/reports/release/ConceptReport/charts/LengthOfEra/specLengthOfEra.ts index e41185e3..954edf8d 100644 --- a/src/widgets/chart/config/chartSpecifications/specLengthOfEra.js +++ b/src/pages/reports/release/ConceptReport/charts/LengthOfEra/specLengthOfEra.ts @@ -1,10 +1,15 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specLengthOfEra(zeroBaseline = false, minMax = false) { +export function specLengthOfEra( + zeroBaseline = false, + minMax = false +): TopLevelSpec { return { $schema: VEGA_SCHEMA, height: 100, width: "container", + data: { name: "conceptData" }, layer: [ { mark: { type: "rule" }, @@ -19,8 +24,17 @@ export function specLengthOfEra(zeroBaseline = false, minMax = false) { }, }, { - mark: { type: "bar", size: 28, tooltip: {} }, + mark: { type: "bar", size: 28, tooltip: true }, encoding: { + tooltip: [ + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], x: { field: "P25_VALUE", type: "quantitative" }, x2: { field: "P75_VALUE" }, }, diff --git a/src/pages/reports/release/ConceptReport/charts/MeasurementValueDistribution/MeasurementValueDistribution.vue b/src/pages/reports/release/ConceptReport/charts/MeasurementValueDistribution/MeasurementValueDistribution.vue new file mode 100644 index 00000000..b8fdb862 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/MeasurementValueDistribution/MeasurementValueDistribution.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/src/pages/reports/release/ConceptReport/charts/MeasurementValueDistribution/specMeasurementValueDistribution.ts b/src/pages/reports/release/ConceptReport/charts/MeasurementValueDistribution/specMeasurementValueDistribution.ts new file mode 100644 index 00000000..4b176e15 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/MeasurementValueDistribution/specMeasurementValueDistribution.ts @@ -0,0 +1,67 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specMeasurementValueDistribution( + zeroBaseline = false, + minMax = false +) { + return { + $schema: VEGA_SCHEMA, + height: { step: 20 }, + width: "container", + data: { name: "conceptData" }, + encoding: { + y: { + field: "CATEGORY", + type: "nominal", + title: null, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: null, + }, + x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, + }, + }, + { + mark: { type: "bar", size: 14, tooltip: true }, + encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { field: "P25_VALUE", type: "quantitative" }, + x2: { field: "P75_VALUE" }, + color: { field: "CATEGORY", type: "nominal", legend: null }, + }, + }, + { + mark: { type: "tick", color: "white", size: 14 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + row: { + field: "CATEGORY", + type: "nominal", + title: "Measurement", + }, + }; +} diff --git a/src/pages/reports/release/ConceptReport/charts/MeasurementsByType/MeasurementsByType.vue b/src/pages/reports/release/ConceptReport/charts/MeasurementsByType/MeasurementsByType.vue new file mode 100644 index 00000000..a9ced242 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/MeasurementsByType/MeasurementsByType.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specMeasurementsByType.js b/src/pages/reports/release/ConceptReport/charts/MeasurementsByType/specMeasurementsByType.ts similarity index 94% rename from src/widgets/chart/config/chartSpecifications/specMeasurementsByType.js rename to src/pages/reports/release/ConceptReport/charts/MeasurementsByType/specMeasurementsByType.ts index 0fcc9fab..02ecf267 100644 --- a/src/widgets/chart/config/chartSpecifications/specMeasurementsByType.js +++ b/src/pages/reports/release/ConceptReport/charts/MeasurementsByType/specMeasurementsByType.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specMeasurementsByType(zeroBaseline = false) { return { @@ -6,6 +7,8 @@ export function specMeasurementsByType(zeroBaseline = false) { width: "container", height: 75, mark: "bar", + data: { name: "conceptData" }, + transform: [ { window: [ diff --git a/src/pages/reports/release/ConceptReport/charts/QuantityDistribution/QuantityDistribution.vue b/src/pages/reports/release/ConceptReport/charts/QuantityDistribution/QuantityDistribution.vue new file mode 100644 index 00000000..22149fed --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/QuantityDistribution/QuantityDistribution.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specQuantity.js b/src/pages/reports/release/ConceptReport/charts/QuantityDistribution/specQuantity.ts similarity index 54% rename from src/widgets/chart/config/chartSpecifications/specQuantity.js rename to src/pages/reports/release/ConceptReport/charts/QuantityDistribution/specQuantity.ts index 21d9ff16..bada9fe6 100644 --- a/src/widgets/chart/config/chartSpecifications/specQuantity.js +++ b/src/pages/reports/release/ConceptReport/charts/QuantityDistribution/specQuantity.ts @@ -1,10 +1,15 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specQuantity(zeroBaseline = false, minMax = false) { +export function specQuantity( + zeroBaseline = false, + minMax = false +): TopLevelSpec { return { $schema: VEGA_SCHEMA, height: 100, width: "container", + data: { name: "conceptData" }, layer: [ { mark: { type: "rule" }, @@ -19,8 +24,17 @@ export function specQuantity(zeroBaseline = false, minMax = false) { }, }, { - mark: { type: "bar", size: 28, tooltip: {} }, + mark: { type: "bar", size: 28, tooltip: true }, encoding: { + tooltip: [ + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], x: { field: "P25_VALUE", type: "quantitative" }, x2: { field: "P75_VALUE" }, }, diff --git a/src/pages/reports/release/ConceptReport/charts/RecordCountProportionByAgeSexYear/RecordCountProportionByAgeSexYear.vue b/src/pages/reports/release/ConceptReport/charts/RecordCountProportionByAgeSexYear/RecordCountProportionByAgeSexYear.vue new file mode 100644 index 00000000..7494e965 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/RecordCountProportionByAgeSexYear/RecordCountProportionByAgeSexYear.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specRecordProportionByAgeSexYear.js b/src/pages/reports/release/ConceptReport/charts/RecordCountProportionByAgeSexYear/specRecordProportionByAgeSexYear.ts similarity index 90% rename from src/widgets/chart/config/chartSpecifications/specRecordProportionByAgeSexYear.js rename to src/pages/reports/release/ConceptReport/charts/RecordCountProportionByAgeSexYear/specRecordProportionByAgeSexYear.ts index ca7337dd..411485e1 100644 --- a/src/widgets/chart/config/chartSpecifications/specRecordProportionByAgeSexYear.js +++ b/src/pages/reports/release/ConceptReport/charts/RecordCountProportionByAgeSexYear/specRecordProportionByAgeSexYear.ts @@ -1,16 +1,25 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specRecordProportionByAgeSexYear(zeroBaseline = false) { - console.log(zeroBaseline); +export function specRecordProportionByAgeSexYear( + zeroBaseline = false, + minMax, + labelColor +) { return { $schema: VEGA_SCHEMA, spacing: 10, autosize: { resize: true }, + data: { name: "conceptData" }, facet: { row: { field: "TRELLIS_NAME", title: "Age Deciles", sort: { field: "trellisOrder" }, + header: { + labelColor: labelColor, + titleColor: labelColor, + }, }, field: "TRELLIS_NAME", type: "nominal", diff --git a/src/pages/reports/release/ConceptReport/charts/RecordsByUnit/RecordsByUnit.vue b/src/pages/reports/release/ConceptReport/charts/RecordsByUnit/RecordsByUnit.vue new file mode 100644 index 00000000..f2d21f56 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/RecordsByUnit/RecordsByUnit.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specRecordsByUnit.js b/src/pages/reports/release/ConceptReport/charts/RecordsByUnit/specRecordsByUnit.ts similarity index 93% rename from src/widgets/chart/config/chartSpecifications/specRecordsByUnit.js rename to src/pages/reports/release/ConceptReport/charts/RecordsByUnit/specRecordsByUnit.ts index 21aaa7bd..47a476be 100644 --- a/src/widgets/chart/config/chartSpecifications/specRecordsByUnit.js +++ b/src/pages/reports/release/ConceptReport/charts/RecordsByUnit/specRecordsByUnit.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec, Config } from "vega-lite"; export function specRecordsByUnit(zeroBaseline = false) { return { @@ -7,6 +8,7 @@ export function specRecordsByUnit(zeroBaseline = false) { autosize: "fit", height: 75, mark: "bar", + data: { name: "conceptData" }, transform: [ { window: [ diff --git a/src/pages/reports/release/ConceptReport/charts/RecordsCountProportionByMonth/RecordCountProportionByMonth.vue b/src/pages/reports/release/ConceptReport/charts/RecordsCountProportionByMonth/RecordCountProportionByMonth.vue new file mode 100644 index 00000000..76be9c00 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/RecordsCountProportionByMonth/RecordCountProportionByMonth.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/pages/reports/release/ConceptReport/charts/RecordsCountProportionByMonth/specRecordProportionByMonth.ts b/src/pages/reports/release/ConceptReport/charts/RecordsCountProportionByMonth/specRecordProportionByMonth.ts new file mode 100644 index 00000000..75ccb667 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/RecordsCountProportionByMonth/specRecordProportionByMonth.ts @@ -0,0 +1,122 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specRecordProportionByMonth(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + vconcat: [ + { + height: 150, + width: "container", + description: "Domain Data Density", + data: { name: "conceptData" }, + + layer: [ + { + mark: { type: "circle" }, + encoding: { + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + scale: { + zero: zeroBaseline, + }, + }, + }, + }, + { + params: [ + { + name: "index", + select: { + type: "point", + fields: ["date"], + on: "mousemove", + nearest: true, + }, + }, + ], + mark: { type: "point" }, + encoding: { + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + scale: { + zero: zeroBaseline, + }, + }, + opacity: { value: 0 }, + }, + }, + { + transform: [ + { + filter: { + and: ["index.date", { param: "index" }], + }, + }, + ], + mark: "rule", + encoding: { + y: { + height: 1, + }, + }, + }, + ], + encoding: { + x: { + field: "date", + type: "temporal", + timeUnit: "yearmonth", + scale: { domain: { selection: "brush" } }, + axis: { title: "" }, + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "Record Proportion per 1000", + scale: { + zero: zeroBaseline, + }, + }, + tooltip: [ + { + field: "Y_PREVALENCE_1000PP", + title: "RPP1000", + type: "quantitative", + }, + { + field: "date", + title: "Date", + type: "temporal", + timeUnit: "yearmonth", + }, + ], + }, + }, + { + width: "container", + height: 25, + mark: "line", + data: { name: "conceptData" }, + selection: { + brush: { type: "interval", encodings: ["x"] }, + }, + encoding: { + x: { + field: "date", + type: "temporal", + title: "Date", + timeUnit: "yearmonth", + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "", + }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/release/ConceptReport/charts/RecordsCountProportionByMonth/specRecordProportionByMonthAnnotation.ts b/src/pages/reports/release/ConceptReport/charts/RecordsCountProportionByMonth/specRecordProportionByMonthAnnotation.ts new file mode 100644 index 00000000..c548426b --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/RecordsCountProportionByMonth/specRecordProportionByMonthAnnotation.ts @@ -0,0 +1,83 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specRecordProportionByMonthAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + vconcat: [ + { + height: 150, + width: "container", + description: "Domain Data Density", + data: { name: "conceptData" }, + + layer: [ + { + mark: { type: "circle" }, + encoding: { + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + scale: { + zero: zeroBaseline, + }, + }, + }, + }, + ], + encoding: { + x: { + field: "date", + type: "quantitative", + timeUnit: "yearmonth", + scale: { domain: { selection: "brush" } }, + axis: { title: "" }, + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "Record Proportion per 1000", + scale: { + zero: zeroBaseline, + }, + }, + tooltip: [ + { + field: "Y_PREVALENCE_1000PP", + title: "RPP1000", + type: "quantitative", + }, + { + field: "date", + title: "Date", + type: "temporal", + timeUnit: "yearmonth", + }, + ], + }, + }, + { + width: "container", + height: 25, + mark: "line", + data: { name: "conceptData" }, + selection: { + brush: { type: "interval", encodings: ["x"] }, + }, + encoding: { + x: { + field: "date", + type: "quantitative", + title: "Date", + timeUnit: "yearmonth", + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "", + }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/release/ConceptReport/charts/VisitDurationByType/VisitDurationByType.vue b/src/pages/reports/release/ConceptReport/charts/VisitDurationByType/VisitDurationByType.vue new file mode 100644 index 00000000..1033d35b --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/VisitDurationByType/VisitDurationByType.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/src/pages/reports/release/ConceptReport/charts/VisitDurationByType/specVisitDurationByType.ts b/src/pages/reports/release/ConceptReport/charts/VisitDurationByType/specVisitDurationByType.ts new file mode 100644 index 00000000..d58dbd60 --- /dev/null +++ b/src/pages/reports/release/ConceptReport/charts/VisitDurationByType/specVisitDurationByType.ts @@ -0,0 +1,62 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specVisitDurationByType( + zeroBaseline = false, + minMax = false +): TopLevelSpec { + return { + $schema: VEGA_SCHEMA, + height: 100, + width: "container", + data: { name: "conceptData" }, + encoding: { + y: { + field: "CATEGORY", + type: "nominal", + title: null, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "rule" }, + encoding: { + x: { + field: minMax ? "MIN_VALUE" : "P10_VALUE", + type: "quantitative", + scale: { zero: false }, + title: null, + }, + x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, + }, + }, + { + mark: { type: "bar", size: 14, tooltip: true }, + encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], + x: { field: "P25_VALUE", type: "quantitative" }, + x2: { field: "P75_VALUE" }, + color: { field: "CATEGORY", type: "nominal", legend: null }, + }, + }, + { + mark: { type: "tick", color: "white", size: 14 }, + encoding: { + x: { field: "MEDIAN_VALUE", type: "quantitative" }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/release/DataQualityResults.vue b/src/pages/reports/release/DataQualityResults.vue deleted file mode 100644 index ae666228..00000000 --- a/src/pages/reports/release/DataQualityResults.vue +++ /dev/null @@ -1,809 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/DataQualityResults/DataQualityResults.vue b/src/pages/reports/release/DataQualityResults/DataQualityResults.vue new file mode 100644 index 00000000..f180585c --- /dev/null +++ b/src/pages/reports/release/DataQualityResults/DataQualityResults.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/pages/reports/release/DataQualityResults/components/MetadataTable.vue b/src/pages/reports/release/DataQualityResults/components/MetadataTable.vue new file mode 100644 index 00000000..55b21c74 --- /dev/null +++ b/src/pages/reports/release/DataQualityResults/components/MetadataTable.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/pages/reports/release/DataQualityResults/components/OverviewTable.vue b/src/pages/reports/release/DataQualityResults/components/OverviewTable.vue new file mode 100644 index 00000000..d1098a41 --- /dev/null +++ b/src/pages/reports/release/DataQualityResults/components/OverviewTable.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/src/pages/reports/release/DataQualityResults/components/PivotDataTable.vue b/src/pages/reports/release/DataQualityResults/components/PivotDataTable.vue new file mode 100644 index 00000000..8cb5e9b2 --- /dev/null +++ b/src/pages/reports/release/DataQualityResults/components/PivotDataTable.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/pages/reports/release/DataQualityResults/components/ResultsTable.vue b/src/pages/reports/release/DataQualityResults/components/ResultsTable.vue new file mode 100644 index 00000000..500407c6 --- /dev/null +++ b/src/pages/reports/release/DataQualityResults/components/ResultsTable.vue @@ -0,0 +1,876 @@ + + + + + diff --git a/src/pages/reports/release/DeathReport.vue b/src/pages/reports/release/DeathReport.vue deleted file mode 100644 index cbf6bdf4..00000000 --- a/src/pages/reports/release/DeathReport.vue +++ /dev/null @@ -1,131 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/DeathReport/DeathReport.vue b/src/pages/reports/release/DeathReport/DeathReport.vue new file mode 100644 index 00000000..fbc1c853 --- /dev/null +++ b/src/pages/reports/release/DeathReport/DeathReport.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/pages/reports/release/DeathReport/charts/AgeAtDeath/AgeAtDeath.vue b/src/pages/reports/release/DeathReport/charts/AgeAtDeath/AgeAtDeath.vue new file mode 100644 index 00000000..9da8155a --- /dev/null +++ b/src/pages/reports/release/DeathReport/charts/AgeAtDeath/AgeAtDeath.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specAgeAtDeath.js b/src/pages/reports/release/DeathReport/charts/AgeAtDeath/specAgeAtDeath.ts similarity index 59% rename from src/widgets/chart/config/chartSpecifications/specAgeAtDeath.js rename to src/pages/reports/release/DeathReport/charts/AgeAtDeath/specAgeAtDeath.ts index 45a7bac1..f667d321 100644 --- a/src/widgets/chart/config/chartSpecifications/specAgeAtDeath.js +++ b/src/pages/reports/release/DeathReport/charts/AgeAtDeath/specAgeAtDeath.ts @@ -1,10 +1,15 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specAgeAtDeath(zeroBaseline = false, minMax = false) { +export function specAgeAtDeath( + zeroBaseline = false, + minMax = false +): TopLevelSpec { return { $schema: VEGA_SCHEMA, height: 100, width: "container", + data: { name: "conceptData" }, encoding: { y: { field: "CATEGORY", @@ -29,8 +34,18 @@ export function specAgeAtDeath(zeroBaseline = false, minMax = false) { }, }, { - mark: { type: "bar", size: 14, tooltip: {} }, + mark: { type: "bar", size: 14, tooltip: true }, encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], x: { field: "P25_VALUE", type: "quantitative" }, x2: { field: "P75_VALUE" }, color: { field: "CATEGORY", type: "nominal", legend: null }, diff --git a/src/pages/reports/release/DeathReport/charts/DeathByType/DeathByType.vue b/src/pages/reports/release/DeathReport/charts/DeathByType/DeathByType.vue new file mode 100644 index 00000000..df693d33 --- /dev/null +++ b/src/pages/reports/release/DeathReport/charts/DeathByType/DeathByType.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specDeathByType.js b/src/pages/reports/release/DeathReport/charts/DeathByType/specDeathByType.ts similarity index 94% rename from src/widgets/chart/config/chartSpecifications/specDeathByType.js rename to src/pages/reports/release/DeathReport/charts/DeathByType/specDeathByType.ts index 00975a5d..95427536 100644 --- a/src/widgets/chart/config/chartSpecifications/specDeathByType.js +++ b/src/pages/reports/release/DeathReport/charts/DeathByType/specDeathByType.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specDeathByType(zeroBaseline = false) { return { @@ -6,6 +7,8 @@ export function specDeathByType(zeroBaseline = false) { width: "container", height: 75, mark: "bar", + data: { name: "conceptData" }, + transform: [ { window: [ diff --git a/src/pages/reports/release/DeathReport/charts/RecordCountProportionByAgeSexYear/RecordCountProportionByAgeSexYear.vue b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByAgeSexYear/RecordCountProportionByAgeSexYear.vue new file mode 100644 index 00000000..05e16cd8 --- /dev/null +++ b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByAgeSexYear/RecordCountProportionByAgeSexYear.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/pages/reports/release/DeathReport/charts/RecordCountProportionByAgeSexYear/specRecordProportionByAgeSexYear.ts b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByAgeSexYear/specRecordProportionByAgeSexYear.ts new file mode 100644 index 00000000..411485e1 --- /dev/null +++ b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByAgeSexYear/specRecordProportionByAgeSexYear.ts @@ -0,0 +1,130 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specRecordProportionByAgeSexYear( + zeroBaseline = false, + minMax, + labelColor +) { + return { + $schema: VEGA_SCHEMA, + spacing: 10, + autosize: { resize: true }, + data: { name: "conceptData" }, + facet: { + row: { + field: "TRELLIS_NAME", + title: "Age Deciles", + sort: { field: "trellisOrder" }, + header: { + labelColor: labelColor, + titleColor: labelColor, + }, + }, + field: "TRELLIS_NAME", + type: "nominal", + title: null, + }, + spec: { + width: "container", + height: 30, + encoding: { + x: { + field: "X_CALENDAR_YEAR", + type: "quantitative", + title: "", + axis: { + format: "d", + }, + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "", + scale: { + zero: zeroBaseline, + }, + }, + color: { + title: "Sex", + field: "SERIES_NAME", + type: "nominal", + legend: { + orient: "right", + offset: 5, + }, + }, + tooltip: [ + { field: "X_CALENDAR_YEAR", title: "Year" }, + { + field: "Y_PREVALENCE_1000PP", + title: "Record Proportion per 1000", + }, + { field: "TRELLIS_NAME", title: "Age Decile" }, + ], + }, + layer: [ + { + mark: { type: "line", interpolate: "linear" }, + params: [ + { + name: "source", + select: { type: "point", fields: ["SERIES_NAME"] }, + bind: "legend", + }, + ], + encoding: { + opacity: { + condition: { param: "source", value: 1 }, + value: 0.2, + }, + }, + }, + { + selection: { + dataSource: { + type: "multi", + fields: ["SERIES_NAME"], + bind: "legend", + }, + x: { + type: "single", + on: "mousemove", + encodings: ["x"], + nearest: true, + }, + }, + transform: [ + { + filter: { selection: "dataSource" }, + }, + ], + mark: { type: "point", tooltip: true }, + }, + { + transform: [ + { + filter: { + and: ["x.X_CALENDAR_YEAR", { selection: "x" }], + }, + }, + { filter: { selection: "dataSource" } }, + ], + layer: [ + { + mark: "rule", + encoding: { + y: { + height: 1, + }, + color: { + value: "black", + }, + }, + }, + ], + }, + ], + }, + }; +} diff --git a/src/pages/reports/release/DeathReport/charts/RecordCountProportionByMonth/RecordCountProportionByMonth.vue b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByMonth/RecordCountProportionByMonth.vue new file mode 100644 index 00000000..52058fc0 --- /dev/null +++ b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByMonth/RecordCountProportionByMonth.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specRecordProportionByMonth.js b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByMonth/specRecordProportionByMonth.ts similarity index 97% rename from src/widgets/chart/config/chartSpecifications/specRecordProportionByMonth.js rename to src/pages/reports/release/DeathReport/charts/RecordCountProportionByMonth/specRecordProportionByMonth.ts index b2abd946..be9e9a42 100644 --- a/src/widgets/chart/config/chartSpecifications/specRecordProportionByMonth.js +++ b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByMonth/specRecordProportionByMonth.ts @@ -1,8 +1,10 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specRecordProportionByMonth(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, vconcat: [ { height: 150, diff --git a/src/widgets/chart/config/chartSpecifications/specRecordProportionByMonthByRelease.js b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByMonth/specRecordProportionByMonthAnnotation.ts similarity index 70% rename from src/widgets/chart/config/chartSpecifications/specRecordProportionByMonthByRelease.js rename to src/pages/reports/release/DeathReport/charts/RecordCountProportionByMonth/specRecordProportionByMonthAnnotation.ts index 54f19463..2f5f23ff 100644 --- a/src/widgets/chart/config/chartSpecifications/specRecordProportionByMonthByRelease.js +++ b/src/pages/reports/release/DeathReport/charts/RecordCountProportionByMonth/specRecordProportionByMonthAnnotation.ts @@ -1,21 +1,33 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specRecordProportionByMonthByRelease(zeroBaseline = false) { +export function specRecordProportionByMonthAnnotation(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, vconcat: [ { height: 150, width: "container", description: "Domain Data Density", - mark: { type: "circle", opacity: 0.5 }, - selection: { - release: { type: "multi", fields: ["release"], bind: "legend" }, - }, + layer: [ + { + mark: { type: "circle" }, + encoding: { + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + scale: { + zero: zeroBaseline, + }, + }, + }, + }, + ], encoding: { x: { field: "date", - type: "temporal", + type: "quantitative", timeUnit: "yearmonth", scale: { domain: { selection: "brush" } }, axis: { title: "" }, @@ -28,16 +40,7 @@ export function specRecordProportionByMonthByRelease(zeroBaseline = false) { zero: zeroBaseline, }, }, - color: { - title: "Release", - field: "release", - }, - opacity: { - condition: { selection: "release", value: 1 }, - value: 0.2, - }, tooltip: [ - { field: "release", title: "Release" }, { field: "Y_PREVALENCE_1000PP", title: "RPP1000", @@ -55,7 +58,7 @@ export function specRecordProportionByMonthByRelease(zeroBaseline = false) { { width: "container", height: 25, - mark: { type: "line", opacity: 0.5 }, + mark: "line", selection: { brush: { type: "interval", encodings: ["x"] }, }, @@ -71,9 +74,6 @@ export function specRecordProportionByMonthByRelease(zeroBaseline = false) { type: "quantitative", title: "", }, - color: { - field: "release", - }, }, }, ], diff --git a/src/pages/reports/release/DomainDensity.vue b/src/pages/reports/release/DomainDensity.vue deleted file mode 100644 index c50082cf..00000000 --- a/src/pages/reports/release/DomainDensity.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/DomainDensity/DomainDensity.vue b/src/pages/reports/release/DomainDensity/DomainDensity.vue new file mode 100644 index 00000000..c1259c68 --- /dev/null +++ b/src/pages/reports/release/DomainDensity/DomainDensity.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/pages/reports/release/DomainDensity/charts/DomainDensity/DomainDensity.vue b/src/pages/reports/release/DomainDensity/charts/DomainDensity/DomainDensity.vue new file mode 100644 index 00000000..442dafeb --- /dev/null +++ b/src/pages/reports/release/DomainDensity/charts/DomainDensity/DomainDensity.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/defOverview.js b/src/pages/reports/release/DomainDensity/charts/DomainDensity/defOverview.ts similarity index 97% rename from src/widgets/chart/config/chartSpecifications/defOverview.js rename to src/pages/reports/release/DomainDensity/charts/DomainDensity/defOverview.ts index 17baf4d0..459fe762 100644 --- a/src/widgets/chart/config/chartSpecifications/defOverview.js +++ b/src/pages/reports/release/DomainDensity/charts/DomainDensity/defOverview.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function defOverview(zeroBaseline = false) { return { @@ -10,6 +11,7 @@ export function defOverview(zeroBaseline = false) { as: "transformedDate", }, ], + data: { name: "conceptData" }, vconcat: [ { height: 150, @@ -58,7 +60,7 @@ export function defOverview(zeroBaseline = false) { selection: { x: { type: "single", - on: "mousemove", + on: "mouseover", fields: ["transformedDate"], nearest: true, }, diff --git a/src/pages/reports/release/DomainDensity/charts/DomainDensity/defOverviewAnnotation.ts b/src/pages/reports/release/DomainDensity/charts/DomainDensity/defOverviewAnnotation.ts new file mode 100644 index 00000000..da3d3cc3 --- /dev/null +++ b/src/pages/reports/release/DomainDensity/charts/DomainDensity/defOverviewAnnotation.ts @@ -0,0 +1,113 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function defOverviewAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + transform: [ + { + timeUnit: "yearmonth", + field: "date", + as: "transformedDate", + }, + ], + data: { name: "conceptData" }, + + vconcat: [ + { + height: 150, + width: "container", + description: "Domain Data Density", + selection: { + domain: { type: "multi", fields: ["domain"], bind: "legend" }, + }, + encoding: { + x: { + field: "date", + type: "quantitative", + timeUnit: "yearmonth", + scale: { domain: { selection: "brush" } }, + title: "Date", + }, + y: { + field: "records", + type: "quantitative", + title: "Records", + scale: { + zero: zeroBaseline, + }, + }, + color: { field: "domain", type: "nominal" }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear" }, + params: [ + { + name: "source", + select: { type: "point", fields: ["domain"] }, + bind: "legend", + }, + ], + encoding: { + opacity: { + condition: { param: "source", value: 1 }, + value: 0.2, + }, + }, + }, + { + mark: { type: "circle", interpolate: "linear" }, + }, + ], + }, + { + width: "container", + height: 50, + mark: "line", + selection: { + brush: { type: "interval", encodings: ["x"] }, + }, + encoding: { + x: { + field: "date", + type: "quantitative", + title: "Date", + timeUnit: "yearmonth", + }, + y: { + field: "records", + type: "quantitative", + axis: { title: "" }, + }, + color: { field: "domain", type: "nominal" }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear" }, + selection: { + brush: { type: "interval", encodings: ["x"] }, + }, + params: [ + { + name: "source", + select: { type: "point", fields: ["domain"] }, + bind: "legend", + }, + ], + encoding: { + opacity: { + condition: { param: "source", value: 1 }, + value: 0.2, + }, + }, + }, + { + transform: [{ filter: { param: "source" } }], + mark: { type: "point", tooltip: true }, + }, + ], + }, + ], + }; +} diff --git a/src/pages/reports/release/DomainDensity/charts/DomainRecordsPerPerson/DomainRecordsPerPerson.vue b/src/pages/reports/release/DomainDensity/charts/DomainRecordsPerPerson/DomainRecordsPerPerson.vue new file mode 100644 index 00000000..8062d0be --- /dev/null +++ b/src/pages/reports/release/DomainDensity/charts/DomainRecordsPerPerson/DomainRecordsPerPerson.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/defRecordsPerPerson.js b/src/pages/reports/release/DomainDensity/charts/DomainRecordsPerPerson/defRecordsPerPerson.ts similarity index 97% rename from src/widgets/chart/config/chartSpecifications/defRecordsPerPerson.js rename to src/pages/reports/release/DomainDensity/charts/DomainRecordsPerPerson/defRecordsPerPerson.ts index a05e7d49..01b75019 100644 --- a/src/widgets/chart/config/chartSpecifications/defRecordsPerPerson.js +++ b/src/pages/reports/release/DomainDensity/charts/DomainRecordsPerPerson/defRecordsPerPerson.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function defRecordsPerPerson(zeroBaseline = false) { return { @@ -10,6 +11,8 @@ export function defRecordsPerPerson(zeroBaseline = false) { as: "transformedDate", }, ], + data: { name: "conceptData" }, + vconcat: [ { height: 150, @@ -56,7 +59,7 @@ export function defRecordsPerPerson(zeroBaseline = false) { selection: { x: { type: "single", - on: "mousemove", + on: "mouseover", fields: ["transformedDate"], nearest: true, }, diff --git a/src/pages/reports/release/DomainDensity/charts/DomainRecordsPerPerson/defRecordsPerPersonAnnotation.ts b/src/pages/reports/release/DomainDensity/charts/DomainRecordsPerPerson/defRecordsPerPersonAnnotation.ts new file mode 100644 index 00000000..44c1f340 --- /dev/null +++ b/src/pages/reports/release/DomainDensity/charts/DomainRecordsPerPerson/defRecordsPerPersonAnnotation.ts @@ -0,0 +1,111 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function defRecordsPerPersonAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + transform: [ + { + timeUnit: "yearmonth", + field: "date", + as: "transformedDate", + }, + ], + data: { name: "conceptData" }, + + vconcat: [ + { + height: 150, + width: "container", + description: "Domain Data Density", + encoding: { + x: { + field: "date", + type: "quantitative", + axis: { title: "Date" }, + scale: { domain: { selection: "brush" } }, + timeUnit: "yearmonth", + }, + y: { + field: "records", + type: "quantitative", + title: "Records", + format: ",", + scale: { + zero: zeroBaseline, + }, + }, + color: { field: "domain", type: "nominal" }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear" }, + params: [ + { + name: "source", + select: { type: "point", fields: ["domain"] }, + bind: "legend", + }, + ], + encoding: { + opacity: { + condition: { param: "source", value: 1 }, + value: 0.2, + }, + }, + }, + { + mark: { type: "circle", interpolate: "linear" }, + }, + ], + }, + + { + width: "container", + height: 50, + encoding: { + x: { + field: "date", + type: "quantitative", + title: "Date", + timeUnit: "yearmonth", + }, + y: { + field: "records", + type: "quantitative", + axis: { title: "" }, + scale: { + zero: zeroBaseline, + }, + }, + color: { field: "domain", type: "nominal", title: "Domain" }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear" }, + selection: { + brush: { type: "interval", encodings: ["x"] }, + }, + params: [ + { + name: "source", + select: { type: "point", fields: ["domain"] }, + bind: "legend", + }, + ], + encoding: { + opacity: { + condition: { param: "source", value: 1 }, + value: 0.2, + }, + }, + }, + { + transform: [{ filter: { param: "source" } }], + mark: { type: "point", tooltip: true }, + }, + ], + }, + ], + }; +} diff --git a/src/pages/reports/release/DomainTable.vue b/src/pages/reports/release/DomainTable.vue deleted file mode 100644 index 8b8a045f..00000000 --- a/src/pages/reports/release/DomainTable.vue +++ /dev/null @@ -1,368 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/DomainTable/DomainTable.vue b/src/pages/reports/release/DomainTable/DomainTable.vue new file mode 100644 index 00000000..208a8488 --- /dev/null +++ b/src/pages/reports/release/DomainTable/DomainTable.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/pages/reports/release/DomainTable/components/DataStratificationByDrug/DataStratificationByDrug.vue b/src/pages/reports/release/DomainTable/components/DataStratificationByDrug/DataStratificationByDrug.vue new file mode 100644 index 00000000..0413eef3 --- /dev/null +++ b/src/pages/reports/release/DomainTable/components/DataStratificationByDrug/DataStratificationByDrug.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specDrugTypeStratification.js b/src/pages/reports/release/DomainTable/components/DataStratificationByDrug/specDrugTypeStratification.ts similarity index 84% rename from src/widgets/chart/config/chartSpecifications/specDrugTypeStratification.js rename to src/pages/reports/release/DomainTable/components/DataStratificationByDrug/specDrugTypeStratification.ts index 6f5310e2..0c586641 100644 --- a/src/widgets/chart/config/chartSpecifications/specDrugTypeStratification.js +++ b/src/pages/reports/release/DomainTable/components/DataStratificationByDrug/specDrugTypeStratification.ts @@ -1,10 +1,11 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specDrugTypeStratification(zeroBaseline = false) { +export function specDrugTypeStratification(zeroBaseline = false): TopLevelSpec { return { $schema: VEGA_SCHEMA, - data: null, width: "container", + data: { name: "conceptData" }, height: 300, mark: "bar", encoding: { diff --git a/src/pages/reports/release/DomainTable/components/DataStratificationByVisit/DataStratificationByVisit.vue b/src/pages/reports/release/DomainTable/components/DataStratificationByVisit/DataStratificationByVisit.vue new file mode 100644 index 00000000..efbce865 --- /dev/null +++ b/src/pages/reports/release/DomainTable/components/DataStratificationByVisit/DataStratificationByVisit.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specVisitStratification.js b/src/pages/reports/release/DomainTable/components/DataStratificationByVisit/specVisitStratification.ts similarity index 89% rename from src/widgets/chart/config/chartSpecifications/specVisitStratification.js rename to src/pages/reports/release/DomainTable/components/DataStratificationByVisit/specVisitStratification.ts index 3c3d471f..3252e3b6 100644 --- a/src/widgets/chart/config/chartSpecifications/specVisitStratification.js +++ b/src/pages/reports/release/DomainTable/components/DataStratificationByVisit/specVisitStratification.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec, Config } from "vega-lite"; export function specVisitStratification(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, width: "container", height: 300, + data: { name: "conceptData" }, mark: "bar", encoding: { y: { diff --git a/src/pages/reports/release/DomainTable/components/DomainMetadataTable.vue b/src/pages/reports/release/DomainTable/components/DomainMetadataTable.vue new file mode 100644 index 00000000..189612ee --- /dev/null +++ b/src/pages/reports/release/DomainTable/components/DomainMetadataTable.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/pages/reports/release/DomainTable/components/MainTable.vue b/src/pages/reports/release/DomainTable/components/MainTable.vue new file mode 100644 index 00000000..6132e467 --- /dev/null +++ b/src/pages/reports/release/DomainTable/components/MainTable.vue @@ -0,0 +1,571 @@ + + + + + diff --git a/src/pages/reports/release/Location/LocationReport.vue b/src/pages/reports/release/Location/LocationReport.vue new file mode 100644 index 00000000..d414ea83 --- /dev/null +++ b/src/pages/reports/release/Location/LocationReport.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/pages/reports/release/MetadataReport.vue b/src/pages/reports/release/MetadataReport.vue deleted file mode 100644 index 1295192a..00000000 --- a/src/pages/reports/release/MetadataReport.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/MetadataReport/MetadataReport.vue b/src/pages/reports/release/MetadataReport/MetadataReport.vue new file mode 100644 index 00000000..782e17f7 --- /dev/null +++ b/src/pages/reports/release/MetadataReport/MetadataReport.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/pages/reports/release/MetadataReport/tables/Metadata.vue b/src/pages/reports/release/MetadataReport/tables/Metadata.vue new file mode 100644 index 00000000..89a188e3 --- /dev/null +++ b/src/pages/reports/release/MetadataReport/tables/Metadata.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/pages/reports/release/MetadataReport/tables/SourceDetails.vue b/src/pages/reports/release/MetadataReport/tables/SourceDetails.vue new file mode 100644 index 00000000..8d510d1f --- /dev/null +++ b/src/pages/reports/release/MetadataReport/tables/SourceDetails.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/pages/reports/release/ObservationPeriodReport.vue b/src/pages/reports/release/ObservationPeriodReport.vue deleted file mode 100644 index 5e811d36..00000000 --- a/src/pages/reports/release/ObservationPeriodReport.vue +++ /dev/null @@ -1,234 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/ObservationPeriodReport/ObservationPeriodReport.vue b/src/pages/reports/release/ObservationPeriodReport/ObservationPeriodReport.vue new file mode 100644 index 00000000..20466494 --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/ObservationPeriodReport.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservation/AgeAtFirstObservation.vue b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservation/AgeAtFirstObservation.vue new file mode 100644 index 00000000..58081065 --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservation/AgeAtFirstObservation.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstObservation.js b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservation/specAgeAtFirstObservation.ts similarity index 94% rename from src/widgets/chart/config/chartSpecifications/specAgeAtFirstObservation.js rename to src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservation/specAgeAtFirstObservation.ts index c0717166..379555cd 100644 --- a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstObservation.js +++ b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservation/specAgeAtFirstObservation.ts @@ -1,10 +1,13 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specAgeAtFirstObservation(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, height: 200, width: "container", + data: { name: "conceptData" }, + encoding: { x: { field: "INTERVAL_INDEX", diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservation/specAgeAtFirstObservationAnnotation.ts b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservation/specAgeAtFirstObservationAnnotation.ts new file mode 100644 index 00000000..7087a71f --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservation/specAgeAtFirstObservationAnnotation.ts @@ -0,0 +1,33 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specAgeAtFirstObservationAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + height: 200, + width: "container", + data: { name: "conceptData" }, + + encoding: { + x: { + field: "INTERVAL_INDEX", + type: "quantitative", + title: "Age", + }, + y: { + field: "PERCENT_VALUE", + type: "quantitative", + axis: { format: ",.2%" }, + title: "% of Population", + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear" }, + }, + ], + }; +} diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservationBySex/AgeAtFirstObservationBySex.vue b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservationBySex/AgeAtFirstObservationBySex.vue new file mode 100644 index 00000000..ca5382ef --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservationBySex/AgeAtFirstObservationBySex.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specAgeBySex.js b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservationBySex/specAgeBySex.ts similarity index 65% rename from src/widgets/chart/config/chartSpecifications/specAgeBySex.js rename to src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservationBySex/specAgeBySex.ts index 83c724fc..5adc617c 100644 --- a/src/widgets/chart/config/chartSpecifications/specAgeBySex.js +++ b/src/pages/reports/release/ObservationPeriodReport/charts/AgeAtFirstObservationBySex/specAgeBySex.ts @@ -1,10 +1,13 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specAgeBySex(zeroBaseline = false, minMax = false) { return { $schema: VEGA_SCHEMA, height: 75, width: "container", + data: { name: "conceptData" }, + encoding: { y: { field: "CATEGORY", @@ -28,8 +31,18 @@ export function specAgeBySex(zeroBaseline = false, minMax = false) { }, }, { - mark: { type: "bar", size: 14, tooltip: {} }, + mark: { type: "bar", size: 14, tooltip: true }, encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], x: { field: "P25_VALUE", type: "quantitative" }, x2: { field: "P75_VALUE" }, color: { field: "CATEGORY", type: "nominal", legend: null }, diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/CumulativeObservation/CumulativeObservation.vue b/src/pages/reports/release/ObservationPeriodReport/charts/CumulativeObservation/CumulativeObservation.vue new file mode 100644 index 00000000..b3f5551a --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/CumulativeObservation/CumulativeObservation.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specCumulativeObservation.js b/src/pages/reports/release/ObservationPeriodReport/charts/CumulativeObservation/specCumulativeObservation.ts similarity index 94% rename from src/widgets/chart/config/chartSpecifications/specCumulativeObservation.js rename to src/pages/reports/release/ObservationPeriodReport/charts/CumulativeObservation/specCumulativeObservation.ts index 53ca6b01..79546e1f 100644 --- a/src/widgets/chart/config/chartSpecifications/specCumulativeObservation.js +++ b/src/pages/reports/release/ObservationPeriodReport/charts/CumulativeObservation/specCumulativeObservation.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specCumulativeObservation(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, height: 150, width: "container", + data: { name: "conceptData" }, encoding: { x: { field: "YEARS", diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/CumulativeObservation/specCumulativeObservationAnnotation.ts b/src/pages/reports/release/ObservationPeriodReport/charts/CumulativeObservation/specCumulativeObservationAnnotation.ts new file mode 100644 index 00000000..384782b9 --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/CumulativeObservation/specCumulativeObservationAnnotation.ts @@ -0,0 +1,44 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specCumulativeObservationAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + height: 150, + width: "container", + data: { name: "conceptData" }, + encoding: { + x: { + field: "YEARS", + type: "quantitative", + title: "Years of Observation", + }, + y: { + field: "PERCENT_PEOPLE", + type: "quantitative", + title: "% of People", + axis: { format: ",.2%" }, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear" }, + }, + ], + signals: [ + { + name: "brushCoordinates", + value: [0, 0, 0, 0], // [x1, y1, x2, y2] + }, + ], + on: [ + { + events: { signal: "brushCoordinates" }, + update: "notesBrush = brushCoordinates", + }, + ], + }; +} diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/ObservationOverTime/ObservationOverTime.vue b/src/pages/reports/release/ObservationPeriodReport/charts/ObservationOverTime/ObservationOverTime.vue new file mode 100644 index 00000000..36949169 --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/ObservationOverTime/ObservationOverTime.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specObservationByMonth.js b/src/pages/reports/release/ObservationPeriodReport/charts/ObservationOverTime/specObservationByMonth.ts similarity index 95% rename from src/widgets/chart/config/chartSpecifications/specObservationByMonth.js rename to src/pages/reports/release/ObservationPeriodReport/charts/ObservationOverTime/specObservationByMonth.ts index 10b6e336..934e1413 100644 --- a/src/widgets/chart/config/chartSpecifications/specObservationByMonth.js +++ b/src/pages/reports/release/ObservationPeriodReport/charts/ObservationOverTime/specObservationByMonth.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specObservationByMonth(zeroBaseline = false) { return { @@ -7,6 +8,8 @@ export function specObservationByMonth(zeroBaseline = false) { { height: 150, width: "container", + data: { name: "conceptData" }, + encoding: { x: { field: "DATE", @@ -92,6 +95,8 @@ export function specObservationByMonth(zeroBaseline = false) { width: "container", height: 50, mark: "line", + data: { name: "conceptData" }, + selection: { brush: { type: "interval", encodings: ["x"] }, }, diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/ObservationOverTime/specObservationByMonthAnnotation.ts b/src/pages/reports/release/ObservationPeriodReport/charts/ObservationOverTime/specObservationByMonthAnnotation.ts new file mode 100644 index 00000000..f03bc5e9 --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/ObservationOverTime/specObservationByMonthAnnotation.ts @@ -0,0 +1,81 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specObservationByMonthAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + vconcat: [ + { + height: 150, + width: "container", + data: { name: "conceptData" }, + + encoding: { + x: { + field: "DATE", + type: "quantitative", + scale: { domain: { selection: "brush" } }, + timeUnit: "yearmonth", + axis: { title: "" }, + }, + y: { + field: "PERCENT_VALUE", + type: "quantitative", + title: "% of People", + axis: { format: "%" }, + scale: { + zero: zeroBaseline, + }, + }, + tooltip: [ + { + field: "DATE", + title: "Date", + timeUnit: "yearmonth", + }, + { + field: "COUNT_VALUE", + title: "# of People", + format: ",", + }, + { + field: "PERCENT_VALUE", + title: "% of People", + format: "0.2%", + }, + ], + }, + layer: [ + { + mark: { + type: "line", + point: true, + strokeWidth: 1, + }, + encoding: { + y: { field: "PERCENT_VALUE", type: "quantitative" }, + }, + }, + ], + }, + { + width: "container", + height: 50, + mark: "line", + data: { name: "conceptData" }, + + selection: { + brush: { type: "interval", encodings: ["x"], resolve: "global" }, + }, + encoding: { + x: { field: "DATE", type: "temporal", title: "Date" }, + y: { + field: "COUNT_VALUE", + type: "quantitative", + axis: null, + }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/ObservationPeriodPerPerson/ObservationPeriodsPerPerson.vue b/src/pages/reports/release/ObservationPeriodReport/charts/ObservationPeriodPerPerson/ObservationPeriodsPerPerson.vue new file mode 100644 index 00000000..835db254 --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/ObservationPeriodPerPerson/ObservationPeriodsPerPerson.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationByAge/YearsOfObservationByAge.vue b/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationByAge/YearsOfObservationByAge.vue new file mode 100644 index 00000000..4d611f07 --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationByAge/YearsOfObservationByAge.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specObservationByAge.js b/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationByAge/specObservationByAge.ts similarity index 94% rename from src/widgets/chart/config/chartSpecifications/specObservationByAge.js rename to src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationByAge/specObservationByAge.ts index 6cf0be21..ed140029 100644 --- a/src/widgets/chart/config/chartSpecifications/specObservationByAge.js +++ b/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationByAge/specObservationByAge.ts @@ -1,10 +1,13 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specObservationByAge(zeroBaseline = false, minMax = false) { return { $schema: VEGA_SCHEMA, - height: { step: "20" }, + height: { step: 20 }, width: "container", + data: { name: "conceptData" }, + encoding: { y: { field: "CATEGORY", diff --git a/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationBySex/YearsOfObservationBySex.vue b/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationBySex/YearsOfObservationBySex.vue new file mode 100644 index 00000000..95f91bc5 --- /dev/null +++ b/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationBySex/YearsOfObservationBySex.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specObservationBySex.js b/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationBySex/specObservationBySex.ts similarity index 66% rename from src/widgets/chart/config/chartSpecifications/specObservationBySex.js rename to src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationBySex/specObservationBySex.ts index 5f6e6e48..3cbc3b4b 100644 --- a/src/widgets/chart/config/chartSpecifications/specObservationBySex.js +++ b/src/pages/reports/release/ObservationPeriodReport/charts/YearsOfObservationBySex/specObservationBySex.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specObservationBySex(zeroBaseline = false, minMax = false) { return { $schema: VEGA_SCHEMA, height: 75, width: "container", + data: { name: "conceptData" }, encoding: { y: { field: "CATEGORY", @@ -29,8 +31,18 @@ export function specObservationBySex(zeroBaseline = false, minMax = false) { }, }, { - mark: { type: "bar", size: 14, tooltip: {} }, + mark: { type: "bar", size: 14, tooltip: true }, encoding: { + tooltip: [ + { field: "CATEGORY", title: "CATEGORY" }, + { field: "MIN_VALUE", title: "MIN_VALUE" }, + { field: "P10_VALUE", title: "P10_VALUE" }, + { field: "P25_VALUE", title: "P25_VALUE" }, + { field: "MEDIAN_VALUE", title: "MEDIAN_VALUE" }, + { field: "P75_VALUE", title: "P75_VALUE" }, + { field: "P90_VALUE", title: "P90_VALUE" }, + { field: "MAX_VALUE", title: "MAX_VALUE" }, + ], x: { field: "P25_VALUE", type: "quantitative" }, x2: { field: "P75_VALUE" }, color: { field: "CATEGORY", type: "nominal", legend: null }, diff --git a/src/pages/reports/release/PerformanceReport/PerformanceTable.vue b/src/pages/reports/release/PerformanceReport/PerformanceTable.vue new file mode 100644 index 00000000..7bb1082e --- /dev/null +++ b/src/pages/reports/release/PerformanceReport/PerformanceTable.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/pages/reports/release/PerformanceReport/components/AchillesPerformance.vue b/src/pages/reports/release/PerformanceReport/components/AchillesPerformance.vue new file mode 100644 index 00000000..55d0965b --- /dev/null +++ b/src/pages/reports/release/PerformanceReport/components/AchillesPerformance.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/src/pages/reports/release/PerformanceReport/components/CohortDiagnosticsPerformance.vue b/src/pages/reports/release/PerformanceReport/components/CohortDiagnosticsPerformance.vue new file mode 100644 index 00000000..1fc5a3ec --- /dev/null +++ b/src/pages/reports/release/PerformanceReport/components/CohortDiagnosticsPerformance.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/pages/reports/release/PerformanceTable.vue b/src/pages/reports/release/PerformanceTable.vue deleted file mode 100644 index 4a6f19d1..00000000 --- a/src/pages/reports/release/PerformanceTable.vue +++ /dev/null @@ -1,137 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/PersonReport.vue b/src/pages/reports/release/PersonReport.vue deleted file mode 100644 index 4a9743b1..00000000 --- a/src/pages/reports/release/PersonReport.vue +++ /dev/null @@ -1,162 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/PersonReport/PersonReport.vue b/src/pages/reports/release/PersonReport/PersonReport.vue new file mode 100755 index 00000000..ea23d9e1 --- /dev/null +++ b/src/pages/reports/release/PersonReport/PersonReport.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/pages/reports/release/PersonReport/charts/PopulationByAgeSex/PopulationByAgeSex.vue b/src/pages/reports/release/PersonReport/charts/PopulationByAgeSex/PopulationByAgeSex.vue new file mode 100644 index 00000000..1b7d29aa --- /dev/null +++ b/src/pages/reports/release/PersonReport/charts/PopulationByAgeSex/PopulationByAgeSex.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/src/pages/reports/release/PersonReport/charts/PopulationByAgeSex/specAgeSex.ts b/src/pages/reports/release/PersonReport/charts/PopulationByAgeSex/specAgeSex.ts new file mode 100644 index 00000000..e6b26038 --- /dev/null +++ b/src/pages/reports/release/PersonReport/charts/PopulationByAgeSex/specAgeSex.ts @@ -0,0 +1,51 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specAgeSex(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + height: 75, + data: { name: "conceptData" }, + mark: "bar", + transform: [{ filter: "datum.AGE >= 0" }], + encoding: { + tooltip: [ + { field: "CONCEPT_NAME", title: "Sex" }, + { field: "AGE", title: "Age" }, + { field: "COUNT_VALUE", title: "# of People", format: "," }, + ], + color: {}, + /* color: { + field: "CONCEPT_NAME", + legend: null, + },*/ + /*row: { + field: "CONCEPT_NAME", + title: null, + header: { + title: "Number of People", + labelOrient: "top", + labelAnchor: "start", + labelFontSize: 12, + labelPadding: 2, + labelFontWeight: "bold", + }, + },*/ + x: { + field: "AGE", + title: "Age at First Observation", + type: "quantitative", + scale: { domain: [0, 100] }, + }, + y: { + aggregate: "sum", + field: "COUNT_VALUE", + title: "Number of People", + scale: { + zero: zeroBaseline, + }, + }, + }, + }; +} diff --git a/src/widgets/chart/config/chartSpecifications/specAgeSex.js b/src/pages/reports/release/PersonReport/charts/PopulationByAgeSex/specAgeSexAnnotation.ts similarity index 89% rename from src/widgets/chart/config/chartSpecifications/specAgeSex.js rename to src/pages/reports/release/PersonReport/charts/PopulationByAgeSex/specAgeSexAnnotation.ts index c030b124..fbd75f83 100644 --- a/src/widgets/chart/config/chartSpecifications/specAgeSex.js +++ b/src/pages/reports/release/PersonReport/charts/PopulationByAgeSex/specAgeSexAnnotation.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specAgeSex(zeroBaseline = false) { +export function specAgeSexAnnotation(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, width: "container", height: 75, + data: { name: "conceptData" }, params: [ { name: "paintbrush", @@ -32,7 +34,7 @@ export function specAgeSex(zeroBaseline = false) { field: "CONCEPT_NAME", legend: null, },*/ - row: { + /* row: { field: "CONCEPT_NAME", title: null, header: { @@ -43,7 +45,7 @@ export function specAgeSex(zeroBaseline = false) { labelPadding: 2, labelFontWeight: "bold", }, - }, + },*/ x: { field: "AGE", title: "Age at First Observation", diff --git a/src/pages/reports/release/PersonReport/charts/PopulationByEthnicity/PopulationByEthnicity.vue b/src/pages/reports/release/PersonReport/charts/PopulationByEthnicity/PopulationByEthnicity.vue new file mode 100644 index 00000000..8e880459 --- /dev/null +++ b/src/pages/reports/release/PersonReport/charts/PopulationByEthnicity/PopulationByEthnicity.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specEthnicity.js b/src/pages/reports/release/PersonReport/charts/PopulationByEthnicity/specEthnicity.ts similarity index 93% rename from src/widgets/chart/config/chartSpecifications/specEthnicity.js rename to src/pages/reports/release/PersonReport/charts/PopulationByEthnicity/specEthnicity.ts index 49517081..74ac9a22 100644 --- a/src/widgets/chart/config/chartSpecifications/specEthnicity.js +++ b/src/pages/reports/release/PersonReport/charts/PopulationByEthnicity/specEthnicity.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specEthnicity(zeroBaseline = false) { return { @@ -6,6 +7,7 @@ export function specEthnicity(zeroBaseline = false) { width: "container", height: 100, mark: "bar", + data: { name: "conceptData" }, transform: [ { joinaggregate: [ diff --git a/src/pages/reports/release/PersonReport/charts/PopulationByRace/PopulationByRace.vue b/src/pages/reports/release/PersonReport/charts/PopulationByRace/PopulationByRace.vue new file mode 100644 index 00000000..9b57484e --- /dev/null +++ b/src/pages/reports/release/PersonReport/charts/PopulationByRace/PopulationByRace.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specRace.js b/src/pages/reports/release/PersonReport/charts/PopulationByRace/specRace.ts similarity index 93% rename from src/widgets/chart/config/chartSpecifications/specRace.js rename to src/pages/reports/release/PersonReport/charts/PopulationByRace/specRace.ts index d22ae574..c6fe51ea 100644 --- a/src/widgets/chart/config/chartSpecifications/specRace.js +++ b/src/pages/reports/release/PersonReport/charts/PopulationByRace/specRace.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specRace(zeroBaseline = false) { return { @@ -6,6 +7,7 @@ export function specRace(zeroBaseline = false) { width: "container", height: 75, mark: "bar", + data: { name: "conceptData" }, transform: [ { window: [ diff --git a/src/pages/reports/release/PersonReport/charts/PopulationByYearBirth/PopulationByYearBirth.vue b/src/pages/reports/release/PersonReport/charts/PopulationByYearBirth/PopulationByYearBirth.vue new file mode 100644 index 00000000..29ad2d26 --- /dev/null +++ b/src/pages/reports/release/PersonReport/charts/PopulationByYearBirth/PopulationByYearBirth.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/pages/reports/release/PersonReport/charts/PopulationByYearBirth/specBirthYear.ts b/src/pages/reports/release/PersonReport/charts/PopulationByYearBirth/specBirthYear.ts new file mode 100755 index 00000000..d155e86e --- /dev/null +++ b/src/pages/reports/release/PersonReport/charts/PopulationByYearBirth/specBirthYear.ts @@ -0,0 +1,54 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specBirthYear(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + height: 100, + data: { name: "conceptData" }, + layer: [ + { + params: [ + { + name: "paintbrush", + select: { type: "point", on: "mouseover", nearest: false }, + }, + ], + mark: { type: "bar" }, + encoding: { + tooltip: [ + { field: "COUNT_PERSON", title: "# of People", format: "," }, + { + field: "YEAR", + title: "Year of Birth", + type: "quantitative", + }, + ], + x: { + field: "YEAR", + type: "quantitative", + title: "Year of Birth", + axis: { format: "0000" }, + }, + y: { + field: "COUNT_PERSON", + aggregate: "sum", + title: "Number of People", + scale: { + zero: zeroBaseline, + }, + }, + color: { + condition: { + param: "paintbrush", + type: "nominal", + legend: null, + }, + value: "grey", + }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/release/PersonReport/charts/PopulationByYearBirth/specBirthYearAnnotation.ts b/src/pages/reports/release/PersonReport/charts/PopulationByYearBirth/specBirthYearAnnotation.ts new file mode 100755 index 00000000..8a86c14f --- /dev/null +++ b/src/pages/reports/release/PersonReport/charts/PopulationByYearBirth/specBirthYearAnnotation.ts @@ -0,0 +1,54 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specBirthYearAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + height: 100, + data: { name: "conceptData" }, + layer: [ + { + params: [ + { + name: "paintbrush", + select: { type: "point", on: "mouseover", nearest: false }, + }, + ], + mark: { type: "bar" }, + encoding: { + tooltip: [ + { field: "COUNT_PERSON", title: "# of People", format: "," }, + { + field: "YEAR", + title: "Year of Birth", + type: "quantitative", + }, + ], + x: { + field: "YEAR", + type: "quantitative", + title: "Year of Birth", + axis: { format: "0000" }, + }, + y: { + field: "COUNT_PERSON", + aggregate: "sum", + title: "Number of People", + scale: { + zero: zeroBaseline, + }, + }, + color: { + condition: { + param: "paintbrush", + type: "nominal", + legend: null, + }, + value: "grey", + }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/release/TemporalCharacterization.vue b/src/pages/reports/release/TemporalCharacterization.vue deleted file mode 100644 index 8bf9b70b..00000000 --- a/src/pages/reports/release/TemporalCharacterization.vue +++ /dev/null @@ -1,147 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/TemporalCharacterizationReport/TemporalCharacterization.vue b/src/pages/reports/release/TemporalCharacterizationReport/TemporalCharacterization.vue new file mode 100644 index 00000000..f4cca2f1 --- /dev/null +++ b/src/pages/reports/release/TemporalCharacterizationReport/TemporalCharacterization.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/src/pages/reports/release/UnmappedSourceCodes.vue b/src/pages/reports/release/UnmappedSourceCodes.vue deleted file mode 100644 index cba98e00..00000000 --- a/src/pages/reports/release/UnmappedSourceCodes.vue +++ /dev/null @@ -1,125 +0,0 @@ - - - - - diff --git a/src/pages/reports/release/UnmappedSourceCodesReport/UnmappedSourceCodes.vue b/src/pages/reports/release/UnmappedSourceCodesReport/UnmappedSourceCodes.vue new file mode 100644 index 00000000..22f23b76 --- /dev/null +++ b/src/pages/reports/release/UnmappedSourceCodesReport/UnmappedSourceCodes.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/src/pages/reports/source/DataQualityHistory.vue b/src/pages/reports/source/DataQualityHistory.vue deleted file mode 100644 index b2b11b1b..00000000 --- a/src/pages/reports/source/DataQualityHistory.vue +++ /dev/null @@ -1,136 +0,0 @@ - - - - - diff --git a/src/pages/reports/source/DataQualityHistory/DataQualityHistory.vue b/src/pages/reports/source/DataQualityHistory/DataQualityHistory.vue new file mode 100644 index 00000000..cc9677b5 --- /dev/null +++ b/src/pages/reports/source/DataQualityHistory/DataQualityHistory.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/pages/reports/source/DataQualityHistory/charts/DataQualityDelta/DataQualityDelta.vue b/src/pages/reports/source/DataQualityHistory/charts/DataQualityDelta/DataQualityDelta.vue new file mode 100644 index 00000000..07424b68 --- /dev/null +++ b/src/pages/reports/source/DataQualityHistory/charts/DataQualityDelta/DataQualityDelta.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/pages/reports/source/DataQualityHistory/charts/DataQualityDelta/specDataQualityDelta.ts b/src/pages/reports/source/DataQualityHistory/charts/DataQualityDelta/specDataQualityDelta.ts new file mode 100644 index 00000000..266b0c45 --- /dev/null +++ b/src/pages/reports/source/DataQualityHistory/charts/DataQualityDelta/specDataQualityDelta.ts @@ -0,0 +1,88 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specDataQualityDelta(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + height: 150, + data: { name: "conceptData" }, + encoding: { + x: { field: "release", type: "nominal", title: "Release Name" }, + y: { field: "value", type: "quantitative", title: "Count" }, + color: { + field: "variable", + type: "nominal", + title: "Issue status", + }, + }, + transform: [ + { + fold: ["NEW", "EXISTING", "RESOLVED", "STABLE"], + as: ["variable", "value"], + }, + { + calculate: "datum.variable", + as: "copiedVariable", + }, + ], + layer: [ + { + mark: { type: "line", interpolate: "linear", point: true }, + params: [ + { + name: "source", + select: { type: "point", fields: ["variable"] }, + bind: "legend", + }, + ], + transform: [ + { + filter: { param: "source" }, + }, + ], + }, + { + selection: { + release: { + type: "multi", + fields: ["variable"], + bind: "legend", + }, + x: { + type: "single", + on: "mousemove", + fields: ["Release"], + nearest: true, + }, + }, + transform: [ + { + filter: { selection: "release" }, + }, + ], + mark: { type: "point", tooltip: true }, + }, + { + transform: [ + { + filter: { + and: ["x.Release", { selection: "x" }], + }, + }, + { filter: { selection: "release" } }, + ], + layer: [ + { + mark: "rule", + encoding: { + y: { + height: 1, + }, + }, + }, + ], + }, + ], + }; +} diff --git a/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQuality/HistoricalDataQuality.vue b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQuality/HistoricalDataQuality.vue new file mode 100644 index 00000000..ba9dab38 --- /dev/null +++ b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQuality/HistoricalDataQuality.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specDataQualityResults.js b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQuality/specDataQualityResults.ts similarity index 95% rename from src/widgets/chart/config/chartSpecifications/specDataQualityResults.js rename to src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQuality/specDataQualityResults.ts index ee9e3c78..77825eb2 100644 --- a/src/widgets/chart/config/chartSpecifications/specDataQualityResults.js +++ b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQuality/specDataQualityResults.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specDataQualityResults(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, width: "container", height: 100, + data: { name: "conceptData" }, encoding: { tooltip: [ { diff --git a/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQuality/specDataQualityResultsAnnotation.ts b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQuality/specDataQualityResultsAnnotation.ts new file mode 100644 index 00000000..a9d72880 --- /dev/null +++ b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQuality/specDataQualityResultsAnnotation.ts @@ -0,0 +1,36 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specDataQualityResultsAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + height: 100, + data: { name: "conceptData" }, + encoding: { + x: { + field: "cdm_release_date", + type: "quantitative", + timeUnit: "yearmonth", + axis: { + title: "CDM Release Date", + }, + }, + y: { + field: "count_failed", + type: "quantitative", + axis: { + title: "Checks Failed", + }, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear", point: true }, + }, + ], + }; +} diff --git a/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByCategory/HistoricalDataQualityByCategory.vue b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByCategory/HistoricalDataQualityByCategory.vue new file mode 100644 index 00000000..320d2ef3 --- /dev/null +++ b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByCategory/HistoricalDataQualityByCategory.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specDataQualityResultsByCategory.js b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByCategory/specDataQualityResultsByCategory.ts similarity index 97% rename from src/widgets/chart/config/chartSpecifications/specDataQualityResultsByCategory.js rename to src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByCategory/specDataQualityResultsByCategory.ts index e9a6a1a7..f4160375 100644 --- a/src/widgets/chart/config/chartSpecifications/specDataQualityResultsByCategory.js +++ b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByCategory/specDataQualityResultsByCategory.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specDataQualityResultsByCategory(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, width: "container", height: 150, + data: { name: "conceptData" }, encoding: { x: { field: "cdm_release_date", diff --git a/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByCategory/specDataQualityResultsByCategoryAnnotation.ts b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByCategory/specDataQualityResultsByCategoryAnnotation.ts new file mode 100644 index 00000000..c65b93fd --- /dev/null +++ b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByCategory/specDataQualityResultsByCategoryAnnotation.ts @@ -0,0 +1,80 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specDataQualityResultsByCategoryAnnotation( + zeroBaseline = false +) { + return { + $schema: VEGA_SCHEMA, + width: "container", + height: 150, + data: { name: "conceptData" }, + encoding: { + x: { + field: "cdm_release_date", + type: "quantitative", + timeUnit: "yearmonthdate", + axis: { + title: "CDM Release Date", + }, + scale: { + type: "utc", + }, + }, + y: { + field: "count_value", + aggregate: "sum", + type: "quantitative", + axis: { + title: "Checks Failed", + }, + scale: { + zero: zeroBaseline, + }, + }, + color: { + field: "category", + title: "Check Category", + }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear", point: true }, + params: [ + { + name: "source", + select: { type: "point", fields: ["category"] }, + bind: "legend", + }, + ], + encoding: { + opacity: { + condition: { param: "source", value: 1 }, + value: 0.2, + }, + }, + }, + { + selection: { + dataSource: { + type: "multi", + fields: ["category"], + bind: "legend", + }, + x: { + type: "single", + on: "mousemove", + fields: ["cdm_release_date"], + nearest: true, + }, + }, + transform: [ + { + filter: { selection: "dataSource" }, + }, + ], + mark: { type: "point", tooltip: true }, + }, + ], + }; +} diff --git a/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByDomain/HistoricalDataQualityByDomain.vue b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByDomain/HistoricalDataQualityByDomain.vue new file mode 100644 index 00000000..49c8b93c --- /dev/null +++ b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByDomain/HistoricalDataQualityByDomain.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specDataQualityResultsByDomain.js b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByDomain/specDataQualityResultsByDomain.ts similarity index 97% rename from src/widgets/chart/config/chartSpecifications/specDataQualityResultsByDomain.js rename to src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByDomain/specDataQualityResultsByDomain.ts index 8e537c7a..e8175962 100644 --- a/src/widgets/chart/config/chartSpecifications/specDataQualityResultsByDomain.js +++ b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByDomain/specDataQualityResultsByDomain.ts @@ -1,4 +1,5 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specDataQualityResultsByDomain(zeroBaseline = false) { return { @@ -6,6 +7,7 @@ export function specDataQualityResultsByDomain(zeroBaseline = false) { width: "container", height: 150, description: "Data Quality Results by Date", + data: { name: "conceptData" }, encoding: { x: { field: "cdm_release_date", diff --git a/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByDomain/specDataQualityResultsByDomainAnnotation.ts b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByDomain/specDataQualityResultsByDomainAnnotation.ts new file mode 100644 index 00000000..e8b222b7 --- /dev/null +++ b/src/pages/reports/source/DataQualityHistory/charts/HistoricalDataQualityByDomain/specDataQualityResultsByDomainAnnotation.ts @@ -0,0 +1,79 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specDataQualityResultsByDomainAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + height: 150, + description: "Data Quality Results by Date", + data: { name: "conceptData" }, + encoding: { + x: { + field: "cdm_release_date", + type: "quantitative", + timeUnit: "yearmonthdate", + axis: { + title: "CDM Release Date", + }, + scale: { + type: "utc", + }, + }, + y: { + field: "count_value", + aggregate: "sum", + type: "quantitative", + axis: { + title: "Checks Failed", + }, + scale: { + zero: zeroBaseline, + }, + }, + color: { + field: "cdm_table_name", + title: "Check Domain", + }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear", point: true }, + params: [ + { + name: "source", + select: { type: "point", fields: ["cdm_table_name"] }, + bind: "legend", + }, + ], + encoding: { + opacity: { + condition: { param: "source", value: 1 }, + value: 0.2, + }, + }, + }, + { + selection: { + dataSource: { + type: "multi", + fields: ["cdm_table_name"], + bind: "legend", + }, + x: { + type: "single", + on: "mousemove", + fields: ["cdm_release_date"], + nearest: true, + }, + }, + transform: [ + { + filter: { selection: "dataSource" }, + }, + ], + mark: { type: "point", tooltip: true }, + }, + ], + }; +} diff --git a/src/pages/reports/source/DomainContinuity.vue b/src/pages/reports/source/DomainContinuity.vue deleted file mode 100644 index 7b38ddb4..00000000 --- a/src/pages/reports/source/DomainContinuity.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - - - diff --git a/src/pages/reports/source/DomainContinuity/DomainContinuity.vue b/src/pages/reports/source/DomainContinuity/DomainContinuity.vue new file mode 100644 index 00000000..78234a20 --- /dev/null +++ b/src/pages/reports/source/DomainContinuity/DomainContinuity.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/src/pages/reports/source/DomainContinuity/charts/domainRecords/DomainRecords.vue b/src/pages/reports/source/DomainContinuity/charts/domainRecords/DomainRecords.vue new file mode 100644 index 00000000..c678c218 --- /dev/null +++ b/src/pages/reports/source/DomainContinuity/charts/domainRecords/DomainRecords.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specOverview.js b/src/pages/reports/source/DomainContinuity/charts/domainRecords/specOverview.ts similarity index 89% rename from src/widgets/chart/config/chartSpecifications/specOverview.js rename to src/pages/reports/source/DomainContinuity/charts/domainRecords/specOverview.ts index 0e7ab3a0..acb8c52e 100644 --- a/src/widgets/chart/config/chartSpecifications/specOverview.js +++ b/src/pages/reports/source/DomainContinuity/charts/domainRecords/specOverview.ts @@ -1,8 +1,10 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; -export function specOverview(zeroBaseline = false) { +export function specOverview(zeroBaseline = false, minMax, labelColor) { return { $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, facet: { row: { field: "domain", @@ -14,6 +16,8 @@ export function specOverview(zeroBaseline = false) { labelFontSize: 12, labelPadding: 2, labelFontWeight: "bold", + labelColor: labelColor, + titleColor: labelColor, }, }, }, @@ -22,7 +26,7 @@ export function specOverview(zeroBaseline = false) { }, spec: { height: 75, - width: 600, + width: "container", description: "Domain Continuity", encoding: { x: { diff --git a/src/pages/reports/source/SourceConceptReport.vue b/src/pages/reports/source/SourceConceptReport.vue deleted file mode 100644 index f58ee70b..00000000 --- a/src/pages/reports/source/SourceConceptReport.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/src/pages/reports/source/SourceConceptReport/SourceConceptReport.vue b/src/pages/reports/source/SourceConceptReport/SourceConceptReport.vue new file mode 100644 index 00000000..940d1a49 --- /dev/null +++ b/src/pages/reports/source/SourceConceptReport/SourceConceptReport.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/pages/reports/source/SourceConceptReport/charts/recordProportionByMonth/RecordProportionByMonth.vue b/src/pages/reports/source/SourceConceptReport/charts/recordProportionByMonth/RecordProportionByMonth.vue new file mode 100644 index 00000000..3f5be102 --- /dev/null +++ b/src/pages/reports/source/SourceConceptReport/charts/recordProportionByMonth/RecordProportionByMonth.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/pages/reports/source/SourceConceptReport/charts/recordProportionByMonth/specRecordProportionByMonth.ts b/src/pages/reports/source/SourceConceptReport/charts/recordProportionByMonth/specRecordProportionByMonth.ts new file mode 100644 index 00000000..a68a6796 --- /dev/null +++ b/src/pages/reports/source/SourceConceptReport/charts/recordProportionByMonth/specRecordProportionByMonth.ts @@ -0,0 +1,121 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specRecordProportionByMonth(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + vconcat: [ + { + height: 150, + width: "container", + description: "Domain Data Density", + layer: [ + { + mark: { type: "circle" }, + encoding: { + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + scale: { + zero: zeroBaseline, + }, + }, + }, + }, + { + params: [ + { + name: "index", + select: { + type: "point", + fields: ["date"], + on: "mousemove", + nearest: true, + }, + }, + ], + mark: { type: "point" }, + encoding: { + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + scale: { + zero: zeroBaseline, + }, + }, + opacity: { value: 0 }, + }, + }, + { + transform: [ + { + filter: { + and: ["index.date", { param: "index" }], + }, + }, + ], + mark: "rule", + encoding: { + y: { + height: 1, + }, + }, + }, + ], + encoding: { + x: { + field: "date", + type: "temporal", + timeUnit: "yearmonth", + scale: { domain: { selection: "brush" } }, + axis: { title: "" }, + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "Record Proportion per 1000", + scale: { + zero: zeroBaseline, + }, + }, + tooltip: [ + { + field: "Y_PREVALENCE_1000PP", + title: "RPP1000", + type: "quantitative", + }, + { + field: "date", + title: "Date", + type: "temporal", + timeUnit: "yearmonth", + }, + ], + }, + }, + { + width: "container", + height: 25, + mark: "line", + data: { name: "conceptData" }, + selection: { + brush: { type: "interval", encodings: ["x"] }, + }, + encoding: { + x: { + field: "date", + type: "temporal", + title: "Date", + timeUnit: "yearmonth", + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "", + }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/source/SourceConceptReport/charts/recordProportionByMonth/specRecordProportionByMonthAnnotation.ts b/src/pages/reports/source/SourceConceptReport/charts/recordProportionByMonth/specRecordProportionByMonthAnnotation.ts new file mode 100644 index 00000000..4352cfea --- /dev/null +++ b/src/pages/reports/source/SourceConceptReport/charts/recordProportionByMonth/specRecordProportionByMonthAnnotation.ts @@ -0,0 +1,82 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specRecordProportionByMonthAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + data: { name: "conceptData" }, + vconcat: [ + { + height: 150, + width: "container", + description: "Domain Data Density", + layer: [ + { + mark: { type: "circle" }, + encoding: { + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + scale: { + zero: zeroBaseline, + }, + }, + }, + }, + ], + encoding: { + x: { + field: "date", + type: "quantitative", + timeUnit: "yearmonth", + scale: { domain: { selection: "brush" } }, + axis: { title: "" }, + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "Record Proportion per 1000", + scale: { + zero: zeroBaseline, + }, + }, + tooltip: [ + { + field: "Y_PREVALENCE_1000PP", + title: "RPP1000", + type: "quantitative", + }, + { + field: "date", + title: "Date", + type: "quantitative", + timeUnit: "yearmonth", + }, + ], + }, + }, + { + width: "container", + height: 25, + mark: "line", + data: { name: "conceptData" }, + selection: { + brush: { type: "interval", encodings: ["x"] }, + }, + encoding: { + x: { + field: "date", + type: "quantitative", + title: "Date", + timeUnit: "yearmonth", + }, + y: { + field: "Y_PREVALENCE_1000PP", + type: "quantitative", + title: "", + }, + }, + }, + ], + }; +} diff --git a/src/pages/reports/source/SourceOverview.vue b/src/pages/reports/source/SourceOverview.vue deleted file mode 100644 index d624794e..00000000 --- a/src/pages/reports/source/SourceOverview.vue +++ /dev/null @@ -1,211 +0,0 @@ - - - - - diff --git a/src/pages/reports/source/SourceOverview/SourceOverview.vue b/src/pages/reports/source/SourceOverview/SourceOverview.vue new file mode 100644 index 00000000..aadd8857 --- /dev/null +++ b/src/pages/reports/source/SourceOverview/SourceOverview.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/pages/reports/source/SourceOverview/charts/dataQualityIssuesHistory/DataQualityIssuesHistory.vue b/src/pages/reports/source/SourceOverview/charts/dataQualityIssuesHistory/DataQualityIssuesHistory.vue new file mode 100644 index 00000000..064aa842 --- /dev/null +++ b/src/pages/reports/source/SourceOverview/charts/dataQualityIssuesHistory/DataQualityIssuesHistory.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specIssuesByRelease.js b/src/pages/reports/source/SourceOverview/charts/dataQualityIssuesHistory/specIssuesByRelease.ts similarity index 95% rename from src/widgets/chart/config/chartSpecifications/specIssuesByRelease.js rename to src/pages/reports/source/SourceOverview/charts/dataQualityIssuesHistory/specIssuesByRelease.ts index 5e192a68..a0f1712d 100644 --- a/src/widgets/chart/config/chartSpecifications/specIssuesByRelease.js +++ b/src/pages/reports/source/SourceOverview/charts/dataQualityIssuesHistory/specIssuesByRelease.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specIssuesByRelease(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, width: "container", height: 200, + data: { name: "conceptData" }, transform: [ { timeUnit: "yearmonthdate", diff --git a/src/pages/reports/source/SourceOverview/charts/dataQualityIssuesHistory/specIssuesByReleaseAnnotation.ts b/src/pages/reports/source/SourceOverview/charts/dataQualityIssuesHistory/specIssuesByReleaseAnnotation.ts new file mode 100644 index 00000000..4535f6c9 --- /dev/null +++ b/src/pages/reports/source/SourceOverview/charts/dataQualityIssuesHistory/specIssuesByReleaseAnnotation.ts @@ -0,0 +1,43 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specIssuesByReleaseAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + height: 200, + data: { name: "conceptData" }, + transform: [ + { + timeUnit: "yearmonthdate", + field: "release_name", + as: "date", + }, + ], + encoding: { + x: { + field: "date", + type: "quantitative", + timeUnit: "yearmonthdate", + axis: { + title: "Release", + }, + }, + y: { + field: "count_data_quality_issues", + type: "quantitative", + axis: { + title: "Issues", + }, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear", point: true }, + }, + ], + }; +} diff --git a/src/pages/reports/source/SourceOverview/charts/populationHistory/PopulationHistory.vue b/src/pages/reports/source/SourceOverview/charts/populationHistory/PopulationHistory.vue new file mode 100644 index 00000000..84def9da --- /dev/null +++ b/src/pages/reports/source/SourceOverview/charts/populationHistory/PopulationHistory.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specPopulationByRelease.js b/src/pages/reports/source/SourceOverview/charts/populationHistory/specPopulationByRelease.ts similarity index 95% rename from src/widgets/chart/config/chartSpecifications/specPopulationByRelease.js rename to src/pages/reports/source/SourceOverview/charts/populationHistory/specPopulationByRelease.ts index 2daf2d0d..b9e33f92 100644 --- a/src/widgets/chart/config/chartSpecifications/specPopulationByRelease.js +++ b/src/pages/reports/source/SourceOverview/charts/populationHistory/specPopulationByRelease.ts @@ -1,10 +1,12 @@ import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; export function specPopulationByRelease(zeroBaseline = false) { return { $schema: VEGA_SCHEMA, width: "container", height: 200, + data: { name: "conceptData" }, transform: [ { timeUnit: "yearmonthdate", diff --git a/src/pages/reports/source/SourceOverview/charts/populationHistory/specPopulationByReleaseAnnotation.ts b/src/pages/reports/source/SourceOverview/charts/populationHistory/specPopulationByReleaseAnnotation.ts new file mode 100644 index 00000000..be5b64d9 --- /dev/null +++ b/src/pages/reports/source/SourceOverview/charts/populationHistory/specPopulationByReleaseAnnotation.ts @@ -0,0 +1,36 @@ +import { VEGA_SCHEMA } from "@/shared/config/links"; +import { TopLevelSpec } from "vega-lite"; + +export function specPopulationByReleaseAnnotation(zeroBaseline = false) { + return { + $schema: VEGA_SCHEMA, + width: "container", + height: 200, + data: { name: "conceptData" }, + encoding: { + x: { + field: "dateU", + type: "quantitative", + timeUnit: "yearmonthdate", + axis: { + title: "Release", + }, + }, + y: { + field: "count_person", + type: "quantitative", + axis: { + title: "People", + }, + scale: { + zero: zeroBaseline, + }, + }, + }, + layer: [ + { + mark: { type: "line", interpolate: "linear", point: true }, + }, + ], + }; +} diff --git a/src/pages/reports/source/SourceOverview/charts/releaseListing/ReleaseListing.vue b/src/pages/reports/source/SourceOverview/charts/releaseListing/ReleaseListing.vue new file mode 100644 index 00000000..4e7f0d42 --- /dev/null +++ b/src/pages/reports/source/SourceOverview/charts/releaseListing/ReleaseListing.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/pages/reports/source/SourceOverview/charts/sourceDataStrand/SourceDataStrand.vue b/src/pages/reports/source/SourceOverview/charts/sourceDataStrand/SourceDataStrand.vue new file mode 100644 index 00000000..965b2f85 --- /dev/null +++ b/src/pages/reports/source/SourceOverview/charts/sourceDataStrand/SourceDataStrand.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/src/widgets/chart/config/chartSpecifications/specDatastrand.js b/src/pages/reports/source/SourceOverview/charts/sourceDataStrand/specDatastrand.ts similarity index 79% rename from src/widgets/chart/config/chartSpecifications/specDatastrand.js rename to src/pages/reports/source/SourceOverview/charts/sourceDataStrand/specDatastrand.ts index 212f00ef..1c282424 100644 --- a/src/widgets/chart/config/chartSpecifications/specDatastrand.js +++ b/src/pages/reports/source/SourceOverview/charts/sourceDataStrand/specDatastrand.ts @@ -1,10 +1,7 @@ -import { VEGA_SCHEMA } from "@/shared/config/links"; - export const specDatastrand = { $schema: "https://vega.github.io/schema/vega/v5.json", description: "Data Strand Visualization", - autosize: { type: "fit-x", contains: "padding" }, - padding: 5, + autosize: { type: "fit-x" }, data: [ { name: "source_0", @@ -23,7 +20,7 @@ export const specDatastrand = { as: ["total_records"], ops: ["sum"], fields: ["count_records"], - groupby: ["cdm_source_key"], + groupby: ["cdm_release_key"], }, { type: "formula", @@ -32,21 +29,14 @@ export const specDatastrand = { }, { type: "aggregate", - groupby: [ - "domain", - "percent", - "count_records", - "cdm_source_key", - "cdm_source_abbreviation", - "cdm_release_key", - ], + groupby: ["domain", "percent", "count_records", "cdm_release_key"], ops: ["sum", "sum"], fields: ["percent", "count_records"], as: ["sum_percent", "sum_count_records"], }, { type: "stack", - groupby: ["cdm_source_key"], + groupby: ["cdm_release_key"], field: "sum_percent", sort: { field: ["sum_count_records"], order: ["descending"] }, as: ["sum_percent_start", "sum_percent_end"], @@ -95,11 +85,11 @@ export const specDatastrand = { fill: { scale: "color", field: "domain" }, tooltip: { signal: - '{"Data Source": datum["cdm_source_abbreviation"], "Domain": isValid(datum["domain"]) ? datum["domain"] : ""+datum["domain"], "Percent": format(datum["sum_percent"], "0.2%"), "Number of Records": format(datum["count_records"], ",")}', + '{"Data Source": datum["cdm_release_key"], "Domain": isValid(datum["domain"]) ? datum["domain"] : ""+datum["domain"], "Percent": format(datum["sum_percent"], "0.2%"), "Number of Records": format(datum["count_records"], ",")}', }, x: { scale: "x", field: "sum_percent_end" }, x2: { scale: "x", field: "sum_percent_start" }, - yc: { scale: "y", field: "cdm_source_key" }, + yc: { scale: "y", field: "cdm_release_key" }, height: { value: 20 }, }, }, @@ -120,7 +110,7 @@ export const specDatastrand = { { name: "y", type: "band", - domain: { data: "data_0", field: "cdm_source_key", sort: true }, + domain: { data: "data_0", field: "cdm_release_key", sort: true }, range: { step: { signal: "y_step" } }, padding: 3, }, diff --git a/src/processes/exploreReports/config/dataLoadConfig.js b/src/processes/exploreReports/config/dataLoadConfig.ts similarity index 57% rename from src/processes/exploreReports/config/dataLoadConfig.js rename to src/processes/exploreReports/config/dataLoadConfig.ts index a25073ee..56ef026e 100644 --- a/src/processes/exploreReports/config/dataLoadConfig.js +++ b/src/processes/exploreReports/config/dataLoadConfig.ts @@ -1,6 +1,11 @@ import { ACHILLES_PERFORMANCE, CDM_SOURCE, + COHORT_CHARACTERIZATION, + COHORT_DIAGNOSTICS_PERFORMANCE, + COHORT_INDEX, + COHORT_INDEX_EVENT_BREAKDOWN, + COHORT_TEMPORAL_COVARIATE_DISTRIBUTION, CONCEPT, DEATH, DENSITY_DOMAIN_PERSON, @@ -10,6 +15,7 @@ import { DOMAIN_ISSUES, DOMAIN_SUMMARY, DOMAIN_VISIT_STRATIFICATION, + LOCATION, METADATA, NETWORK_PERFORMANCE, NETWORK_QUALITY_SUMMARY, @@ -17,6 +23,7 @@ import { OBSERVATION_PERIOD, PERSON, QUALITY_COMPLETENESS, + QUALITY_DELTA, QUALITY_INDEX, QUALITY_RESULTS, RECORDS_DOMAIN, @@ -29,8 +36,10 @@ import { FETCH_MULTIPLE_FILES_BY_RELEASE, FETCH_MULTIPLE_FILES_BY_SOURCE, } from "../model/store/actions.type"; +import { FETCH_WEBAPI_INFO } from "@/shared/api/webAPI/data/store/actions.type"; +import environment from "@/shared/api/environment"; -export default function getFilesByView() { +export default function getFilesByView(params = null) { return { temporalCharacterization: { loadMethod: FETCH_FILES, @@ -40,18 +49,36 @@ export default function getFilesByView() { loadMethod: FETCH_MULTIPLE_FILES_BY_SOURCE, payload: { files: [ - OBSERVATION_PERIOD, - PERSON, - DENSITY_DOMAIN_PERSON, - DOMAIN_SUMMARY, + { + name: OBSERVATION_PERIOD, + instanceParams: [{ domain: "visit_occurrence" }], + }, + { name: PERSON, instanceParams: [{ domain: "visit_occurrence" }] }, + { + name: DENSITY_DOMAIN_PERSON, + instanceParams: [{ domain: "visit_occurrence" }], + }, + { + name: DOMAIN_SUMMARY, + instanceParams: [{ domain: "visit_occurrence" }], + }, ], - params: { domain: "visit_occurrence" }, }, }, + webApi: { + loadMethod: FETCH_WEBAPI_INFO, + payload: {}, + }, networkPerformance: { loadMethod: FETCH_FILES, payload: { files: [{ name: NETWORK_PERFORMANCE, required: true }] }, }, + networkDiversityReport: { + loadMethod: FETCH_MULTIPLE_FILES_BY_SOURCE, + payload: { + files: [{ name: PERSON, instanceParams: [{}] }], + }, + }, networkUnmappedSourceCodes: { loadMethod: FETCH_FILES, payload: { @@ -61,7 +88,10 @@ export default function getFilesByView() { networkConcept: { loadMethod: FETCH_MULTIPLE_FILES_BY_SOURCE, payload: { - files: [CONCEPT], + files: environment.DUCKDB_ENABLED + ? params.files + : [{ name: CONCEPT, instanceParams: [{}] }], + duckdb_supported: true, }, }, networkDataQuality: { @@ -70,25 +100,58 @@ export default function getFilesByView() { files: [{ name: NETWORK_QUALITY_SUMMARY, required: true }], }, }, + cohorts: { + loadMethod: FETCH_FILES, + payload: { + files: [{ name: COHORT_INDEX, required: true }], + duckdb_supported: true, + }, + }, + location: { + loadMethod: FETCH_FILES, + payload: { + files: [{ name: LOCATION, required: true }], + }, + }, + cohortReport: { + loadMethod: FETCH_FILES, + payload: { + files: [ + { name: COHORT_CHARACTERIZATION, required: true }, + { name: COHORT_INDEX_EVENT_BREAKDOWN, required: true }, + { name: COHORT_TEMPORAL_COVARIATE_DISTRIBUTION, required: true }, + ], + duckdb_supported: true, + }, + }, dataStrandReport: { loadMethod: FETCH_MULTIPLE_FILES_BY_SOURCE, payload: { - files: [RECORDS_DOMAIN], + files: [{ name: RECORDS_DOMAIN, instanceParams: [{}] }], + }, + }, + dataSourceOverview: { + loadMethod: FETCH_MULTIPLE_FILES_BY_RELEASE, + payload: { + files: [{ name: RECORDS_DOMAIN }], }, }, population: { loadMethod: FETCH_MULTIPLE_FILES_BY_SOURCE, payload: { - files: [OBSERVATION_PERIOD], + files: [{ name: OBSERVATION_PERIOD, instanceParams: [{}] }], }, }, concept: { loadMethod: FETCH_FILES, payload: { - files: [ - { name: DOMAIN_SUMMARY, required: true }, - { name: CONCEPT, required: true }, - ], + files: environment.DUCKDB_ENABLED + ? params.files + : [ + { name: DOMAIN_SUMMARY, required: true }, + { name: CONCEPT, required: true }, + ], + duckdb_supported: true, }, }, dataQuality: { @@ -120,6 +183,7 @@ export default function getFilesByView() { { name: DOMAIN_ISSUES, required: true }, { name: DOMAIN_DRUG_STRATIFICATION, required: false }, { name: DOMAIN_VISIT_STRATIFICATION, required: false }, + { name: METADATA, required: false }, ], }, }, @@ -142,7 +206,10 @@ export default function getFilesByView() { performance: { loadMethod: FETCH_FILES, payload: { - files: [{ name: ACHILLES_PERFORMANCE, required: true }], + files: [ + { name: ACHILLES_PERFORMANCE, required: true }, + { name: COHORT_DIAGNOSTICS_PERFORMANCE, required: false }, + ], }, }, person: { @@ -160,7 +227,10 @@ export default function getFilesByView() { dataQualityHistory: { loadMethod: FETCH_FILES, payload: { - files: [{ name: QUALITY_INDEX, required: true }], + files: [ + { name: QUALITY_INDEX, required: true }, + { name: QUALITY_DELTA, required: false }, + ], }, }, domainContinuity: { @@ -172,7 +242,10 @@ export default function getFilesByView() { sourceConceptOverlay: { loadMethod: FETCH_MULTIPLE_FILES_BY_RELEASE, payload: { - files: [SOURCE_CONCEPT], + files: environment.DUCKDB_ENABLED + ? params.files + : [{ name: SOURCE_CONCEPT }], + duckdb_supported: true, }, }, }; diff --git a/src/processes/exploreReports/config/routes.js b/src/processes/exploreReports/config/routes.js deleted file mode 100644 index 0cfcefd6..00000000 --- a/src/processes/exploreReports/config/routes.js +++ /dev/null @@ -1,186 +0,0 @@ -import reportsView from "@/processes/exploreReports/ui/ReportsView"; -import home from "@/pages/info/Home"; -import help from "@/pages/info/Help"; -import article from "@/pages/info/Article"; -import networkDataQualitySummary from "@/pages/reports/network/NetworkDataQualitySummary"; -import networkPerformance from "@/pages/reports/network/NetworkPerformance"; -import networkUnmappedSourceCodes from "@/pages/reports/network/NetworkUnmappedSourceCodes"; -import NetworkDataFeasibilityReport from "@/pages/reports/network/NetworkDataFeasibilityReport"; -import networkDatastrandReport from "@/pages/reports/network/NetworkDatastrandReport"; -import networkPopulationReport from "@/pages/reports/network/NetworkPopulationReport"; -import networkOverview from "@/pages/reports/network/NetworkOverview"; -import networkConceptReport from "@/pages/reports/network/NetworkConceptReport"; -import observationPeriodReport from "@/pages/reports/release/ObservationPeriodReport"; -import TemporalCharacterization from "@/pages/reports/release/TemporalCharacterization"; -import metadataReport from "@/pages/reports/release/MetadataReport"; -import deathReport from "@/pages/reports/release/DeathReport"; -import dataQualityResults from "@/pages/reports/release/DataQualityResults"; -import domainDensity from "@/pages/reports/release/DomainDensity"; -import unmappedSourceCodes from "@/pages/reports/release/UnmappedSourceCodes"; -import performanceReport from "@/pages/reports/release/PerformanceTable"; -import personReport from "@/pages/reports/release/PersonReport"; -import domainTable from "@/pages/reports/release/DomainTable"; -import conceptReport from "@/pages/reports/release/ConceptReport"; -import dataQualityHistory from "@/pages/reports/source/DataQualityHistory"; -import SourceOverview from "@/pages/reports/source/SourceOverview"; -import domainContinuity from "@/pages/reports/source/DomainContinuity"; -import sourceConceptReport from "@/pages/reports/source/SourceConceptReport"; - -export default [ - { - path: "/", - components: { main: reportsView }, - redirect: { name: "home" }, - meta: { showModules: true }, - children: [ - { path: "/home", name: "home", components: { reportsView: home } }, - { path: "/help", name: "help", components: { reportsView: help } }, - { - path: "/publication/article", - name: "article", - components: { reportsView: article }, - }, - ], - }, - - { - path: "/network", - name: "network", - components: { main: reportsView }, - redirect: { name: "overview" }, - children: [ - { - path: "network_data_quality", - name: "networkDataQuality", - components: { reportsView: networkDataQualitySummary }, - }, - { - path: "network_performance", - name: "networkPerformance", - components: { reportsView: networkPerformance }, - }, - { - path: "network_unmapped_source_codes", - name: "networkUnmappedSourceCodes", - components: { reportsView: networkUnmappedSourceCodes }, - }, - { - path: "feasibility", - name: "feasibility", - components: { reportsView: NetworkDataFeasibilityReport }, - }, - { - path: "data_strand_report", - name: "dataStrandReport", - components: { reportsView: networkDatastrandReport }, - }, - { - path: "population", - name: "population", - components: { reportsView: networkPopulationReport }, - }, - { - path: "overview", - name: "overview", - components: { reportsView: networkOverview }, - }, - { - path: "concept/:domain/:concept/summary", - name: "networkConcept", - components: { reportsView: networkConceptReport }, - }, - ], - }, - - { - path: "/cdm/:cdm/:release", - name: "cdm", - components: { main: reportsView }, - redirect: { name: "person" }, - children: [ - { - path: "observation_period", - name: "observationPeriod", - components: { reportsView: observationPeriodReport }, - }, - { - path: "temporal_characterization", - name: "temporalCharacterization", - components: { reportsView: TemporalCharacterization }, - }, - { - path: "metadata", - name: "metadata", - components: { reportsView: metadataReport }, - }, - { - path: "death", - name: "death", - components: { reportsView: deathReport }, - }, - { - path: "data_quality", - name: "dataQuality", - components: { reportsView: dataQualityResults }, - }, - { - path: "data_density", - name: "dataDensity", - components: { reportsView: domainDensity }, - }, - { - path: "unmapped_source_codes", - name: "unmappedSourceCodes", - components: { reportsView: unmappedSourceCodes }, - }, - { - path: "performance", - name: "performance", - components: { reportsView: performanceReport }, - }, - { - path: "person", - name: "person", - components: { reportsView: personReport }, - }, - { - path: ":domain", - components: { reportsView: domainTable }, - name: "domainTable", - }, - { - path: ":domain/:concept/", - components: { reportsView: conceptReport }, - name: "concept", - }, - ], - }, - { - path: "/datasource/:cdm", - name: "datasource", - components: { main: reportsView }, - redirect: { name: "dataSourceOverview" }, - children: [ - { - path: "data_quality_history", - name: "dataQualityHistory", - components: { reportsView: dataQualityHistory }, - }, - { - path: "data_source_overview", - name: "dataSourceOverview", - components: { reportsView: SourceOverview }, - }, - { - path: "domain_continuity", - name: "domainContinuity", - components: { reportsView: domainContinuity }, - }, - { - path: ":domain/:concept/overlay", - name: "sourceConceptOverlay", - components: { reportsView: sourceConceptReport }, - }, - ], - }, -]; diff --git a/src/processes/exploreReports/config/routes.ts b/src/processes/exploreReports/config/routes.ts new file mode 100644 index 00000000..03926e72 --- /dev/null +++ b/src/processes/exploreReports/config/routes.ts @@ -0,0 +1,237 @@ +import ReportsView from "@/processes/exploreReports/ui/ReportsView.vue"; +import Home from "@/pages/info/Home.vue"; +import Help from "@/pages/info/Help.vue"; +import Article from "@/pages/info/Article.vue"; +import NetworkDataQualitySummary from "@/pages/reports/network/NetworkDataQualitySummary/NetworkDataQualitySummary.vue"; +import NetworkPerformance from "@/pages/reports/network/NetworkPerformance/NetworkPerformance.vue"; +import NetworkUnmappedSourceCodes from "@/pages/reports/network/NetworkUnmappedSourceCodes/NetworkUnmappedSourceCodes.vue"; +import NetworkDataFeasibilityReport from "@/pages/reports/network/NetworkDataFeasibilityReport/index.vue"; +import NetworkDatastrandReport from "@/pages/reports/network/NetworkDatastrandReport/NetworkDatastrandReport.vue"; +import NetworkPopulationReport from "@/pages/reports/network/NetworkPopulationReport/NetworkPopulationReport.vue"; +import NetworkOverview from "@/pages/reports/network/NetworkOverview/NetworkOverview.vue"; +import NetworkConceptReport from "@/pages/reports/network/NetworkConceptReport/NetworkConceptReport.vue"; +import ObservationPeriodReport from "@/pages/reports/release/ObservationPeriodReport/ObservationPeriodReport.vue"; +import TemporalCharacterization from "@/pages/reports/release/TemporalCharacterizationReport/TemporalCharacterization.vue"; +import MetadataReport from "@/pages/reports/release/MetadataReport/MetadataReport.vue"; +import DeathReport from "@/pages/reports/release/DeathReport/DeathReport.vue"; +import DataQualityResults from "@/pages/reports/release/DataQualityResults/DataQualityResults.vue"; +import DomainDensity from "@/pages/reports/release/DomainDensity/DomainDensity.vue"; +import UnmappedSourceCodes from "@/pages/reports/release/UnmappedSourceCodesReport/UnmappedSourceCodes.vue"; +import PerformanceReport from "@/pages/reports/release/PerformanceReport/PerformanceTable.vue"; +import PersonReport from "@/pages/reports/release/PersonReport/PersonReport.vue"; +import DomainTable from "@/pages/reports/release/DomainTable/DomainTable.vue"; +import ConceptReport from "@/pages/reports/release/ConceptReport/ConceptReport.vue"; +import DataQualityHistory from "@/pages/reports/source/DataQualityHistory/DataQualityHistory.vue"; +import SourceOverview from "@/pages/reports/source/SourceOverview/SourceOverview.vue"; +import DomainContinuity from "@/pages/reports/source/DomainContinuity/DomainContinuity.vue"; +import SourceConceptReport from "@/pages/reports/source/SourceConceptReport/SourceConceptReport.vue"; +import NetworkConceptDashboard from "@/pages/reports/network/NetworkConceptDashboard/NetworkConceptDashboard.vue"; +import NetworkDiversityReport from "@/pages/reports/network/NetworkDiversityReport/NetworkDiversityReport.vue"; +import CohortsTable from "@/pages/reports/release/CohortsTable/CohortsTable.vue"; +import CohortDrilldownReport from "@/pages/reports/release/CohortDrilldownReport/CohortDrilldownReport.vue"; +import LocationReport from "@/pages/reports/release/Location/LocationReport.vue"; + +import WebApiInfo from "@/pages/info/WebApiInfo.vue"; + +import { RouteRecordRaw } from "vue-router"; +import NetworkComparisonTool from "@/pages/reports/network/NetworkComparisonTool/NetworkComparisonTool.vue"; + +export const routes: RouteRecordRaw[] = [ + { + path: "/", + components: { main: ReportsView }, + redirect: { name: "home" }, + meta: { showModules: true }, + children: [ + { path: "/home", name: "home", components: { reportsView: Home } }, + { path: "/help", name: "help", components: { reportsView: Help } }, + { + path: "/publication/article", + name: "article", + components: { reportsView: Article }, + }, + ], + }, + + { + path: "/network", + name: "network", + components: { main: ReportsView }, + redirect: { name: "overview" }, + children: [ + { + path: "network_data_quality", + name: "networkDataQuality", + components: { reportsView: NetworkDataQualitySummary }, + }, + + { + path: "network_concept/:domain?/:concept?", + name: "networkConcept", + components: { reportsView: NetworkConceptReport }, + }, + { + path: "network_concept_dashboard", + name: "networkConceptDashboard", + components: { reportsView: NetworkConceptDashboard }, + }, + { + path: "web_api", + name: "webApi", + components: { reportsView: WebApiInfo }, + }, + { + path: "network_performance", + name: "networkPerformance", + components: { reportsView: NetworkPerformance }, + }, + { + path: "network_comparison_tool/:cdm?/:release?/:domain?", + name: "networkComparisonTool", + components: { reportsView: NetworkComparisonTool }, + }, + { + path: "network_diversity", + name: "networkDiversityReport", + components: { reportsView: NetworkDiversityReport }, + }, + { + path: "network_unmapped_source_codes", + name: "networkUnmappedSourceCodes", + components: { reportsView: NetworkUnmappedSourceCodes }, + }, + { + path: "feasibility", + name: "feasibility", + components: { reportsView: NetworkDataFeasibilityReport }, + }, + { + path: "data_strand_report", + name: "dataStrandReport", + components: { reportsView: NetworkDatastrandReport }, + }, + { + path: "population", + name: "population", + components: { reportsView: NetworkPopulationReport }, + }, + { + path: "overview", + name: "overview", + components: { reportsView: NetworkOverview }, + }, + /*{ + path: "concept/:domain/:concept/summary", + name: "networkConcept", + components: { reportsView: networkConceptReport }, + },*/ + ], + }, + { + path: "/cdm/:cdm", + name: "datasource", + components: { main: ReportsView }, + redirect: { name: "dataSourceOverview" }, + children: [ + { + path: "data_quality_history", + name: "dataQualityHistory", + components: { reportsView: DataQualityHistory }, + }, + { + path: "data_source_overview", + name: "dataSourceOverview", + components: { reportsView: SourceOverview }, + }, + { + path: "domain_continuity", + name: "domainContinuity", + components: { reportsView: DomainContinuity }, + }, + { + path: ":domain/:concept/overlay", + name: "sourceConceptOverlay", + components: { reportsView: SourceConceptReport }, + }, + ], + }, + + { + path: "/cdm/:cdm/:release", + name: "cdm", + components: { main: ReportsView }, + redirect: { name: "person" }, + children: [ + { + path: "observation_period", + name: "observationPeriod", + components: { reportsView: ObservationPeriodReport }, + }, + { + path: "location", + name: "location", + components: { reportsView: LocationReport }, + }, + { + path: "temporal_characterization", + name: "temporalCharacterization", + components: { reportsView: TemporalCharacterization }, + }, + { + path: "metadata", + name: "metadata", + components: { reportsView: MetadataReport }, + }, + { + path: "death", + name: "death", + components: { reportsView: DeathReport }, + }, + { + path: "data_quality", + name: "dataQuality", + components: { reportsView: DataQualityResults }, + }, + { + path: "data_density", + name: "dataDensity", + components: { reportsView: DomainDensity }, + }, + { + path: "unmapped_source_codes", + name: "unmappedSourceCodes", + components: { reportsView: UnmappedSourceCodes }, + }, + { + path: "performance", + name: "performance", + components: { reportsView: PerformanceReport }, + }, + { + path: "person", + name: "person", + components: { reportsView: PersonReport }, + }, + { + path: "cohorts", + name: "cohorts", + components: { reportsView: CohortsTable }, + }, + { + path: "cohorts/:cohort_id/", + name: "cohortReport", + components: { reportsView: CohortDrilldownReport }, + }, + { + path: ":domain", + components: { reportsView: DomainTable }, + name: "domainTable", + }, + { + path: ":domain/:concept/", + components: { reportsView: ConceptReport }, + name: "concept", + }, + ], + }, +]; diff --git a/src/processes/exploreReports/index.js b/src/processes/exploreReports/index.ts similarity index 75% rename from src/processes/exploreReports/index.js rename to src/processes/exploreReports/index.ts index 8054ebb7..c8a67978 100644 --- a/src/processes/exploreReports/index.js +++ b/src/processes/exploreReports/index.ts @@ -1,5 +1,5 @@ import reportsDataStore from "@/processes/exploreReports/model/store/data.module"; import * as reportsDataActions from "./model/store/actions.type"; -import routes from "@/processes/exploreReports/config/routes"; +import { routes } from "@/processes/exploreReports/config/routes"; export { reportsDataStore, reportsDataActions, routes }; diff --git a/src/processes/exploreReports/model/interfaces/MultipleFilesRawInterface.ts b/src/processes/exploreReports/model/interfaces/MultipleFilesRawInterface.ts new file mode 100644 index 00000000..09da3f9f --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/MultipleFilesRawInterface.ts @@ -0,0 +1,10 @@ +import { + Source, + SourceRelease, +} from "@/processes/exploreReports/model/interfaces/files/SourceIndex"; + +export interface MultipleFilesRawInterface { + data: Type; + source?: Source; + release?: SourceRelease; +} diff --git a/src/processes/exploreReports/model/interfaces/files/AchillesPerformanceType.ts b/src/processes/exploreReports/model/interfaces/files/AchillesPerformanceType.ts new file mode 100644 index 00000000..8f3e77d8 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/AchillesPerformanceType.ts @@ -0,0 +1,6 @@ +export interface AchillesPerformanceType { + analysis_id: string | number; + analysis_name: string; + category: string; + elapsed_seconds: string | number; +} diff --git a/src/processes/exploreReports/model/interfaces/files/CdmSourceType.ts b/src/processes/exploreReports/model/interfaces/files/CdmSourceType.ts new file mode 100644 index 00000000..6988e5fb --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/CdmSourceType.ts @@ -0,0 +1,13 @@ +export interface CdmSourceType { + CDM_ETL_REFERENCE: string; + CDM_HOLDER: string; + CDM_RELEASE_DATE: string; + CDM_SOURCE_ABBREVIATION: string; + CDM_SOURCE_NAME: string; + CDM_VERSION: string; + CDM_VERSION_CONCEPT_ID: string | number; + SOURCE_DESCRIPTION: string; + SOURCE_DOCUMENTATION_REFERENCE: string; + SOURCE_RELEASE_DATE: string; + VOCABULARY_VERSION: string; +} diff --git a/src/processes/exploreReports/model/interfaces/files/ConceptType.ts b/src/processes/exploreReports/model/interfaces/files/ConceptType.ts new file mode 100644 index 00000000..d3f781d8 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/ConceptType.ts @@ -0,0 +1,42 @@ +import { DistributionType } from "@/processes/exploreReports/model/interfaces/reportTypes/DistributionType"; +import { RecordsCountType } from "@/processes/exploreReports/model/interfaces/reportTypes/RecordsCountType"; +import { FrequencyDistributionType } from "@/processes/exploreReports/model/interfaces/reportTypes/FrequencyDistributionType"; +import { PrevalenceType } from "@/processes/exploreReports/model/interfaces/reportTypes/PrevalenceType"; + +export interface ConceptType { + CDM_TABLE_NAME: string[]; + AGE_AT_FIRST_DIAGNOSIS?: DistributionType[]; + CONCEPT_ID: number[] | number; + CONCEPT_NAME: string[]; + NUM_PERSONS: number[]; + PERCENT_PERSONS: string[]; + RECORDS_PER_PERSON: string[]; + CONDITIONS_BY_TYPE: RecordsCountType[]; + PREVALENCE_BY_GENDER_AGE_YEAR: PrevalenceType[]; + PREVALENCE_BY_MONTH: PrevalenceType[]; + COUNT_FAILED?: string[]; + IS_STATIONARY: string[]; + SEASONALITY_SCORE: string[]; + AGE_AT_FIRST_OCCURRENCE?: DistributionType[]; + FREQUENCY_DISTRIBUTION?: FrequencyDistributionType[]; + LOWER_LIMIT_DISTRIBUTION?: string[]; + MEASUREMENTS_BY_TYPE?: RecordsCountType; + MEASUREMENT_VALUE_DISTRIBUTION?: DistributionType[]; + RECORDS_BY_UNIT?: RecordsCountType[]; + UPPER_LIMIT_DISTRIBUTION?: string[]; + VALUES_RELATIVE_TO_NORM?: string[]; + REFILLS_DISTRIBUTION?: DistributionType[]; + QUANTITY_DISTRIBUTION?: DistributionType[]; + DAYS_SUPPLY_DISTRIBUTION?: DistributionType[]; + DRUGS_BY_TYPE?: RecordsCountType[]; + DRUG_FREQUENCY_DISTRIBUTION?: FrequencyDistributionType[]; + VISIT_DURATION_BY_TYPE?: DistributionType[]; + VISIT_DETAIL_DURATION_BY_TYPE?: DistributionType[]; + OBS_FREQUENCY_DISTRIBUTION?: FrequencyDistributionType[]; + OBSERVATIONS_BY_TYPE?: RecordsCountType[]; + PROCEDURE_FREQUENCY_DISTRIBUTION?: FrequencyDistributionType[]; + PROCEDURES_BY_TYPE?: RecordsCountType[]; + DEVICE_FREQUENCY_DISTRIBUTION?: FrequencyDistributionType[]; + DEVICES_BY_TYPE?: RecordsCountType[]; + LENGTH_OF_ERA?: DistributionType[]; +} diff --git a/src/processes/exploreReports/model/interfaces/files/Death.ts b/src/processes/exploreReports/model/interfaces/files/Death.ts new file mode 100644 index 00000000..723526ba --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/Death.ts @@ -0,0 +1,10 @@ +import { DistributionType } from "@/processes/exploreReports/model/interfaces/reportTypes/DistributionType"; +import { RecordsCountType } from "@/processes/exploreReports/model/interfaces/reportTypes/RecordsCountType"; +import { PrevalenceType } from "@/processes/exploreReports/model/interfaces/reportTypes/PrevalenceType"; + +export interface Death { + AGE_AT_DEATH: DistributionType[]; + DEATH_BY_TYPE: RecordsCountType[]; + PREVALENCE_BY_GENDER_AGE_YEAR: PrevalenceType[]; + PREVALENCE_BY_MONTH: PrevalenceType[]; +} diff --git a/src/processes/exploreReports/model/interfaces/files/DensityRecordsPersonType.ts b/src/processes/exploreReports/model/interfaces/files/DensityRecordsPersonType.ts new file mode 100644 index 00000000..022e8d60 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/DensityRecordsPersonType.ts @@ -0,0 +1,5 @@ +export interface DensityRecordsPersonType { + date: string; + domain: string; + records: string; +} diff --git a/src/processes/exploreReports/model/interfaces/files/DensityTotal.ts b/src/processes/exploreReports/model/interfaces/files/DensityTotal.ts new file mode 100644 index 00000000..fc549b9b --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/DensityTotal.ts @@ -0,0 +1,5 @@ +export interface DensityTotal { + date: string; + domain: string; + records: string; +} diff --git a/src/processes/exploreReports/model/interfaces/files/DomainDrugStratificationType.ts b/src/processes/exploreReports/model/interfaces/files/DomainDrugStratificationType.ts new file mode 100644 index 00000000..4f2ee00f --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/DomainDrugStratificationType.ts @@ -0,0 +1,6 @@ +export interface DomainDrugStratificationType { + CDM_TABLE_NAME: string; + CONCEPT_ID: string | number; + CONCEPT_NAME: string; + RECORD_COUNT: string | number; +} diff --git a/src/processes/exploreReports/model/interfaces/files/DomainIssues.ts b/src/processes/exploreReports/model/interfaces/files/DomainIssues.ts new file mode 100644 index 00000000..51e8ca06 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/DomainIssues.ts @@ -0,0 +1,4 @@ +export interface DomainIssues { + cdm_table_name: string; + count_failed: string | number; +} diff --git a/src/processes/exploreReports/model/interfaces/files/DomainSummary.ts b/src/processes/exploreReports/model/interfaces/files/DomainSummary.ts new file mode 100644 index 00000000..86b0f566 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/DomainSummary.ts @@ -0,0 +1,9 @@ +export interface DomainSummary { + CONCEPT_ID: string; + CONCEPT_NAME: string; + NUM_PERSONS: string; + PERCENT_PERSONS: string; + PERCENT_PERSONS_NTILE: string; + RECORDS_PER_PERSON: string; + RECORDS_PER_PERSON_NTILE: string; +} diff --git a/src/processes/exploreReports/model/interfaces/files/DomainTable.ts b/src/processes/exploreReports/model/interfaces/files/DomainTable.ts new file mode 100644 index 00000000..64cef22b --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/DomainTable.ts @@ -0,0 +1,9 @@ +export interface DomainTable { + CONCEPT_ID: string | number; + CONCEPT_NAME: string; + NUM_PERSONS: string | number; + PERCENT_PERSONS: string; + PERCENT_PERSONS_NTILE: string | number; + RECORDS_PER_PERSON: string | number; + RECORDS_PER_PERSON_NTILE: string | number; +} diff --git a/src/processes/exploreReports/model/interfaces/files/DomainVisitStratificationType.ts b/src/processes/exploreReports/model/interfaces/files/DomainVisitStratificationType.ts new file mode 100644 index 00000000..15232e97 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/DomainVisitStratificationType.ts @@ -0,0 +1,5 @@ +export interface DomainVisitStratificationType { + CONCEPT_ID: string | number; + CONCEPT_NAME: string; + RECORD_COUNT: string | number; +} diff --git a/src/processes/exploreReports/model/interfaces/files/ObservationPeriodType.ts b/src/processes/exploreReports/model/interfaces/files/ObservationPeriodType.ts new file mode 100644 index 00000000..0bdb41b1 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/ObservationPeriodType.ts @@ -0,0 +1,29 @@ +import { DistributionType } from "@/processes/exploreReports/model/interfaces/reportTypes/DistributionType"; +import { DurationType } from "@/processes/exploreReports/model/interfaces/reportTypes/DurationType"; +import { RecordsCountType } from "@/processes/exploreReports/model/interfaces/reportTypes/RecordsCountType"; +import { HistogramType } from "@/processes/exploreReports/model/interfaces/reportTypes/HistogramType"; + +export interface ObservationPeriodType { + AGE_AT_FIRST_OBSERVATION: AGE_AT_FIRST_OBSERVATION[]; + AGE_BY_GENDER: DistributionType[]; + CUMULATIVE_DURATION: DurationType[]; + OBSERVATION_LENGTH_HISTOGRAM: HistogramType; + OBSERVATION_PERIOD_LENGTH_BY_AGE: DistributionType[]; + OBSERVATION_PERIOD_LENGTH_BY_GENDER: DistributionType[]; + OBSERVED_BY_MONTH: OBSERVED_BY_MONTH[]; + OBSERVED_BY_YEAR_HISTOGRAM: HistogramType; + PERSON_PERIODS_DATA: RecordsCountType[]; +} + +export interface AGE_AT_FIRST_OBSERVATION { + COUNT_VALUE: number; + INTERVAL_INDEX: number; + PERCENT_VALUE: number; +} + +export interface OBSERVED_BY_MONTH { + COUNT_VALUE: string; + DATE: Date; + MONTH_YEAR: string; + PERCENT_VALUE: number; +} diff --git a/src/processes/exploreReports/model/interfaces/files/Person.ts b/src/processes/exploreReports/model/interfaces/files/Person.ts new file mode 100644 index 00000000..80e8ca93 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/Person.ts @@ -0,0 +1,27 @@ +import { RecordsCountType } from "@/processes/exploreReports/model/interfaces/reportTypes/RecordsCountType"; + +export interface PersonData { + AGE_GENDER_DATA: AGE_GENDER_DATA[]; + BIRTH_YEAR_DATA: BIRTH_YEAR[]; + ETHNICITY_DATA: RecordsCountType[]; + GENDER_DATA: RecordsCountType[]; + RACE_DATA: RecordsCountType[]; + SUMMARY: SUMMARY[]; +} + +export interface AGE_GENDER_DATA { + AGE: number; + CONCEPT_ID: number; + CONCEPT_NAME: string; + COUNT_VALUE: number; +} + +export interface BIRTH_YEAR { + COUNT_PERSON: number; + YEAR: string | Date; +} + +export interface SUMMARY { + ATTRIBUTE_NAME: string; + ATTRIBUTE_VALUE: string; +} diff --git a/src/processes/exploreReports/model/interfaces/files/QualityCompletenessType.ts b/src/processes/exploreReports/model/interfaces/files/QualityCompletenessType.ts new file mode 100644 index 00000000..0f2d5e76 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/QualityCompletenessType.ts @@ -0,0 +1,6 @@ +export interface QualityCompletenessType { + CDM_FIELD_NAME: string; + CDM_TABLE_NAME: string; + RECORD_COUNT: string | number; + SOURCE_VALUE: string; +} diff --git a/src/processes/exploreReports/model/interfaces/files/QualityIndex.ts b/src/processes/exploreReports/model/interfaces/files/QualityIndex.ts new file mode 100644 index 00000000..d4161a5a --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/QualityIndex.ts @@ -0,0 +1,23 @@ +export interface QualityIndex { + dataQualityRecords: DataQualityRecord[]; + dataQualityRecordsStratified: DataQualityRecordStratified[]; +} + +export interface DataQualityRecord { + cdm_release_date: string; + cdm_source_abbreviation: string; + cdm_source_name: string; + count_failed: number; + count_passed: number; + count_total: number; + dqd_execution_date: string; + vocabulary_version: string; +} + +export interface DataQualityRecordStratified { + category: string; + cdm_release_date: string; + cdm_table_name: string; + count_value: number; + dqd_execution_date: string; +} diff --git a/src/processes/exploreReports/model/interfaces/files/QualityResultsType.ts b/src/processes/exploreReports/model/interfaces/files/QualityResultsType.ts new file mode 100644 index 00000000..3cc1749c --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/QualityResultsType.ts @@ -0,0 +1,64 @@ +export interface QualityResultsType { + CheckResults: CheckResults[]; + Metadata: Metadata; + endTimestamp: string[]; + executionTime: string[]; + startTimestamp: string; + Overview: Overview; +} + +export interface CheckResults { + category: string; + cdmFieldName: string; + cdmTableName: string; + checkDescription: string; + checkLevel: string; + checkName: string; + context: string; + executionTime: string; + failed: string; + notesExist: string; + numDenominatorRows: number; + numViolatedRows: number; + pctViolatedRows: number; + queryText: string; + sqlFile: string; + subcategory: string; + thresholdValue: number; + _row: string; + checkId: string; +} + +export interface Overview { + countErrorFailed: number[]; + countFailedCompleteness: number[]; + countFailedConformance: number[]; + countFailedPlausibility: number[]; + countOverallFailed: number[]; + countPassed: number[]; + countPassedCompleteness: number[]; + countPassedConformance: number[]; + countPassedPlausibility: number[]; + countThresholdFailed: number[]; + countTotal: number[]; + countTotalCompleteness: number[]; + countTotalConformance: number[]; + countTotalPlausibility: number[]; + percentFailed: number[]; + percentPassed: number[]; +} + +export interface Metadata { + cdmEtlReference: string; + cdmHolder: string; + cdmReleaseDate: string; + cdmSourceAbbreviation: string; + cdmSourceName: string; + cdmVersion: string; + cdmVersionConceptId: number; + dqdVersion: string; + sourceDescription: string; + sourceDocumentationReference: string; + sourceReleaseDate: string; + vocabularyVersion: string; +} diff --git a/src/processes/exploreReports/model/interfaces/files/QueryIndex.ts b/src/processes/exploreReports/model/interfaces/files/QueryIndex.ts new file mode 100644 index 00000000..f4be2aa5 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/QueryIndex.ts @@ -0,0 +1,160 @@ +export interface QueryIndexType { + ACHILLES_PERFORMANCE: string[]; + CDM_SOURCE: string[]; + CONDITION_ERA: ConditionEraInterface; + CONDITION_OCCURRENCE: ConditionOccurrenceInterface; + DATA_DENSITY: DataDensityInterface; + DEATH: DeathInterface; + DEVICE_EXPOSURE: DeviceExposure; + DOMAIN_SUMMARY: DomainSummary; + DRUG_ERA: DrugEra; + DRUG_EXPOSURE: DRUG_EXPOSURE; + MEASUREMENT: MEASUREMENT; + METADATA: string[]; + OBSERVATION: OBSERVATION; + OBSERVATION_PERIOD: OBSERVATION_PERIOD; + PERSON: PERSON; + PROCEDURE_OCCURRENCE: PROCEDURE_OCCURRENCE; + QUALITY_COMPLETENESS: string[]; + VISIT_DETAIL: VISIT_DETAIL; + VISIT_OCCURRENCE: VISIT_OCCURRENCE; +} + +interface ConditionEraInterface { + AGE_AT_FIRST_EXPOSURE: string[]; + LENGTH_OF_ERA: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + SUMMARY: string[]; +} +interface ConditionOccurrenceInterface { + AGE_AT_FIRST_DIAGNOSIS: string[]; + CONDITIONS_BY_TYPE: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + SUMMARY: string[]; +} + +interface DataDensityInterface { + DATADENSITY_CONCEPTS_PER_PERSON: string[]; + DATADENSITY_DOMAINS_PER_PERSON: string[]; + DATADENSITY_RECORDS_PER_PERSON: string[]; + DATADENSITY_TOTAL: string[]; +} + +interface DeathInterface { + AGE_AT_DEATH: string[]; + DEATH_BY_TYPE: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; +} + +interface DeviceExposure { + AGE_AT_FIRST_EXPOSURE: string[]; + DEVICES_BY_TYPE: string[]; + DEVICE_FREQUENCY_DISTRIBUTION: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + SUMMARY: string[]; +} + +interface DomainSummary { + CONDITION_ERA: string[]; + CONDITION_OCCURRENCE: string[]; + DEVICE_EXPOSURE: string[]; + DOMAIN_DRUG_STRATIFICATION: string[]; + DOMAIN_VISIT_STRATIFICATION: string[]; + DRUG_ERA: string[]; + DRUG_EXPOSURE: string[]; + MEASUREMENT: string[]; + OBSERVATION: string[]; + PROCEDURE_OCCURRENCE: string[]; + PROVIDER: string[]; + RECORDS_BY_DOMAIN: string[]; + VISIT_DETAIL: string[]; + VISIT_OCCURRENCE: string[]; +} + +interface DrugEra { + AGE_AT_FIRST_EXPOSURE: string[]; + LENGTH_OF_ERA: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + SUMMARY: string[]; +} + +interface DRUG_EXPOSURE { + AGE_AT_FIRST_EXPOSURE: string[]; + DAYS_SUPPLY_DISTRIBUTION: string[]; + DRUGS_BY_TYPE: string[]; + DRUG_FREQUENCY_DISTRIBUTION: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + QUANTITY_DISTRIBUTION: string[]; + REFILLS_DISTRIBUTION: string[]; + SUMMARY: string[]; +} +interface MEASUREMENT { + AGE_AT_FIRST_OCCURRENCE: string[]; + FREQUENCY_DISTRIBUTION: string[]; + LOWER_LIMIT_DISTRIBUTION: string[]; + MEASUREMENTS_BY_TYPE: string[]; + MEASUREMENT_VALUE_DISTRIBUTION: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + RECORDS_BY_UNIT: string[]; + SUMMARY: string[]; + UPPER_LIMIT_DISTRIBUTION: string[]; + VALUES_RELATIVE_TO_NORM: string[]; +} + +interface OBSERVATION { + AGE_AT_FIRST_OCCURRENCE: string[]; + OBSERVATIONS_BY_TYPE: string[]; + OBS_FREQUENCY_DISTRIBUTION: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + SUMMARY: string[]; +} +interface OBSERVATION_PERIOD { + AGE_AT_FIRST_OBSERVATION: string[]; + AGE_BY_GENDER: string[]; + CUMULATIVE_DURATION: string[]; + OBSERVATION_LENGTH_HISTOGRAM: string[]; + OBSERVATION_PERIOD_LENGTH_BY_AGE: string[]; + OBSERVATION_PERIOD_LENGTH_BY_GENDER: string[]; + OBSERVED_BY_MONTH: string[]; + OBSERVED_BY_YEAR_HISTOGRAM: string[]; + PERSON_PERIODS_DATA: string[]; +} +interface PERSON { + AGE_GENDER_DATA: string[]; + BIRTH_YEAR_DATA: string[]; + ETHNICITY_DATA: string[]; + GENDER_DATA: string[]; + RACE_DATA: string[]; + SUMMARY: string[]; +} +interface PROCEDURE_OCCURRENCE { + AGE_AT_FIRST_OCCURRENCE: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + PROCEDURES_BY_TYPE: string[]; + PROCEDURE_FREQUENCY_DISTRIBUTION: string[]; + SUMMARY: string[]; +} + +interface VISIT_DETAIL { + AGE_AT_FIRST_OCCURRENCE: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + SUMMARY: string[]; + VISIT_DETAIL_DURATION_BY_TYPE: string[]; +} +interface VISIT_OCCURRENCE { + AGE_AT_FIRST_OCCURRENCE: string[]; + PREVALENCE_BY_GENDER_AGE_YEAR: string[]; + PREVALENCE_BY_MONTH: string[]; + SUMMARY: string[]; + VISIT_DURATION_BY_TYPE: string[]; +} diff --git a/src/processes/exploreReports/model/interfaces/files/RecordsDomain.ts b/src/processes/exploreReports/model/interfaces/files/RecordsDomain.ts new file mode 100644 index 00000000..6bfb92a0 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/RecordsDomain.ts @@ -0,0 +1,4 @@ +export interface RecordsDomain { + domain: string; + count_records: string | number; +} diff --git a/src/processes/exploreReports/model/interfaces/files/SourceHistoryIndex.ts b/src/processes/exploreReports/model/interfaces/files/SourceHistoryIndex.ts new file mode 100644 index 00000000..3a9cd426 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/SourceHistoryIndex.ts @@ -0,0 +1,5 @@ +export interface SourceHistoryIndex { + count_records: number; + domain: string; + release_date: string; +} diff --git a/src/processes/exploreReports/model/interfaces/files/SourceIndex.ts b/src/processes/exploreReports/model/interfaces/files/SourceIndex.ts new file mode 100644 index 00000000..b639ae23 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/files/SourceIndex.ts @@ -0,0 +1,24 @@ +export interface Source { + average_update_interval_days: number; + cdm_holder: string; + cdm_source_abbreviation: string; + cdm_source_key: string; + cdm_source_name: string; + count_releases: number; + releases: SourceRelease[]; + source_description: string; +} + +export interface SourceRelease { + cdm_version: string; + count_data_quality_checks: number; + count_data_quality_issues: number; + count_person: number; + dqd_execution_date: string; + dqd_version: string; + obs_period_end: string; + obs_period_start: string; + release_id: string; + release_name: string; + vocabulary_version: string; +} diff --git a/src/processes/exploreReports/model/interfaces/reportTypes/DistributionType.ts b/src/processes/exploreReports/model/interfaces/reportTypes/DistributionType.ts new file mode 100644 index 00000000..7b276707 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/reportTypes/DistributionType.ts @@ -0,0 +1,11 @@ +export interface DistributionType { + CATEGORY: string; + MAX_VALUE: number; + MEDIAN_VALUE: number; + MIN_VALUE: number; + P10_VALUE: number; + P25_VALUE: number; + P75_VALUE: number; + P90_VALUE: number; + categoryOrder?: number; +} diff --git a/src/processes/exploreReports/model/interfaces/reportTypes/DurationType.ts b/src/processes/exploreReports/model/interfaces/reportTypes/DurationType.ts new file mode 100644 index 00000000..e7625967 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/reportTypes/DurationType.ts @@ -0,0 +1,4 @@ +export interface DurationType { + PERCENT_PEOPLE: number; + YEARS: number; +} diff --git a/src/processes/exploreReports/model/interfaces/reportTypes/FrequencyDistributionType.ts b/src/processes/exploreReports/model/interfaces/reportTypes/FrequencyDistributionType.ts new file mode 100644 index 00000000..569128ba --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/reportTypes/FrequencyDistributionType.ts @@ -0,0 +1,4 @@ +export interface FrequencyDistributionType { + X_COUNT: number; + Y_NUM_PERSONS: number; +} diff --git a/src/processes/exploreReports/model/interfaces/reportTypes/HistogramType.ts b/src/processes/exploreReports/model/interfaces/reportTypes/HistogramType.ts new file mode 100644 index 00000000..de442a39 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/reportTypes/HistogramType.ts @@ -0,0 +1,13 @@ +export interface HistogramType { + DATA?: Data[]; + INTERVALS: number[]; + INTERVAL_SIZE: number[]; + MAX: number[]; + MIN: number[]; +} + +interface Data { + COUNT_VALUE: number; + INTERVAL_INDEX: number; + PERCENT_VALUE: number; +} diff --git a/src/processes/exploreReports/model/interfaces/reportTypes/PrevalenceType.ts b/src/processes/exploreReports/model/interfaces/reportTypes/PrevalenceType.ts new file mode 100644 index 00000000..f789b3c1 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/reportTypes/PrevalenceType.ts @@ -0,0 +1,9 @@ +export interface PrevalenceType { + SERIES_NAME?: string; + TRELLIS_NAME?: string; + X_CALENDAR_YEAR?: number; + Y_PREVALENCE_1000PP: number; + trellisOrder?: number; + date?: Date; + X_CALENDAR_MONTH?: number; +} diff --git a/src/processes/exploreReports/model/interfaces/reportTypes/RecordsCountType.ts b/src/processes/exploreReports/model/interfaces/reportTypes/RecordsCountType.ts new file mode 100644 index 00000000..bcbc0a46 --- /dev/null +++ b/src/processes/exploreReports/model/interfaces/reportTypes/RecordsCountType.ts @@ -0,0 +1,5 @@ +export interface RecordsCountType { + CONCEPT_NAME: string; + CONCEPT_ID?: number; + COUNT_VALUE: number; +} diff --git a/src/processes/exploreReports/model/store/actions.type.js b/src/processes/exploreReports/model/store/actions.type.ts similarity index 100% rename from src/processes/exploreReports/model/store/actions.type.js rename to src/processes/exploreReports/model/store/actions.type.ts diff --git a/src/processes/exploreReports/model/store/data.module.js b/src/processes/exploreReports/model/store/data.module.js deleted file mode 100644 index c063290e..00000000 --- a/src/processes/exploreReports/model/store/data.module.js +++ /dev/null @@ -1,180 +0,0 @@ -import getFilePath from "@/shared/api/getFilePath"; -import loadFile from "@/shared/api/loadFile"; - -import preprocessing from "./preprocessing"; -import postprocessing from "./postprocessing"; - -import { CLEAR_DATA, SET_DATA } from "./mutations.type"; -import { - FETCH_FILES, - FETCH_MULTIPLE_FILES_BY_RELEASE, - FETCH_MULTIPLE_FILES_BY_SOURCE, - RESET_DATA_STORAGE, -} from "./actions.type"; - -import { errorActions } from "@/widgets/error"; - -const state = { - data: {}, -}; - -const getters = { - getData: (state) => { - return state.data; - }, - dataInStore: (state) => { - return Object.keys(state.data).length; - }, -}; - -const actions = { - [RESET_DATA_STORAGE]({ commit }) { - commit(CLEAR_DATA); - }, - async [FETCH_FILES]({ commit, dispatch, rootState }, payload) { - const promises = payload.files.map((file) => { - return loadFile( - getFilePath(payload.params ? payload.params : rootState.route.params)[ - file.name - ], - { - required: file.required, - } - ); - }); - - await Promise.allSettled(promises).then((responses) => { - const data = responses.reduce((obj, currValue, index) => { - if ( - currValue.value?.payload?.required && - currValue.value?.response?.isAxiosError - ) { - dispatch(errorActions.NEW_ERROR, { - message: currValue.value?.response.message, - details: currValue.value?.response?.config?.url, - }); - } - return { - ...obj, - [payload.files[index].name]: preprocessing[payload.files[index].name] - ? preprocessing[payload.files[index].name]( - currValue.value?.response?.data - ) - : currValue.value?.response?.data, - }; - }, {}); - postprocessing[rootState.route.name] - ? commit(SET_DATA, postprocessing[rootState.route.name](data)) - : commit(SET_DATA, data); - }); - }, - - async [FETCH_MULTIPLE_FILES_BY_SOURCE]( - { commit, dispatch, rootState, rootGetters }, - payload - ) { - const promises = payload.files.reduce( - (obj, file) => ({ - ...obj, - [file]: rootGetters.getSources.map((source) => { - return loadFile( - getFilePath({ - cdm: source.cdm_source_key, - release: source.releases[0].release_id, - domain: payload.params?.domain - ? payload.params.domain - : rootState.route.params.domain, - concept: payload.params?.concept - ? payload.params.concept - : rootState.route.params.concept, - })[file], - { source } - ); - }), - }), - {} - ); - - const data = {}; - for (const file in promises) { - await Promise.allSettled(promises[file]).then((responses) => { - data[file] = responses - .filter((response) => response.value?.response?.data) - .map((filtered) => ({ - data: preprocessing[file] - ? preprocessing[file](filtered.value.response.data) - : filtered.value.response.data, - source: filtered.value.payload.source, - })); - if (data[file].length === 0 && payload.criticalError) { - dispatch(errorActions.NEW_ERROR, { - message: "No files found across data sources", - details: "No additional data", - }); - } - }); - } - postprocessing[rootState.route.name] - ? commit(SET_DATA, postprocessing[rootState.route.name](data)) - : commit(SET_DATA, data); - }, - - async [FETCH_MULTIPLE_FILES_BY_RELEASE]( - { commit, dispatch, rootState, rootGetters }, - payload - ) { - const promises = payload.files.reduce( - (obj, file) => ({ - ...obj, - [file]: rootGetters.getSelectedSource.releases.map((release) => { - return loadFile( - getFilePath({ - cdm: rootGetters.getSelectedSource.cdm_source_key, - release: release.release_id, - domain: rootState.route.params.domain, - concept: rootState.route.params.concept, - })[file], - release.release_name - ); - }), - }), - {} - ); - const data = {}; - for (const file in promises) { - await Promise.allSettled(promises[file]).then((responses) => { - data[file] = responses - .filter((response) => response.value?.response?.data) - .map((filtered) => ({ - data: filtered.value.response.data, - release: filtered.value.payload, - })); - if (data[file].length === 0) { - dispatch(errorActions.NEW_ERROR, { - message: "No files found across current data source releases", - details: rootGetters.getSelectedSource.cdm_source_abbreviation, - }); - } - }); - } - postprocessing[rootState.route.name] - ? commit(SET_DATA, postprocessing[rootState.route.name](data)) - : commit(SET_DATA, data); - }, -}; - -const mutations = { - [SET_DATA](state, payload) { - state.data = payload; - }, - [CLEAR_DATA](state) { - state.data = {}; - }, -}; - -export default { - state, - getters, - actions, - mutations, -}; diff --git a/src/processes/exploreReports/model/store/data.module.ts b/src/processes/exploreReports/model/store/data.module.ts new file mode 100644 index 00000000..699f7644 --- /dev/null +++ b/src/processes/exploreReports/model/store/data.module.ts @@ -0,0 +1,411 @@ +import getFilePath from "@/shared/api/axios/files"; +import apiService from "@/shared/api/axios/apiService"; + +import preprocessing from "./preprocessing"; +import postprocessing from "./postprocessing"; + +import { CLEAR_DATA, SET_DATA } from "./mutations.type"; +import { + FETCH_FILES, + FETCH_MULTIPLE_FILES_BY_RELEASE, + FETCH_MULTIPLE_FILES_BY_SOURCE, + RESET_DATA_STORAGE, +} from "./actions.type"; + +import { errorActions } from "@/widgets/error"; +import db from "@/shared/api/duckdb/instance"; +import getDuckDBFilePath from "@/shared/api/duckdb/files"; +import environment from "@/shared/api/environment"; +import getFilesByView from "@/processes/exploreReports/config/dataLoadConfig"; +import errorMessages from "@/widgets/error/model/config/errorMessages"; + +const state = { + data: {}, +}; + +const getters = { + getData: (state) => { + return state.data.data; + }, + dataInStore: (state, getters, rootState) => { + if (rootState.route.name === "webApi") { + return Object.keys(rootState.webApiStore.apiData).length; + } + if (getFilesByView({ files: [] })[rootState.route.name]) { + return Object.keys(state.data).length; + } else { + return rootState.explorerStore.dataLoaded; + } + }, +}; + +async function fetchAxiosData(file, path) { + return apiService( + { + url: getFilePath( + file.params + ? file.params + : { + cdm: path.cdm.cdm_source_key, + release: path.release, + domain: path.domain, + concept: path.concept, + } + )[file.name], + method: "get", + }, + { + required: file.required, + } + ).then((response) => ({ + data: response.data, + payload: path, + })); +} + +async function fetchDuckDBData(file, payload, path, filter) { + const c = await db.connect(); + return c + .query( + `SELECT * FROM read_parquet('${ + getDuckDBFilePath({ + cdm: path.cdm.cdm_source_key, + release: path.release, + })[file.name] + }') ${filter};` + ) + .then((data) => ({ + data: data, + file: file, + duckdb_supported: payload.duckdb_supported, + payload: path, + })); +} + +function commitData(data, { dispatch, commit }, reportName) { + try { + if (data && Object.keys(data).length) { + postprocessing[reportName] + ? commit(SET_DATA, { + data: postprocessing[reportName](data), + }) + : commit(SET_DATA, { data }); + } else { + commit(SET_DATA, {}); + } + } catch (e) { + dispatch(errorActions.NEW_ERROR, { + userMessage: errorMessages.technicalError.codeError, + name: e.name, + details: e.message, + stack: e.stack, + type: "unexpected", + page: reportName, + }); + } +} + +function processData(data, isDuckDb, fileName) { + if (isDuckDb) { + return convertTableToArray(data); + } + if (!isDuckDb && preprocessing[fileName]) { + return preprocessing[fileName](data); + } else { + return data; + } +} + +function handleNetworkError(responses, { dispatch }, reportName, isDuckDb) { + const errorCode = responses[0].reason?.response?.status; + let errorMessage; + const errorDetails = responses.map((val) => ({ + url: val.reason?.config?.url, + errorCode, + })); + if (isDuckDb) { + errorMessage = + "The file is unavailable or the server isn't responding. Please check your internet connection and your data folder then try again"; + } + if (errorCode === 404 && !isDuckDb) { + errorMessage = errorMessages.reportsMissingFiles[reportName]; + } + if ( + ((errorCode && errorCode >= 500) || typeof errorCode !== "number") && + !isDuckDb + ) { + errorMessage = errorMessages.technicalError.networkError; + } + + if (errorMessage) { + const message = responses[0].reason.stack; + dispatch(errorActions.NEW_ERROR, { + userMessage: errorMessage, + technicalMessage: { errorCode, errorDetails, message }, + details: errorDetails, + }); + } +} + +function convertTableToArray(table) { + const dataTable = []; + for (const row of table) { + let rowData = {}; + for (const colName in row) { + if (row.hasOwnProperty(colName)) { + rowData = { ...rowData, [colName]: row[colName] }; + } + } + dataTable.push(rowData); + } + return dataTable; +} + +const actions = { + [RESET_DATA_STORAGE]({ commit }, payload) { + if (payload?.skipLoading) { + commit(CLEAR_DATA, payload?.skipLoading); + } else { + commit(CLEAR_DATA); + } + }, + + async [FETCH_FILES]({ commit, dispatch, rootState }, payload) { + const isDuckDb = payload.duckdb_supported && environment.DUCKDB_ENABLED; + const reportName = rootState.route.name; + const path = { + cdm: { + cdm_source_key: payload.params?.cdm + ? payload.params?.cdm + : rootState.route.params.cdm, + }, + release: payload.params?.release + ? payload.params?.release + : rootState.route.params.release, + domain: payload.params?.domain + ? payload.params?.domain + : rootState.route.params.domain, + concept: payload.params?.concept + ? payload.params?.concept + : rootState.route.params.concept, + cohortId: payload.params?.cohort_id + ? payload.params?.cohort_id + : rootState.route.params.cohort_id, + }; + if (!payload.files) { + commit(SET_DATA, { data: {} }); + return; + } + const promises = payload.files.map((file) => { + if (isDuckDb && file.source !== "axios") { + const filterConcept = `WHERE DOMAIN == '${path.domain}' AND CONCEPT_ID == ${path.concept}`; + const filterCohort = `WHERE COHORT_ID == ${path.cohortId}`; + return fetchDuckDBData( + file, + payload, + path, + path.concept ? filterConcept : path.cohortId ? filterCohort : "" + ); + } else { + return fetchAxiosData(file, path); + } + }); + + let data = {}; + await Promise.allSettled(promises).then((responses) => { + responses.forEach((response, index) => { + const status = response.status; + const fileData = response.value?.data; + const fileName = payload.files[index].name; + const isRequired = payload.files[index].required; + + if (status === "fulfilled") { + //data processing + data[fileName] = processData( + fileData, + isDuckDb && payload.files[index].source !== "axios", + fileName + ); + } else { + if (isRequired) { + handleNetworkError( + [response], + { dispatch }, + reportName, + isDuckDb && payload.files[index].source !== "axios" + ); + data = null; + return; + } + data[fileName] = []; + } + }); + + if (data) { + commitData(data, { dispatch, commit }, reportName); + } + }); + }, + + async [FETCH_MULTIPLE_FILES_BY_SOURCE]( + { commit, dispatch, rootState, rootGetters }, + payload + ) { + if (!payload.files) { + commit(SET_DATA, { data: {} }); + return; + } else { + const isDuckDb = environment.DUCKDB_ENABLED && payload.duckdb_supported; + + const reportName = rootState.route.name; + const promises = payload.files.reduce((obj, file) => { + obj[file.name] = rootGetters.getSources.reduce( + (filesArray, currentSource) => { + const loadedFiles = file.instanceParams.reduce( + (array, currentInstance) => { + const path = { + cdm: currentSource, + release: currentSource.releases[0].release_id, + domain: + currentInstance.domain || rootState.route.params.domain, + concept: + currentInstance.concept || rootState.route.params.concept, + }; + const filter = `WHERE DOMAIN == '${path.domain}' AND CONCEPT_ID == ${path.concept}`; + + const fetchData = + isDuckDb && file.source !== "axios" + ? fetchDuckDBData(file, payload, path, filter) + : fetchAxiosData(file, path); + return [...array, fetchData]; + }, + [] + ); + + return [...filesArray, ...loadedFiles]; + }, + [] + ); + + return obj; + }, {}); + + const data = {}; + for (const file in promises) { + const responses = await Promise.allSettled(promises[file]); + data[file] = responses + .filter((response) => response.status === "fulfilled") + .map((filtered) => ({ + data: isDuckDb + ? convertTableToArray(filtered.value.data) + : preprocessing[file] + ? preprocessing[file](filtered.value.data) + : filtered.value?.data, + source: filtered.value?.payload.cdm, + })); + + //handle network error + if (data[file].length === 0 && payload.criticalError) { + handleNetworkError(responses, { dispatch }, reportName, isDuckDb); + } + } + if (data) { + commitData(data, { dispatch, commit }, reportName); + } + } + }, + + async [FETCH_MULTIPLE_FILES_BY_RELEASE]( + { commit, dispatch, rootState, rootGetters }, + payload + ) { + if (!payload.files) { + commit(SET_DATA, { data: {} }); + return; + } + const isDuckDb = payload.duckdb_supported && environment.DUCKDB_ENABLED; + const reportName = rootState.route.name; + const promises = payload.files.reduce((obj, file) => { + const selectedSource = rootGetters.getSelectedSource; + const params = { + cdm: selectedSource.cdm_source_key, + domain: rootState.route.params.domain, + concept: rootState.route.params.concept, + }; + + obj[file.name] = selectedSource.releases.map((release) => { + if (isDuckDb && file.source !== "axios") { + const filter = `WHERE DOMAIN == '${params.domain}' AND CONCEPT_ID == ${params.concept}`; + + return fetchDuckDBData( + file, + payload, + { + ...params, + release: release.release_id, + }, + filter + ); + } else { + const url = getFilePath({ + ...params, + release: release.release_id, + })[file.name]; + + return apiService( + { + url, + method: "get", + }, + release.release_name + ); + } + }); + + return obj; + }, {}); + + let data = {}; + for (const file in promises) { + const responses = await Promise.allSettled(promises[file]); + data[file] = responses + .filter((response) => response.status === "fulfilled") + .map((filtered) => { + const { data, payload } = filtered.value; + return { + data: processData(data, isDuckDb, file), + release: payload, + }; + }); + if (data[file].length === 0) { + handleNetworkError(responses[0], { dispatch }, reportName, isDuckDb); + data = null; + } + } + if (data) { + commitData(data, { dispatch, commit }, reportName); + } + }, +}; + +const mutations = { + [SET_DATA](state, payload) { + state.data = { ...state.data, ...payload }; + }, + [CLEAR_DATA](state, payload) { + if (payload) { + state.data = { showLoading: false }; + state.webApiData = {}; + } else { + state.data = {}; + state.webApiData = {}; + } + }, +}; + +export default { + state, + getters, + actions, + mutations, +}; diff --git a/src/processes/exploreReports/model/store/mutations.type.js b/src/processes/exploreReports/model/store/mutations.type.ts similarity index 57% rename from src/processes/exploreReports/model/store/mutations.type.js rename to src/processes/exploreReports/model/store/mutations.type.ts index c6ff8522..549d3f90 100644 --- a/src/processes/exploreReports/model/store/mutations.type.js +++ b/src/processes/exploreReports/model/store/mutations.type.ts @@ -1,2 +1,3 @@ export const SET_DATA = "setData"; export const CLEAR_DATA = "clearData"; +export const SET_LOADING_STATUS = "setLoadingStatus"; diff --git a/src/processes/exploreReports/model/store/postprocessing/cohortReport.ts b/src/processes/exploreReports/model/store/postprocessing/cohortReport.ts new file mode 100644 index 00000000..e926df16 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/cohortReport.ts @@ -0,0 +1,30 @@ +import { + COHORT_CHARACTERIZATION, + COHORT_INDEX_EVENT_BREAKDOWN, + COHORT_TEMPORAL_COVARIATE_DISTRIBUTION, +} from "@/shared/config/files"; + +export default function cohortReport(data) { + const characterizationTable = data[COHORT_CHARACTERIZATION].map((val) => ({ + ...val, + mean: parseFloat(val.mean), + sd: parseFloat(val.sd), + temporal_choice: val.temporal_choice || "N/A", + })); + const indexEventBreakdownTable = data[COHORT_INDEX_EVENT_BREAKDOWN]; + const timeMeasures = [ + "observation time (days) prior to index", + "observation time (days) after index", + "time (days) between cohort start and end", + ]; + const timeDistribution = data[COHORT_TEMPORAL_COVARIATE_DISTRIBUTION].filter( + (val) => { + return timeMeasures.includes(val.covariate_name); + } + ); + return { + characterizationTable, + indexEventBreakdownTable, + timeDistribution, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/conceptReport.js b/src/processes/exploreReports/model/store/postprocessing/conceptReport.js deleted file mode 100644 index 083d8117..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/conceptReport.js +++ /dev/null @@ -1,56 +0,0 @@ -import sortByRange from "@/shared/lib/range-sort"; -import * as d3 from "d3-time-format"; -import { CONCEPT, DOMAIN_SUMMARY } from "@/shared/config/files"; -import * as d3Format from "d3-format"; - -export default function concept(data) { - const dateParse = d3.timeParse("%Y%m"); - const conceptData = data[CONCEPT]; - const domainSummary = data[DOMAIN_SUMMARY]; - const conceptName = conceptData.CONCEPT_NAME[0]; - const conceptId = conceptData.CONCEPT_ID[0]; - const numPersons = d3Format.format(",")(conceptData.NUM_PERSONS[0]); - const percentPersons = conceptData.PERCENT_PERSONS[0]; - const recordsPerPerson = conceptData.RECORDS_PER_PERSON[0]; - let countFailed; - let isNotStationary; - let seasonalityScore; - let seasonalityComment; - - if (conceptData.COUNT_FAILED) { - countFailed = conceptData.COUNT_FAILED[0]; - } - - if (conceptData.IS_STATIONARY) { - isNotStationary = !conceptData.IS_STATIONARY[0]; - } - - if (conceptData.SEASONALITY_SCORE) { - seasonalityScore = conceptData.SEASONALITY_SCORE[0]; - seasonalityComment = "Seasonality score of " + seasonalityScore + "."; - } - - conceptData.PREVALENCE_BY_GENDER_AGE_YEAR = sortByRange( - conceptData.PREVALENCE_BY_GENDER_AGE_YEAR, - "ascending", - "TRELLIS_NAME", - "trellisOrder" - ); - - conceptData.PREVALENCE_BY_MONTH.forEach((v, i) => { - conceptData.PREVALENCE_BY_MONTH[i].date = dateParse(v.X_CALENDAR_MONTH); - }); - return { - conceptData, - conceptName, - conceptId, - numPersons, - countFailed, - isNotStationary, - seasonalityScore, - seasonalityComment, - percentPersons, - recordsPerPerson, - domainSummary, - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/conceptReport.ts b/src/processes/exploreReports/model/store/postprocessing/conceptReport.ts new file mode 100644 index 00000000..d2131fc8 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/conceptReport.ts @@ -0,0 +1,107 @@ +import sortByRange from "@/shared/lib/range-sort"; +import * as d3 from "d3-time-format"; +import { CONCEPT, DOMAIN_SUMMARY } from "@/shared/config/files"; +import { ConceptType } from "@/processes/exploreReports/model/interfaces/files/ConceptType"; +import { DomainSummary } from "@/processes/exploreReports/model/interfaces/files/DomainSummary"; +import environment from "@/shared/api/environment"; +import { CONCEPT_METADATA } from "@/shared/api/duckdb/files"; + +export default function concept(data) { + const dateParse = d3.timeParse("%Y%m"); + const metadata = data[CONCEPT_METADATA]?.[0]; + let conceptData: ConceptType; + let conceptName: string | string[]; + let conceptId: number | number[]; + let numPersons: number | number[]; + let percentPersons: string | string[]; + let recordsPerPerson: string | string[]; + let countFailed: string | string[]; + let isNotStationary: boolean; + let seasonalityScore: string | string[]; + let seasonalityComment: string; + + if (environment.DUCKDB_ENABLED) { + if (metadata) { + conceptData = { ...data, ...metadata }; + } else { + conceptData = data; + } + conceptName = conceptData.CONCEPT_NAME; + conceptId = conceptData.CONCEPT_ID; + numPersons = conceptData.NUM_PERSONS; + percentPersons = conceptData.PERCENT_PERSONS; + recordsPerPerson = conceptData.RECORDS_PER_PERSON; + countFailed = conceptData.COUNT_FAILED; + if (conceptData.IS_STATIONARY) { + isNotStationary = !conceptData.IS_STATIONARY; + } + if (conceptData.SEASONALITY_SCORE) { + seasonalityScore = conceptData.SEASONALITY_SCORE; + } + } else { + conceptData = data[CONCEPT]; + conceptName = conceptData.CONCEPT_NAME?.[0]; + conceptId = conceptData.CONCEPT_ID?.[0]; + numPersons = conceptData.NUM_PERSONS?.[0]; + percentPersons = conceptData.PERCENT_PERSONS?.[0]; + recordsPerPerson = conceptData.RECORDS_PER_PERSON?.[0]; + countFailed = conceptData.COUNT_FAILED?.[0]; + isNotStationary = !conceptData.IS_STATIONARY?.[0]; + seasonalityScore = + conceptData.SEASONALITY_SCORE?.[0] || conceptData.SEASONALITY_SCORE; + } + + if (seasonalityScore) { + seasonalityComment = "Seasonality score of " + seasonalityScore + "."; + } + + const domainSummary: DomainSummary = data[DOMAIN_SUMMARY]; + + if ( + conceptData.PREVALENCE_BY_GENDER_AGE_YEAR && + conceptData.PREVALENCE_BY_GENDER_AGE_YEAR.length + ) { + conceptData.PREVALENCE_BY_GENDER_AGE_YEAR = sortByRange( + conceptData.PREVALENCE_BY_GENDER_AGE_YEAR, + "ascending", + "TRELLIS_NAME", + "trellisOrder" + ); + } + + if ( + conceptData.PREVALENCE_BY_MONTH && + conceptData.PREVALENCE_BY_MONTH.length + ) { + conceptData.PREVALENCE_BY_MONTH.forEach((v, i) => { + conceptData.PREVALENCE_BY_MONTH[i].date = dateParse( + v.X_CALENDAR_MONTH.toString() + ); + }); + } + + const measurementTable = + conceptData.MEASUREMENT_VALUE_DISTRIBUTION && + conceptData.MEASUREMENT_VALUE_DISTRIBUTION.length + ? conceptData.MEASUREMENT_VALUE_DISTRIBUTION.map((value) => ({ + ...value, + UNIT_COUNT: conceptData.RECORDS_BY_UNIT.filter( + (val) => val.CONCEPT_NAME === value.CATEGORY + )[0].COUNT_VALUE, + })) + : null; + return { + conceptData, + conceptName, + conceptId, + numPersons, + countFailed, + isNotStationary, + seasonalityScore, + seasonalityComment, + percentPersons, + recordsPerPerson, + domainSummary, + measurementTable, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/dataDensity.js b/src/processes/exploreReports/model/store/postprocessing/dataDensity.js deleted file mode 100644 index be70c831..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/dataDensity.js +++ /dev/null @@ -1,8 +0,0 @@ -import { DENSITY_RECORDS_PERSON, DENSITY_TOTAL } from "@/shared/config/files"; - -export default function dataDensity(data) { - return { - domainDensity: data[DENSITY_TOTAL], - domainRecords: data[DENSITY_RECORDS_PERSON], - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/dataDensity.ts b/src/processes/exploreReports/model/store/postprocessing/dataDensity.ts new file mode 100644 index 00000000..1e940de1 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/dataDensity.ts @@ -0,0 +1,13 @@ +import { DENSITY_RECORDS_PERSON, DENSITY_TOTAL } from "@/shared/config/files"; +import { DensityTotal } from "@/processes/exploreReports/model/interfaces/files/DensityTotal"; +import { DensityRecordsPersonType } from "@/processes/exploreReports/model/interfaces/files/DensityRecordsPersonType"; + +export default function dataDensity(data) { + const densityTotal: DensityTotal[] = data[DENSITY_TOTAL]; + const densityRecordsPerson: DensityRecordsPersonType[] = + data[DENSITY_RECORDS_PERSON]; + return { + domainDensity: densityTotal, + domainRecords: densityRecordsPerson, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/dataQualityResults.js b/src/processes/exploreReports/model/store/postprocessing/dataQualityResults.js deleted file mode 100644 index 7df0c5ae..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/dataQualityResults.js +++ /dev/null @@ -1,35 +0,0 @@ -import { QUALITY_RESULTS } from "@/shared/config/files"; -import deriveResults from "@/shared/lib/derive-results"; - -export default function dataQuality(data) { - const rawData = data[QUALITY_RESULTS]; - const derivedResults = deriveResults(data[QUALITY_RESULTS]); - const cdmSourceName = rawData.Metadata[0].CDM_SOURCE_NAME; - const sourceDescription = rawData.Metadata[0].SOURCE_DESCRIPTION; - const cdmHolder = rawData.Metadata[0].CDM_HOLDER; - const cdmEtlReference = rawData.Metadata[0].CDM_ETL_REFERENCE; - const sourceDocumentationReference = - rawData.Metadata[0].SOURCE_DOCUMENTATION_REFERENCE; - const cdmVersion = rawData.Metadata[0].CDM_VERSION; - const vocabularyVersion = rawData.Metadata[0].VOCABULARY_VERSION; - const dqdVersion = rawData.Metadata[0].DQD_VERSION; - const sourceReleaseDate = rawData.Metadata[0].SOURCE_RELEASE_DATE; - const cdmReleaseDate = rawData.Metadata[0].CDM_RELEASE_DATE; - const checkResults = rawData.CheckResults; - - return { - rawData, - derivedResults, - checkResults, - cdmHolder, - cdmVersion, - cdmReleaseDate, - cdmSourceName, - sourceDescription, - cdmEtlReference, - sourceDocumentationReference, - vocabularyVersion, - sourceReleaseDate, - dqdVersion, - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/dataQualityResults.ts b/src/processes/exploreReports/model/store/postprocessing/dataQualityResults.ts new file mode 100644 index 00000000..aa049818 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/dataQualityResults.ts @@ -0,0 +1,42 @@ +import { QUALITY_RESULTS } from "@/shared/config/files"; +import deriveResults from "@/shared/lib/derive-results"; +import { + CheckResults, + QualityResultsType, +} from "@/processes/exploreReports/model/interfaces/files/QualityResultsType"; + +export default function dataQuality(data) { + const rawData: QualityResultsType = data[QUALITY_RESULTS]; + let derivedResults; + if (rawData) { + derivedResults = deriveResults(rawData.CheckResults); + } + const cdmSourceName: string = rawData.Metadata?.[0]?.cdmSourceName; + const sourceDescription: string = rawData.Metadata?.[0]?.sourceDescription; + const cdmHolder: string = rawData.Metadata?.[0]?.cdmHolder; + const cdmEtlReference: string = rawData.Metadata?.[0]?.cdmEtlReference; + const sourceDocumentationReference: string = + rawData.Metadata[0]?.sourceDocumentationReference; + const cdmVersion: string = rawData.Metadata?.[0]?.cdmVersion; + const vocabularyVersion: string = rawData.Metadata?.[0]?.vocabularyVersion; + const dqdVersion: string = rawData.Metadata?.[0]?.dqdVersion; + const sourceReleaseDate: string = rawData.Metadata?.[0]?.sourceReleaseDate; + const cdmReleaseDate: string = rawData.Metadata?.[0]?.cdmReleaseDate; + const checkResults: CheckResults[] = rawData.CheckResults; + + return { + rawData, + derivedResults, + checkResults, + cdmHolder, + cdmVersion, + cdmReleaseDate, + cdmSourceName, + sourceDescription, + cdmEtlReference, + sourceDocumentationReference, + vocabularyVersion, + sourceReleaseDate, + dqdVersion, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/dataSourceOverview.ts b/src/processes/exploreReports/model/store/postprocessing/dataSourceOverview.ts new file mode 100644 index 00000000..3afe857c --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/dataSourceOverview.ts @@ -0,0 +1,24 @@ +import { RECORDS_DOMAIN } from "@/shared/config/files"; +import { RecordsDomain } from "@/processes/exploreReports/model/interfaces/files/RecordsDomain"; +import { MultipleFilesRawInterface } from "@/processes/exploreReports/model/interfaces/MultipleFilesRawInterface"; + +export default function dataSourceOverview(data) { + const recordsDomain: MultipleFilesRawInterface[] = + data[RECORDS_DOMAIN]; + let processedData; + + if (recordsDomain && recordsDomain.length) { + processedData = recordsDomain.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data.map((value) => ({ + ...value, + cdm_release_key: current.release, + })), + ], + [] + ); + } + + return { dataStrandReport: processedData }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/deathReport.js b/src/processes/exploreReports/model/store/postprocessing/deathReport.js deleted file mode 100644 index 70ca0d40..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/deathReport.js +++ /dev/null @@ -1,20 +0,0 @@ -import * as d3 from "d3-time-format"; -import { DEATH } from "@/shared/config/files"; -import sortByRange from "@/shared/lib/range-sort"; - -export default function death(data) { - const dateParse = d3.timeParse("%Y%m"); - const deathData = data[DEATH]; - deathData.PREVALENCE_BY_GENDER_AGE_YEAR = sortByRange( - deathData.PREVALENCE_BY_GENDER_AGE_YEAR, - "ascending", - "TRELLIS_NAME", - "trellisOrder" - ); - deathData.PREVALENCE_BY_MONTH.forEach((v, i) => { - deathData.PREVALENCE_BY_MONTH[i].date = dateParse(v.X_CALENDAR_MONTH); - }); - return { - ...deathData, - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/deathReport.ts b/src/processes/exploreReports/model/store/postprocessing/deathReport.ts new file mode 100644 index 00000000..a6685272 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/deathReport.ts @@ -0,0 +1,31 @@ +import * as d3 from "d3-time-format"; +import { DEATH } from "@/shared/config/files"; +import sortByRange from "@/shared/lib/range-sort"; +import { Death } from "@/processes/exploreReports/model/interfaces/files/Death"; + +export default function death(data) { + const dateParse = d3.timeParse("%Y%m"); + const deathData: Death = data[DEATH]; + if ( + deathData.PREVALENCE_BY_GENDER_AGE_YEAR && + deathData.PREVALENCE_BY_GENDER_AGE_YEAR.length + ) { + deathData.PREVALENCE_BY_GENDER_AGE_YEAR = sortByRange( + deathData.PREVALENCE_BY_GENDER_AGE_YEAR, + "ascending", + "TRELLIS_NAME", + "trellisOrder" + ); + } + if (deathData.PREVALENCE_BY_MONTH && deathData.PREVALENCE_BY_MONTH.length) { + deathData.PREVALENCE_BY_MONTH.forEach((v, i) => { + deathData.PREVALENCE_BY_MONTH[i].date = dateParse( + v.X_CALENDAR_MONTH.toString() + ); + }); + } + + return { + ...deathData, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/domainContinuity.js b/src/processes/exploreReports/model/store/postprocessing/domainContinuity.js deleted file mode 100644 index c1ab4aba..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/domainContinuity.js +++ /dev/null @@ -1,5 +0,0 @@ -import { SOURCE_HISTORY_INDEX } from "@/shared/config/files"; - -export default function domainContinuity(data) { - return { ...data[SOURCE_HISTORY_INDEX] }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/domainContinuity.ts b/src/processes/exploreReports/model/store/postprocessing/domainContinuity.ts new file mode 100644 index 00000000..c2a93705 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/domainContinuity.ts @@ -0,0 +1,11 @@ +import { SOURCE_HISTORY_INDEX } from "@/shared/config/files"; +import { SourceHistoryIndex } from "@/processes/exploreReports/model/interfaces/files/SourceHistoryIndex"; + +export default function domainContinuity(data) { + const historyIndex: SourceHistoryIndex[] = data[SOURCE_HISTORY_INDEX]; + if (historyIndex) { + return { ...historyIndex }; + } else { + return {}; + } +} diff --git a/src/processes/exploreReports/model/store/postprocessing/domainTable.js b/src/processes/exploreReports/model/store/postprocessing/domainTable.js deleted file mode 100644 index 085982de..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/domainTable.js +++ /dev/null @@ -1,20 +0,0 @@ -import { - DOMAIN_DRUG_STRATIFICATION, - DOMAIN_ISSUES, - DOMAIN_SUMMARY, - DOMAIN_VISIT_STRATIFICATION, -} from "@/shared/config/files"; - -export default function domainTable(data) { - const domainTable = data[DOMAIN_SUMMARY]; - const domainIssues = data[DOMAIN_ISSUES]; - const drugStratification = data[DOMAIN_DRUG_STRATIFICATION]; - const domainStratification = data[DOMAIN_VISIT_STRATIFICATION]; - - return { - domainTable, - domainIssues, - domainStratification, - drugStratification, - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/domainTable.ts b/src/processes/exploreReports/model/store/postprocessing/domainTable.ts new file mode 100644 index 00000000..558ec37b --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/domainTable.ts @@ -0,0 +1,29 @@ +import { + DOMAIN_DRUG_STRATIFICATION, + DOMAIN_ISSUES, + DOMAIN_SUMMARY, + DOMAIN_VISIT_STRATIFICATION, + METADATA, +} from "@/shared/config/files"; +import { DomainSummary } from "@/processes/exploreReports/model/interfaces/files/DomainSummary"; +import { DomainIssues } from "@/processes/exploreReports/model/interfaces/files/DomainIssues"; +import { DomainDrugStratificationType } from "@/processes/exploreReports/model/interfaces/files/DomainDrugStratificationType"; +import { DomainVisitStratificationType } from "@/processes/exploreReports/model/interfaces/files/DomainVisitStratificationType"; + +export default function domainTable(data) { + const metadataData = data[METADATA]; + const domainTable: DomainSummary[] = data[DOMAIN_SUMMARY]; + const domainIssues: DomainIssues[] = data[DOMAIN_ISSUES]; + const drugStratification: DomainDrugStratificationType[] = + data[DOMAIN_DRUG_STRATIFICATION]; + const domainStratification: DomainVisitStratificationType[] = + data[DOMAIN_VISIT_STRATIFICATION]; + + return { + domainTable, + domainIssues, + domainStratification, + drugStratification, + metadataData, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/feasibility.js b/src/processes/exploreReports/model/store/postprocessing/feasibility.js deleted file mode 100644 index f5de9155..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/feasibility.js +++ /dev/null @@ -1,22 +0,0 @@ -import { - CONCEPT, - DENSITY_DOMAIN_PERSON, - DOMAIN_SUMMARY, - OBSERVATION_PERIOD, - PERSON, -} from "@/shared/config/files"; - -export default function feasibility(data) { - const observationPeriod = data[OBSERVATION_PERIOD]; - const person = data[PERSON]; - const concept = data[CONCEPT]; - const sources = data[DENSITY_DOMAIN_PERSON]?.map((file) => ({ - data: file.data, - source: file.source.cdm_source_abbreviation, - })); - const domainSummary = data[DOMAIN_SUMMARY]?.map((file) => ({ - data: file.data, - source: file.source.cdm_source_abbreviation, - })); - return { observationPeriod, person, sources, domainSummary, concept }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/feasibility.ts b/src/processes/exploreReports/model/store/postprocessing/feasibility.ts new file mode 100644 index 00000000..af816f9b --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/feasibility.ts @@ -0,0 +1,64 @@ +import { + CONCEPT, + DENSITY_DOMAIN_PERSON, + DOMAIN_SUMMARY, + OBSERVATION_PERIOD, + PERSON, +} from "@/shared/config/files"; +import { PersonData } from "@/processes/exploreReports/model/interfaces/files/Person"; +import { ObservationPeriodType } from "@/processes/exploreReports/model/interfaces/files/ObservationPeriodType"; +import environment from "@/shared/api/environment"; +import { CONCEPT_METADATA } from "@/shared/api/duckdb/files"; + +function combineObjectsBySource(inputObject) { + const resultArray = []; + const sources = inputObject[CONCEPT_METADATA].map((data) => data.source); + + sources.forEach((source) => { + const combinedData = {}; + + for (const key in inputObject) { + if (key !== "domainSummary") { + const fieldArray = inputObject[key]; + const matchingItem = fieldArray.find( + (item) => item.source.cdm_source_key === source.cdm_source_key + ); + combinedData[key] = matchingItem ? matchingItem.data : null; + } else { + combinedData[key] = inputObject[key]; + } + } + + resultArray.push({ source: source, data: combinedData }); + }); + + return resultArray; +} + +export default function feasibility(data) { + const observationPeriod: ObservationPeriodType = data[OBSERVATION_PERIOD]; + const person: PersonData = data[PERSON]; + + let concept, conceptId; + if (environment.DUCKDB_ENABLED && data[CONCEPT_METADATA]) { + concept = combineObjectsBySource(data); + conceptId = concept?.[0]?.data[CONCEPT_METADATA]?.[0]?.CONCEPT_ID; + } else { + concept = data[CONCEPT]; + conceptId = concept?.[0]?.data?.CONCEPT_ID?.[0]; + } + + const sources = (data[DENSITY_DOMAIN_PERSON] || []).map((file) => ({ + data: file.data, + source: file.source.cdm_source_abbreviation, + })); + + const domainSummary = (data[DOMAIN_SUMMARY] || []).map((file) => ({ + data: file.data, + source: file.source.cdm_source_abbreviation, + })); + + return conceptId + ? { observationPeriod, person, sources, domainSummary, concept } + : { observationPeriod, person, sources, domainSummary }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/index.js b/src/processes/exploreReports/model/store/postprocessing/index.ts similarity index 79% rename from src/processes/exploreReports/model/store/postprocessing/index.js rename to src/processes/exploreReports/model/store/postprocessing/index.ts index ba1aa638..84f09911 100644 --- a/src/processes/exploreReports/model/store/postprocessing/index.js +++ b/src/processes/exploreReports/model/store/postprocessing/index.ts @@ -15,6 +15,10 @@ import concept from "@/processes/exploreReports/model/store/postprocessing/conce import domainTable from "@/processes/exploreReports/model/store/postprocessing/domainTable"; import feasibility from "@/processes/exploreReports/model/store/postprocessing/feasibility"; import networkUnmappedSourceCodes from "@/processes/exploreReports/model/store/postprocessing/networkUnmappedSourceCodes"; +import networkDiversityReport from "@/processes/exploreReports/model/store/postprocessing/networkDiversityReport"; +import cohortReport from "@/processes/exploreReports/model/store/postprocessing/cohortReport"; +import networkConceptDashboard from "@/processes/exploreReports/model/store/postprocessing/networkConceptDashboard"; +import dataSourceOverview from "@/processes/exploreReports/model/store/postprocessing/dataSourceOverview"; export default { dataStrandReport, @@ -30,8 +34,12 @@ export default { observationPeriod, performance, domainContinuity, + networkDiversityReport, concept, domainTable, feasibility, networkUnmappedSourceCodes, + cohortReport, + networkConceptDashboard, + dataSourceOverview, }; diff --git a/src/processes/exploreReports/model/store/postprocessing/location.ts b/src/processes/exploreReports/model/store/postprocessing/location.ts new file mode 100644 index 00000000..3e887f18 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/location.ts @@ -0,0 +1,8 @@ +import { LOCATION } from "@/shared/config/files"; + +export default function metadata(data) { + const location = data[LOCATION]; + return { + location, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/metadata.js b/src/processes/exploreReports/model/store/postprocessing/metadata.ts similarity index 56% rename from src/processes/exploreReports/model/store/postprocessing/metadata.js rename to src/processes/exploreReports/model/store/postprocessing/metadata.ts index 22eaaf5c..1fdf8979 100644 --- a/src/processes/exploreReports/model/store/postprocessing/metadata.js +++ b/src/processes/exploreReports/model/store/postprocessing/metadata.ts @@ -1,8 +1,9 @@ import { CDM_SOURCE, METADATA } from "@/shared/config/files"; +import { CdmSourceType } from "@/processes/exploreReports/model/interfaces/files/CdmSourceType"; export default function metadata(data) { const metadataData = data[METADATA]; - const cdmsourceData = data[CDM_SOURCE]; + const cdmsourceData: CdmSourceType = data[CDM_SOURCE]; return { metadataData, cdmsourceData, diff --git a/src/processes/exploreReports/model/store/postprocessing/networkConceptDashboard.ts b/src/processes/exploreReports/model/store/postprocessing/networkConceptDashboard.ts new file mode 100644 index 00000000..7269dc7c --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/networkConceptDashboard.ts @@ -0,0 +1,71 @@ +import { CONCEPT } from "@/shared/config/files"; +import { ConceptType } from "@/processes/exploreReports/model/interfaces/files/ConceptType"; +import { MultipleFilesRawInterface } from "@/processes/exploreReports/model/interfaces/MultipleFilesRawInterface"; +import environment from "@/shared/api/environment"; +import { CONCEPT_METADATA } from "@/shared/api/duckdb/files"; + +function combineObjectsBySource(inputObject) { + const resultArray = []; + const sources = inputObject[CONCEPT_METADATA].filter( + (val) => val.data.length + ).map((data) => data.source); + + sources.forEach((source) => { + const combinedData = {}; + + for (const key in inputObject) { + if (key !== "domainSummary") { + const fieldArray = inputObject[key]; + const matchingItem = fieldArray.find( + (item) => item.source.cdm_source_key === source.cdm_source_key + ); + combinedData[key] = matchingItem ? matchingItem.data : null; + } else { + combinedData[key] = inputObject[key]; + } + } + + resultArray.push({ source: source, data: combinedData }); + }); + + return resultArray; +} + +export default function networkConceptDashboard(data) { + let concept: MultipleFilesRawInterface[], conceptId: string; + if (environment.DUCKDB_ENABLED) { + concept = combineObjectsBySource(data); + conceptId = concept[0].data[CONCEPT_METADATA]?.[0]?.CONCEPT_ID; + if (!conceptId) { + return {}; + } else { + return { + concept: concept.map((val) => ({ + CDM_NAME: val.source.cdm_source_name, + CONCEPT_NAME: val.data[CONCEPT_METADATA][0]?.CONCEPT_NAME, + CONCEPT_ID: val.data[CONCEPT_METADATA][0]?.CONCEPT_ID, + PEOPLE_COUNT: val.data[CONCEPT_METADATA][0]?.NUM_PERSONS, + PEOPLE_PERCENT: ( + val.data[CONCEPT_METADATA][0]?.PERCENT_PERSONS * 100 + ).toFixed(2), + })), + }; + } + } else { + concept = data[CONCEPT]; + conceptId = concept[0]?.data.CONCEPT_ID[0]; + if (!conceptId) { + return {}; + } else { + return { + concept: concept.map((val) => ({ + CDM_NAME: val.source.cdm_source_name, + CONCEPT_NAME: val.data?.CONCEPT_NAME[0], + CONCEPT_ID: val.data.CONCEPT_ID[0], + PEOPLE_COUNT: val.data.NUM_PERSONS, + PEOPLE_PERCENT: (val.data.PERCENT_PERSONS * 100).toFixed(2), + })), + }; + } + } +} diff --git a/src/processes/exploreReports/model/store/postprocessing/networkConceptReport.js b/src/processes/exploreReports/model/store/postprocessing/networkConceptReport.js deleted file mode 100644 index b736dbe7..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/networkConceptReport.js +++ /dev/null @@ -1,48 +0,0 @@ -import { CONCEPT } from "@/shared/config/files"; -import _ from "lodash"; - -export default function networkConcept(data) { - return { - metadata: { - conceptName: data[CONCEPT][0].data.CONCEPT_NAME[0], - conceptId: data[CONCEPT][0].data.CONCEPT_ID[0], - numPersons: _.sumBy(data[CONCEPT], (r) => r.data.NUM_PERSONS[0]), - }, - chart: { - measurementValueDistribution: data[CONCEPT].filter( - (value) => value.data.MEASUREMENT_VALUE_DISTRIBUTION?.length - ).length - ? data[CONCEPT].reduce( - (prevValue, current) => [ - ...prevValue, - ...current.data.MEASUREMENT_VALUE_DISTRIBUTION.map((value) => ({ - ...value, - SOURCE_UNIT_KEY: `${current.source.cdm_source_key} - ${value.CATEGORY}`, - })), - ], - [] - ) - : null, - }, - table: { - measurementValueDistribution: data[CONCEPT].filter( - (value) => value.data.MEASUREMENT_VALUE_DISTRIBUTION?.length - ).length - ? data[CONCEPT].reduce( - (prevValue, current) => [ - ...prevValue, - ...current.data.MEASUREMENT_VALUE_DISTRIBUTION.map((value) => ({ - ...value, - SOURCE: current.source.cdm_source_key, - RELEASE: current.source.releases[0].release_name, - NUM_PERSONS: current.data.NUM_PERSONS[0], - CONCEPT_NAME: data[CONCEPT][0].data.CONCEPT_NAME[0], - CONCEPT_ID: data[CONCEPT][0].data.CONCEPT_ID[0], - })), - ], - [] - ) - : null, - }, - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/networkConceptReport.ts b/src/processes/exploreReports/model/store/postprocessing/networkConceptReport.ts new file mode 100644 index 00000000..b4386879 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/networkConceptReport.ts @@ -0,0 +1,160 @@ +import { CONCEPT } from "@/shared/config/files"; +import _ from "lodash"; +import { ConceptType } from "@/processes/exploreReports/model/interfaces/files/ConceptType"; +import { MultipleFilesRawInterface } from "@/processes/exploreReports/model/interfaces/MultipleFilesRawInterface"; +import * as d3 from "d3-time-format"; +import environment from "@/shared/api/environment"; +import { CONCEPT_METADATA } from "@/shared/api/duckdb/files"; + +function augmentReport(concept, dataField) { + return concept.filter((value) => value.data[dataField]?.length).length + ? concept.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data[dataField].map((value) => ({ + ...value, + SOURCE: current.source.cdm_source_key, + })), + ], + [] + ) + : null; +} + +function combineObjectsBySource(inputObject) { + const resultArray = []; + const sources = inputObject[CONCEPT_METADATA].filter( + (val) => val.data.length + ).map((data) => data.source); + sources.forEach((source) => { + const combinedData = {}; + + for (const key in inputObject) { + if (key !== "domainSummary") { + const fieldArray = inputObject[key]; + const matchingItem = fieldArray.find( + (item) => item.source.cdm_source_key === source.cdm_source_key + ); + combinedData[key] = matchingItem ? matchingItem.data : null; + } else { + combinedData[key] = inputObject[key]; + } + } + + resultArray.push({ source: source, data: combinedData }); + }); + + return resultArray; +} + +export default function networkConcept(data) { + const dateParse = d3.timeParse("%Y%m"); + let concept: MultipleFilesRawInterface[], + conceptName, + conceptId, + numPersons, + conceptDomain; + if (environment.DUCKDB_ENABLED) { + concept = combineObjectsBySource(data); + conceptName = concept[0].data[CONCEPT_METADATA]?.[0]?.CONCEPT_NAME; + conceptDomain = concept[0].data[CONCEPT_METADATA]?.[0]?.DOMAIN; + conceptId = concept[0].data[CONCEPT_METADATA]?.[0]?.CONCEPT_ID; + numPersons = _.sumBy(concept[0], (r) => + r.data[CONCEPT_METADATA]?.[0]?.NUM_PERSONS + ? r.data[CONCEPT_METADATA]?.[0]?.NUM_PERSONS + : 0 + ); + } else { + concept = data[CONCEPT]; + conceptName = concept[0]?.data.CONCEPT_NAME[0]; + conceptId = concept[0]?.data.CONCEPT_ID[0]; + numPersons = _.sumBy(concept[0], (r) => + r.data.NUM_PERSONS[0] ? r.data.NUM_PERSONS[0] : 0 + ); + } + if (!conceptId) { + return {}; + } else { + return { + concept: { + metadata: { + conceptName: conceptName, + conceptId: conceptId, + numPersons: numPersons, + domain: conceptDomain, + }, + chart: { + measurementValueDistribution: concept.filter( + (value) => value.data.MEASUREMENT_VALUE_DISTRIBUTION?.length + ).length + ? concept.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data.MEASUREMENT_VALUE_DISTRIBUTION.map( + (value) => ({ + ...value, + SOURCE_UNIT_KEY: `${current.source.cdm_source_key} - ${value.CATEGORY}`, + }) + ), + ], + [] + ) + : null, + ageAtFirstExposure: augmentReport(concept, "AGE_AT_FIRST_EXPOSURE"), + drugsByType: augmentReport(concept, "DRUGS_BY_TYPE"), + visitDurationByType: augmentReport(concept, "VISIT_DURATION_BY_TYPE"), + daysSupply: augmentReport(concept, "DAYS_SUPPLY_DISTRIBUTION"), + quantityDistribution: augmentReport(concept, "QUANTITY_DISTRIBUTION"), + ageAtFirstDiagnosis: augmentReport(concept, "AGE_AT_FIRST_DIAGNOSIS"), + conditionsByType: augmentReport(concept, "CONDITIONS_BY_TYPE"), + recordsByUnit: augmentReport(concept, "RECORDS_BY_UNIT"), + measurementsByType: augmentReport(concept, "MEASUREMENTS_BY_TYPE"), + lengthOfEra: augmentReport(concept, "LENGTH_OF_ERA"), + ageAtFirstOccurrence: augmentReport( + concept, + "AGE_AT_FIRST_OCCURRENCE" + ), + recordCountProportionByMonth: concept.filter( + (value) => value.data.PREVALENCE_BY_MONTH?.length + ).length + ? concept.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data.PREVALENCE_BY_MONTH.map((value) => ({ + ...value, + SOURCE: current.source.cdm_source_key, + date: dateParse(value.X_CALENDAR_MONTH.toString()), + })), + ], + [] + ) + : null, + }, + table: { + measurementValueDistribution: concept.filter( + (value) => value.data.MEASUREMENT_VALUE_DISTRIBUTION?.length + ).length + ? concept.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data.MEASUREMENT_VALUE_DISTRIBUTION.map( + (value) => ({ + ...value, + SOURCE: current.source.cdm_source_key, + RELEASE: current.source.releases[0].release_name, + UNIT_COUNT: current.data.RECORDS_BY_UNIT.filter( + (val) => val.CONCEPT_NAME === value.CATEGORY + )[0].COUNT_VALUE, + CONCEPT_NAME: conceptName, + CONCEPT_ID: conceptId, + }) + ), + ], + [] + ) + : null, + }, + }, + }; + } +} diff --git a/src/processes/exploreReports/model/store/postprocessing/networkDataStrandReport.js b/src/processes/exploreReports/model/store/postprocessing/networkDataStrandReport.js deleted file mode 100644 index 219b5a59..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/networkDataStrandReport.js +++ /dev/null @@ -1,16 +0,0 @@ -import { RECORDS_DOMAIN } from "@/shared/config/files"; - -export default function DataStrandReport(data) { - return data[RECORDS_DOMAIN].reduce( - (prevValue, current) => [ - ...prevValue, - ...current.data.map((value) => ({ - ...value, - cdm_source_key: current.source.cdm_source_key, - cdm_release_key: current.source.releases[0].release_id, - cdm_source_abbreviation: current.source.cdm_source_abbreviation, - })), - ], - [] - ); -} diff --git a/src/processes/exploreReports/model/store/postprocessing/networkDataStrandReport.ts b/src/processes/exploreReports/model/store/postprocessing/networkDataStrandReport.ts new file mode 100644 index 00000000..960027d7 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/networkDataStrandReport.ts @@ -0,0 +1,26 @@ +import { RECORDS_DOMAIN } from "@/shared/config/files"; +import { RecordsDomain } from "@/processes/exploreReports/model/interfaces/files/RecordsDomain"; +import { MultipleFilesRawInterface } from "@/processes/exploreReports/model/interfaces/MultipleFilesRawInterface"; + +export default function DataStrandReport(data) { + const recordsDomain: MultipleFilesRawInterface[] = + data[RECORDS_DOMAIN]; + let processedData; + + if (recordsDomain && recordsDomain.length) { + processedData = recordsDomain.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data.map((value) => ({ + ...value, + cdm_source_key: current.source.cdm_source_key, + cdm_release_key: current.source.releases[0]?.release_id, + cdm_source_abbreviation: current.source.cdm_source_abbreviation, + })), + ], + [] + ); + } + + return { dataStrandReport: processedData }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/networkDiversityReport.ts b/src/processes/exploreReports/model/store/postprocessing/networkDiversityReport.ts new file mode 100644 index 00000000..bb92aa1b --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/networkDiversityReport.ts @@ -0,0 +1,37 @@ +import { MultipleFilesRawInterface } from "@/processes/exploreReports/model/interfaces/MultipleFilesRawInterface"; +import { PERSON } from "@/shared/config/files"; +import { PersonData } from "@/processes/exploreReports/model/interfaces/files/Person"; + +export default function networkDiversityReport(data) { + const personData: MultipleFilesRawInterface[] = data[PERSON]; + let raceData; + let ethnicityData; + + if (personData && personData.length) { + raceData = personData.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data.RACE_DATA.map((value) => ({ + ...value, + DATA_SOURCE_KEY: current.source.cdm_source_key, + })), + ], + [] + ); + ethnicityData = personData.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data.ETHNICITY_DATA.map((value) => ({ + ...value, + DATA_SOURCE_KEY: current.source.cdm_source_key, + })), + ], + [] + ); + } + + return { + raceData, + ethnicityData, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/networkPopulationReport.js b/src/processes/exploreReports/model/store/postprocessing/networkPopulationReport.js deleted file mode 100644 index 70691a61..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/networkPopulationReport.js +++ /dev/null @@ -1,26 +0,0 @@ -import { OBSERVATION_PERIOD } from "@/shared/config/files"; - -export default function population(data) { - return { - allCumulativeDurationData: data[OBSERVATION_PERIOD].reduce( - (prevValue, current) => [ - ...prevValue, - ...current.data.CUMULATIVE_DURATION.map((value) => ({ - ...value, - DATA_SOURCE_KEY: current.source.cdm_source_key, - })), - ], - [] - ), - allAgeAtFirstObservationData: data[OBSERVATION_PERIOD].reduce( - (prevValue, current) => [ - ...prevValue, - ...current.data.AGE_AT_FIRST_OBSERVATION.map((value) => ({ - ...value, - DATA_SOURCE_KEY: current.source.cdm_source_key, - })), - ], - [] - ), - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/networkPopulationReport.ts b/src/processes/exploreReports/model/store/postprocessing/networkPopulationReport.ts new file mode 100644 index 00000000..7e0f593c --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/networkPopulationReport.ts @@ -0,0 +1,34 @@ +import { OBSERVATION_PERIOD } from "@/shared/config/files"; +import { MultipleFilesRawInterface } from "@/processes/exploreReports/model/interfaces/MultipleFilesRawInterface"; +import { ObservationPeriodType } from "@/processes/exploreReports/model/interfaces/files/ObservationPeriodType"; + +export default function population(data) { + const observationPeriod: MultipleFilesRawInterface[] = + data[OBSERVATION_PERIOD]; + if (observationPeriod && observationPeriod.length) { + return { + allCumulativeDurationData: observationPeriod.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data.CUMULATIVE_DURATION.map((value) => ({ + ...value, + DATA_SOURCE_KEY: current.source.cdm_source_key, + })), + ], + [] + ), + allAgeAtFirstObservationData: observationPeriod.reduce( + (prevValue, current) => [ + ...prevValue, + ...current.data.AGE_AT_FIRST_OBSERVATION.map((value) => ({ + ...value, + DATA_SOURCE_KEY: current.source.cdm_source_key, + })), + ], + [] + ), + }; + } else { + return []; + } +} diff --git a/src/processes/exploreReports/model/store/postprocessing/networkUnmappedSourceCodes.js b/src/processes/exploreReports/model/store/postprocessing/networkUnmappedSourceCodes.js deleted file mode 100644 index a7968b64..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/networkUnmappedSourceCodes.js +++ /dev/null @@ -1,7 +0,0 @@ -import { NETWORK_UNMAPPED_SOURCE_CODES } from "@/shared/config/files"; - -export default function networkUnmappedSourceCodes(data) { - return { - domainTable: data[NETWORK_UNMAPPED_SOURCE_CODES], - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/networkUnmappedSourceCodes.ts b/src/processes/exploreReports/model/store/postprocessing/networkUnmappedSourceCodes.ts new file mode 100644 index 00000000..062d0cb5 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/networkUnmappedSourceCodes.ts @@ -0,0 +1,10 @@ +import { NETWORK_UNMAPPED_SOURCE_CODES } from "@/shared/config/files"; +import { QualityCompletenessType } from "@/processes/exploreReports/model/interfaces/files/QualityCompletenessType"; + +export default function networkUnmappedSourceCodes(data) { + const domainTable: QualityCompletenessType[] = + data[NETWORK_UNMAPPED_SOURCE_CODES]; + return { + domainTable, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/observationPeriod.js b/src/processes/exploreReports/model/store/postprocessing/observationPeriod.js deleted file mode 100644 index 28d7ae58..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/observationPeriod.js +++ /dev/null @@ -1,32 +0,0 @@ -import * as d3 from "d3-time-format"; -import { OBSERVATION_PERIOD } from "@/shared/config/files"; -import getPercentage from "@/shared/lib/get-percentage"; -import sortByRange from "@/shared/lib/range-sort"; - -export default function observationPeriod(data) { - const dateParse = d3.timeParse("%Y%m"); - const observationPeriodData = data[OBSERVATION_PERIOD]; - const personPeriods = observationPeriodData.PERSON_PERIODS_DATA.map( - (item) => ({ - ...item, - PERCENT_PEOPLE: getPercentage( - item.COUNT_VALUE, - observationPeriodData.PERSON_PERIODS_DATA - ), - }) - ); - observationPeriodData.OBSERVATION_PERIOD_LENGTH_BY_AGE = sortByRange( - observationPeriodData.OBSERVATION_PERIOD_LENGTH_BY_AGE, - "ascending", - "CATEGORY", - "categoryOrder" - ); - observationPeriodData.OBSERVED_BY_MONTH.forEach((v) => { - v.DATE = dateParse(v.MONTH_YEAR); - }); - - return { - observationPeriodData, - personPeriods, - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/observationPeriod.ts b/src/processes/exploreReports/model/store/postprocessing/observationPeriod.ts new file mode 100644 index 00000000..2038305b --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/observationPeriod.ts @@ -0,0 +1,39 @@ +import * as d3 from "d3-time-format"; +import { OBSERVATION_PERIOD } from "@/shared/config/files"; +import getPercentage from "@/shared/lib/get-percentage"; +import sortByRange from "@/shared/lib/range-sort"; +import { ObservationPeriodType } from "@/processes/exploreReports/model/interfaces/files/ObservationPeriodType"; + +export default function observationPeriod(data) { + const dateParse = d3.timeParse("%Y%m"); + const observationPeriodData: ObservationPeriodType = data[OBSERVATION_PERIOD]; + let personPeriods; + if (observationPeriodData.PERSON_PERIODS_DATA) { + personPeriods = observationPeriodData.PERSON_PERIODS_DATA.map((item) => ({ + ...item, + PERCENT_PEOPLE: getPercentage( + item.COUNT_VALUE, + observationPeriodData.PERSON_PERIODS_DATA + ), + })); + } + if (observationPeriodData.OBSERVATION_PERIOD_LENGTH_BY_AGE) { + observationPeriodData.OBSERVATION_PERIOD_LENGTH_BY_AGE = sortByRange( + observationPeriodData.OBSERVATION_PERIOD_LENGTH_BY_AGE, + "ascending", + "CATEGORY", + "categoryOrder" + ); + } + + if (observationPeriodData.OBSERVED_BY_MONTH) { + observationPeriodData.OBSERVED_BY_MONTH.forEach((v) => { + v.DATE = dateParse(v.MONTH_YEAR.toString()); + }); + } + + return { + observationPeriodData, + personPeriods, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/performance.js b/src/processes/exploreReports/model/store/postprocessing/performance.js deleted file mode 100644 index 3c5714cf..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/performance.js +++ /dev/null @@ -1,7 +0,0 @@ -import { ACHILLES_PERFORMANCE } from "@/shared/config/files"; - -export default function performance(data) { - return { - domainTable: data[ACHILLES_PERFORMANCE], - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/performance.ts b/src/processes/exploreReports/model/store/postprocessing/performance.ts new file mode 100644 index 00000000..a53f3825 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/performance.ts @@ -0,0 +1,15 @@ +import { + ACHILLES_PERFORMANCE, + COHORT_DIAGNOSTICS_PERFORMANCE, +} from "@/shared/config/files"; +import { AchillesPerformanceType } from "@/processes/exploreReports/model/interfaces/files/AchillesPerformanceType"; + +export default function performance(data): { + achilles_performance: AchillesPerformanceType[]; + cohort_diagnostics_performance: object[]; +} { + return { + achilles_performance: data[ACHILLES_PERFORMANCE], + cohort_diagnostics_performance: data[COHORT_DIAGNOSTICS_PERFORMANCE], + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/personReport.js b/src/processes/exploreReports/model/store/postprocessing/personReport.js deleted file mode 100644 index d002a331..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/personReport.js +++ /dev/null @@ -1,29 +0,0 @@ -import * as d3 from "d3-time-format"; -import { PERSON } from "@/shared/config/files"; - -export default function person(data) { - const dateParse = d3.timeParse("%Y"); - const personData = data[PERSON]; - let genderMaleCount; - let genderFemaleCount; - const numPersons = personData.SUMMARY[1].ATTRIBUTE_VALUE; - personData.BIRTH_YEAR_DATA.forEach((v, i) => { - personData.BIRTH_YEAR_DATA[i].YEAR = dateParse(v.YEAR); - }); - if (personData.GENDER_DATA[0].CONCEPT_NAME === "MALE") { - genderMaleCount = personData.GENDER_DATA[0].COUNT_VALUE; - genderFemaleCount = personData.GENDER_DATA[1].COUNT_VALUE; - } else { - genderMaleCount = personData.GENDER_DATA[1].COUNT_VALUE; - genderFemaleCount = personData.GENDER_DATA[0].COUNT_VALUE; - } - - return { - numPersons, - personData, - genderMaleCount, - genderFemaleCount, - genderMalePct: genderMaleCount / numPersons, - genderFemalePct: genderFemaleCount / numPersons, - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/personReport.ts b/src/processes/exploreReports/model/store/postprocessing/personReport.ts new file mode 100644 index 00000000..7dd90ae1 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/personReport.ts @@ -0,0 +1,47 @@ +import * as d3 from "d3-time-format"; +import { PERSON } from "@/shared/config/files"; +import { PersonData } from "@/processes/exploreReports/model/interfaces/files/Person"; + +export default function person(data) { + const dateParse = d3.timeParse("%Y"); + const personData: PersonData = data[PERSON]; + let genderMaleCount = 0; + let genderFemaleCount = 0; + const maleAgeSex = personData.AGE_GENDER_DATA.filter( + (value) => value.CONCEPT_NAME === "MALE" + ); + const femaleAgeSex = personData.AGE_GENDER_DATA.filter( + (value) => value.CONCEPT_NAME === "FEMALE" + ); + const numPersons = parseInt(personData.SUMMARY[1].ATTRIBUTE_VALUE); + personData.BIRTH_YEAR_DATA.forEach((v, i) => { + if (typeof v.YEAR === "string") { + personData.BIRTH_YEAR_DATA[i].YEAR = dateParse(v.YEAR); + } + }); + const firstGender = personData.GENDER_DATA[0] + ? personData.GENDER_DATA[0] + : { COUNT_VALUE: 0, CONCEPT_NAME: "none" }; + const secondGender = personData.GENDER_DATA[1] + ? personData.GENDER_DATA[1] + : { COUNT_VALUE: 0, CONCEPT_NAME: "none" }; + + if (firstGender.CONCEPT_NAME === "MALE") { + genderMaleCount = firstGender.COUNT_VALUE; + genderFemaleCount = secondGender.COUNT_VALUE; + } else { + genderMaleCount = secondGender.COUNT_VALUE; + genderFemaleCount = firstGender.COUNT_VALUE; + } + + return { + numPersons, + personData, + genderMaleCount, + genderFemaleCount, + genderMalePct: genderMaleCount / numPersons, + genderFemalePct: genderFemaleCount / numPersons, + maleAgeSex, + femaleAgeSex, + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/sourceConceptReport.js b/src/processes/exploreReports/model/store/postprocessing/sourceConceptReport.js deleted file mode 100644 index 410bb9cb..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/sourceConceptReport.js +++ /dev/null @@ -1,25 +0,0 @@ -import { SOURCE_CONCEPT } from "@/shared/config/files"; -import * as d3 from "d3-time-format"; -import { flatten, sumBy } from "lodash"; - -export default function sourceConceptOverlay(data) { - const parsedResponses = data[SOURCE_CONCEPT]; - const dateParse = d3.timeParse("%Y%m"); - if (!parsedResponses.length) return; - const prevalence = parsedResponses.map((response) => - response.data.PREVALENCE_BY_MONTH.map((prevalence) => { - return { - ...prevalence, - date: dateParse(prevalence.X_CALENDAR_MONTH), - release: response.release, - }; - }) - ); - - return { - conceptName: parsedResponses[0].data.CONCEPT_NAME[0], - conceptId: parsedResponses[0].data.CONCEPT_ID[0], - numPersons: sumBy(parsedResponses, (item) => item.data.NUM_PERSONS[0]), - conceptData: flatten(prevalence), - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/sourceConceptReport.ts b/src/processes/exploreReports/model/store/postprocessing/sourceConceptReport.ts new file mode 100644 index 00000000..536dff97 --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/sourceConceptReport.ts @@ -0,0 +1,67 @@ +import { SOURCE_CONCEPT } from "@/shared/config/files"; +import * as d3 from "d3-time-format"; +import { flatten, sumBy } from "lodash"; +import { MultipleFilesRawInterface } from "@/processes/exploreReports/model/interfaces/MultipleFilesRawInterface"; +import { ConceptType } from "@/processes/exploreReports/model/interfaces/files/ConceptType"; +import environment from "@/shared/api/environment"; +import { CONCEPT_METADATA } from "@/shared/api/duckdb/files"; + +function combineObjectsByRelease(inputObject) { + const resultArray = []; + const sources = inputObject[CONCEPT_METADATA].map((data) => data.release); + + sources.forEach((release) => { + const combinedData = {}; + + for (const key in inputObject) { + const fieldArray = inputObject[key]; + const matchingItem = fieldArray.find( + (item) => item.release.release_id === release.release_id + ); + combinedData[key] = matchingItem ? matchingItem.data : null; + } + + resultArray.push({ release: release, data: combinedData }); + }); + + return resultArray; +} + +export default function sourceConceptOverlay(data) { + let parsedResponses: MultipleFilesRawInterface[]; + let conceptName; + let conceptId; + let numPersons; + if (environment.DUCKDB_ENABLED) { + parsedResponses = combineObjectsByRelease(data); + conceptName = parsedResponses[0].data[CONCEPT_METADATA][0].CONCEPT_NAME; + conceptId = parsedResponses[0].data[CONCEPT_METADATA][0].CONCEPT_ID; + numPersons = sumBy( + parsedResponses, + (item) => item.data[CONCEPT_METADATA][0].NUM_PERSONS + ); + } else { + parsedResponses = data[SOURCE_CONCEPT]; + conceptName = parsedResponses[0].data.CONCEPT_NAME[0]; + conceptId = parsedResponses[0].data.CONCEPT_ID[0]; + numPersons = sumBy(parsedResponses, (item) => item.data.NUM_PERSONS[0]); + } + const dateParse = d3.timeParse("%Y%m"); + if (!parsedResponses.length) return; + const prevalence = parsedResponses.map((response) => + response.data.PREVALENCE_BY_MONTH.map((prevalence) => { + return { + ...prevalence, + date: dateParse(String(prevalence.X_CALENDAR_MONTH)), + release: response.release, + }; + }) + ); + + return { + conceptName: conceptName, + conceptId: conceptId, + numPersons: numPersons, + conceptData: flatten(prevalence), + }; +} diff --git a/src/processes/exploreReports/model/store/postprocessing/unmappedSourceCodes.js b/src/processes/exploreReports/model/store/postprocessing/unmappedSourceCodes.js deleted file mode 100644 index 8c8a3db3..00000000 --- a/src/processes/exploreReports/model/store/postprocessing/unmappedSourceCodes.js +++ /dev/null @@ -1,7 +0,0 @@ -import { QUALITY_COMPLETENESS } from "@/shared/config/files"; - -export default function unmappedSourceCodes(data) { - return { - domainTable: data[QUALITY_COMPLETENESS], - }; -} diff --git a/src/processes/exploreReports/model/store/postprocessing/unmappedSourceCodes.ts b/src/processes/exploreReports/model/store/postprocessing/unmappedSourceCodes.ts new file mode 100644 index 00000000..d0f172bf --- /dev/null +++ b/src/processes/exploreReports/model/store/postprocessing/unmappedSourceCodes.ts @@ -0,0 +1,10 @@ +import { QUALITY_COMPLETENESS } from "@/shared/config/files"; +import { QualityCompletenessType } from "@/processes/exploreReports/model/interfaces/files/QualityCompletenessType"; + +export default function unmappedSourceCodes(data) { + const qualityCompleteness: QualityCompletenessType[] = + data[QUALITY_COMPLETENESS]; + return { + domainTable: qualityCompleteness, + }; +} diff --git a/src/processes/exploreReports/model/store/preprocessing/csvParse.js b/src/processes/exploreReports/model/store/preprocessing/csvParse.ts similarity index 62% rename from src/processes/exploreReports/model/store/preprocessing/csvParse.js rename to src/processes/exploreReports/model/store/preprocessing/csvParse.ts index 9705748f..12ae2276 100644 --- a/src/processes/exploreReports/model/store/preprocessing/csvParse.js +++ b/src/processes/exploreReports/model/store/preprocessing/csvParse.ts @@ -1,6 +1,6 @@ import * as d3 from "d3-dsv"; -export default function csvParse(data) { +export default function csvParse(data: string) { if (data) { return d3.csvParse(data); } diff --git a/src/processes/exploreReports/model/store/preprocessing/index.js b/src/processes/exploreReports/model/store/preprocessing/index.ts similarity index 70% rename from src/processes/exploreReports/model/store/preprocessing/index.js rename to src/processes/exploreReports/model/store/preprocessing/index.ts index c0348f81..de415df8 100644 --- a/src/processes/exploreReports/model/store/preprocessing/index.js +++ b/src/processes/exploreReports/model/store/preprocessing/index.ts @@ -15,6 +15,13 @@ import { QUALITY_COMPLETENESS, RECORDS_DOMAIN, TEMPORAL_CHARACTERIZATION, + COHORT_INDEX, + COHORT_CHARACTERIZATION, + COHORT_DIAGNOSTICS_PERFORMANCE, + COHORT_INDEX_EVENT_BREAKDOWN, + COHORT_TEMPORAL_COVARIATE_DISTRIBUTION, + LOCATION, + QUALITY_DELTA, } from "@/shared/config/files"; import csvParse from "@/processes/exploreReports/model/store/preprocessing/csvParse"; @@ -35,4 +42,11 @@ export default { [DENSITY_DOMAIN_PERSON]: csvParse, [NETWORK_PERFORMANCE]: csvParse, [TEMPORAL_CHARACTERIZATION]: csvParse, + [COHORT_INDEX]: csvParse, + [COHORT_CHARACTERIZATION]: csvParse, + [COHORT_DIAGNOSTICS_PERFORMANCE]: csvParse, + [COHORT_INDEX_EVENT_BREAKDOWN]: csvParse, + [COHORT_TEMPORAL_COVARIATE_DISTRIBUTION]: csvParse, + [LOCATION]: csvParse, + [QUALITY_DELTA]: csvParse, }; diff --git a/src/processes/exploreReports/ui/ReportsView.vue b/src/processes/exploreReports/ui/ReportsView.vue index 7e6b1cb8..85961a8d 100644 --- a/src/processes/exploreReports/ui/ReportsView.vue +++ b/src/processes/exploreReports/ui/ReportsView.vue @@ -1,64 +1,92 @@ - diff --git a/src/shared/api/axios/apiService.ts b/src/shared/api/axios/apiService.ts new file mode 100644 index 00000000..b1627738 --- /dev/null +++ b/src/shared/api/axios/apiService.ts @@ -0,0 +1,20 @@ +import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from "axios"; +import environment from "@/shared/api/environment"; + +const loadFile = (config: AxiosRequestConfig, payload: object) => { + const instance = axios.create(); + instance.interceptors.response.use( + function (response: AxiosResponse) { + return response; + }, + function (error: AxiosError) { + return Promise.reject({ ...error, payload }); + } + ); + + return instance.request(config).then((response) => { + return { data: response.data, headers: response.headers, payload }; + }); +}; + +export default loadFile; diff --git a/src/shared/api/getFilePath.js b/src/shared/api/axios/files.ts similarity index 72% rename from src/shared/api/getFilePath.js rename to src/shared/api/axios/files.ts index 2f8e28cc..56fc917e 100644 --- a/src/shared/api/getFilePath.js +++ b/src/shared/api/axios/files.ts @@ -1,11 +1,19 @@ import * as files from "@/shared/config/files"; -export default function getFilePath(params = "") { +export interface Params { + cdm?: string; + domain?: string; + release?: string; + concept?: string; +} + +export default function getFilePath(params: Params) { return { [files.INDEX]: "data/index.json", [files.CONCEPT]: `data/${params.cdm}/${params.release}/concepts/${params.domain}/concept_${params.concept}.json`, [files.QUALITY_INDEX]: `data/${params.cdm}/data-quality-index.json`, [files.QUALITY_RESULTS]: `data/${params.cdm}/${params.release}/dq-result.json`, + [files.QUALITY_DELTA]: `data/${params.cdm}/data-quality-delta.csv`, [files.DEATH]: `data/${params.cdm}/${params.release}/death.json`, [files.SOURCE_HISTORY_INDEX]: `data/${params.cdm}/data-source-history-index.json`, [files.DENSITY_RECORDS_PERSON]: `data/${params.cdm}/${params.release}/datadensity-records-per-person.csv`, @@ -29,5 +37,12 @@ export default function getFilePath(params = "") { [files.NETWORK_PERFORMANCE]: "data/network-performance.csv", [files.EXPORT_QUERY_INDEX]: "data/export_query_index.json", [files.TEMPORAL_CHARACTERIZATION]: `data/${params.cdm}/${params.release}/temporal-characterization.csv`, + [files.NOTES]: `data${params.cdm ? "/" + params.cdm : ""}/notes.json`, + [files.COHORT_INDEX]: `data/${params.cdm}/${params.release}/cohort_index.csv`, + [files.COHORT_CHARACTERIZATION]: `data/${params.cdm}/${params.release}/cohort_characterization.csv`, + [files.COHORT_DIAGNOSTICS_PERFORMANCE]: `data/${params.cdm}/${params.release}/cohort_diagnostics_performance.csv`, + [files.COHORT_INDEX_EVENT_BREAKDOWN]: `data/${params.cdm}/${params.release}/cohort_index_event_breakdown.csv`, + [files.COHORT_TEMPORAL_COVARIATE_DISTRIBUTION]: `data/${params.cdm}/${params.release}/cohort_temporal_covariate_distribution.csv`, + [files.LOCATION]: `data/${params.cdm}/${params.release}/location.csv`, }; } diff --git a/src/shared/api/cookiesService.ts b/src/shared/api/cookiesService.ts new file mode 100644 index 00000000..2de969f3 --- /dev/null +++ b/src/shared/api/cookiesService.ts @@ -0,0 +1,29 @@ +class CookiesService { + get(key: string): string | undefined { + const name = key + "="; + const decodedCookie = decodeURIComponent(document.cookie); + const ca = decodedCookie.split(";"); + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) === " ") { + c = c.substring(1); + } + if (c.indexOf(name) === 0) { + return c.substring(name.length, c.length); + } + } + return undefined; + } + + set(key: string, value: string, expirySeconds: number): void { + const expiryDate = new Date(expirySeconds * 1000); // Convert seconds to milliseconds + const expires = "expires=" + expiryDate.toUTCString(); + document.cookie = key + "=" + value + ";" + expires + ";path=/"; + } + + remove(key: string): void { + document.cookie = key + "=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;"; + } +} + +export default new CookiesService(); diff --git a/src/shared/api/duckdb/cohortTables.ts b/src/shared/api/duckdb/cohortTables.ts new file mode 100644 index 00000000..ac5c4452 --- /dev/null +++ b/src/shared/api/duckdb/cohortTables.ts @@ -0,0 +1,19 @@ +import * as files from "@/shared/api/duckdb/files"; +import { DOMAIN_SUMMARY } from "@/shared/config/files"; + +function getCohortTables(params = [{}]) { + return { + cohortIndex: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.CONDITIONS_BY_TYPE, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.AGE_AT_FIRST_DIAGNOSIS, instanceParams: [params] }, + ], + cohortDrilldownReport: [], + }; +} diff --git a/src/shared/api/duckdb/conceptTables.ts b/src/shared/api/duckdb/conceptTables.ts new file mode 100644 index 00000000..4c704923 --- /dev/null +++ b/src/shared/api/duckdb/conceptTables.ts @@ -0,0 +1,138 @@ +import * as files from "./files"; +import { DOMAIN_SUMMARY } from "@/shared/config/files"; + +function getDuckDBTables(params = [{}]) { + return { + condition_occurrence: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.CONDITIONS_BY_TYPE, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.AGE_AT_FIRST_DIAGNOSIS, instanceParams: [params] }, + ], + measurement: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.AGE_AT_FIRST_OCCURRENCE, instanceParams: [params] }, + { name: files.FREQUENCY_DISTRIBUTION, instanceParams: [params] }, + { name: files.LOWER_LIMIT_DISTRIBUTION, instanceParams: [params] }, + { name: files.MEASUREMENTS_BY_TYPE, instanceParams: [params] }, + { name: files.MEASUREMENT_VALUE_DISTRIBUTION, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.RECORDS_BY_UNIT, instanceParams: [params] }, + { name: files.RECORDS_PER_PERSON, instanceParams: [params] }, + { name: files.UPPER_LIMIT_DISTRIBUTION, instanceParams: [params] }, + { name: files.VALUES_RELATIVE_TO_NORM, instanceParams: [params] }, + { + name: DOMAIN_SUMMARY, + required: true, + source: "axios", + instanceParams: [params], + }, + ], + condition_era: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.AGE_AT_FIRST_EXPOSURE, instanceParams: [params] }, + { name: files.LENGTH_OF_ERA, instanceParams: [params] }, + { name: files.RECORDS_PER_PERSON, instanceParams: [params] }, + ], + drug_exposure: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.AGE_AT_FIRST_EXPOSURE, instanceParams: [params] }, + { name: files.DAYS_SUPPLY_DISTRIBUTION, instanceParams: [params] }, + { name: files.DRUGS_BY_TYPE, instanceParams: [params] }, + { name: files.DRUG_FREQUENCY_DISTRIBUTION, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.QUANTITY_DISTRIBUTION, instanceParams: [params] }, + { name: files.RECORDS_PER_PERSON, instanceParams: [params] }, + { name: files.REFILLS_DISTRIBUTION, instanceParams: [params] }, + ], + drug_era: [], + visit_occurrence: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.AGE_AT_FIRST_OCCURRENCE, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.RECORDS_PER_PERSON, instanceParams: [params] }, + { name: files.VISIT_DURATION_BY_TYPE, instanceParams: [params] }, + ], + visit_detail: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.AGE_AT_FIRST_OCCURRENCE, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.VISIT_DETAIL_DURATION_BY_TYPE, instanceParams: [params] }, + ], + observation: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.AGE_AT_FIRST_OCCURRENCE, instanceParams: [params] }, + { name: files.OBSERVATIONS_BY_TYPE, instanceParams: [params] }, + { name: files.OBS_FREQUENCY_DISTRIBUTION, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.RECORDS_PER_PERSON, instanceParams: [params] }, + ], + procedure_occurrence: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.AGE_AT_FIRST_OCCURRENCE, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.PROCEDURES_BY_TYPE, instanceParams: [params] }, + { + name: files.PROCEDURE_FREQUENCY_DISTRIBUTION, + instanceParams: [params], + }, + { name: files.RECORDS_PER_PERSON, instanceParams: [params] }, + ], + device_exposure: [ + { + name: files.CONCEPT_METADATA, + required: true, + instanceParams: [params], + }, + { name: files.AGE_AT_FIRST_EXPOSURE, instanceParams: [params] }, + { name: files.DEVICES_BY_TYPE, instanceParams: [params] }, + { name: files.DEVICE_FREQUENCY_DISTRIBUTION, instanceParams: [params] }, + { name: files.PREVALENCE_BY_GENDER_AGE_YEAR, instanceParams: [params] }, + { name: files.PREVALENCE_BY_MONTH, instanceParams: [params] }, + { name: files.RECORDS_PER_PERSON, instanceParams: [params] }, + ], + }; +} + +export default getDuckDBTables; diff --git a/src/shared/api/duckdb/files.ts b/src/shared/api/duckdb/files.ts new file mode 100644 index 00000000..2dba2484 --- /dev/null +++ b/src/shared/api/duckdb/files.ts @@ -0,0 +1,80 @@ +import { + COHORT_CHARACTERIZATION, + COHORT_INDEX, + COHORT_INDEX_EVENT_BREAKDOWN, + COHORT_TEMPORAL_COVARIATE_DISTRIBUTION, +} from "@/shared/config/files"; + +export const CONCEPT_METADATA = "CONCEPT_METADATA"; +export const DAYS_SUPPLY_DISTRIBUTION = "DAYS_SUPPLY_DISTRIBUTION"; +export const DEVICE_FREQUENCY_DISTRIBUTION = "DEVICE_FREQUENCY_DISTRIBUTION"; +export const DRUG_FREQUENCY_DISTRIBUTION = "DRUG_FREQUENCY_DISTRIBUTION"; +export const FREQUENCY_DISTRIBUTION = "FREQUENCY_DISTRIBUTION"; +export const LENGTH_OF_ERA = "LENGTH_OF_ERA"; +export const MEASUREMENT_VALUE_DISTRIBUTION = "MEASUREMENT_VALUE_DISTRIBUTION"; +export const OBS_FREQUENCY_DISTRIBUTION = "OBS_FREQUENCY_DISTRIBUTION"; +export const PREVALENCE_BY_MONTH = "PREVALENCE_BY_MONTH"; +export const PROCEDURE_FREQUENCY_DISTRIBUTION = + "PROCEDURE_FREQUENCY_DISTRIBUTION"; +export const QUANTITY_DISTRIBUTION = "QUANTITY_DISTRIBUTION"; +export const RECORDS_BY_UNIT = "RECORDS_BY_UNIT"; +export const REFILLS_DISTRIBUTION = "REFILLS_DISTRIBUTION"; +export const VISIT_DETAIL_DURATION_BY_TYPE = "VISIT_DETAIL_DURATION_BY_TYPE"; +export const VISIT_DURATION_BY_TYPE = "VISIT_DURATION_BY_TYPE"; +export const PREVALENCE_BY_GENDER_AGE_YEAR = "PREVALENCE_BY_GENDER_AGE_YEAR"; +export const AGE_AT_FIRST_DIAGNOSIS = "AGE_AT_FIRST_DIAGNOSIS"; +export const CONDITIONS_BY_TYPE = "CONDITIONS_BY_TYPE"; +export const AGE_AT_FIRST_OCCURRENCE = "AGE_AT_FIRST_OCCURRENCE"; +export const LOWER_LIMIT_DISTRIBUTION = "LOWER_LIMIT_DISTRIBUTION"; +export const MEASUREMENTS_BY_TYPE = "MEASUREMENTS_BY_TYPE"; +export const RECORDS_PER_PERSON = "RECORDS_PER_PERSON"; +export const UPPER_LIMIT_DISTRIBUTION = "UPPER_LIMIT_DISTRIBUTION"; +export const VALUES_RELATIVE_TO_NORM = "VALUES_RELATIVE_TO_NORM"; +export const AGE_AT_FIRST_EXPOSURE = "AGE_AT_FIRST_EXPOSURE"; +export const DRUGS_BY_TYPE = "DRUGS_BY_TYPE"; +export const DEVICES_BY_TYPE = "DEVICES_BY_TYPE"; +export const PROCEDURES_BY_TYPE = "PROCEDURES_BY_TYPE"; +export const OBSERVATIONS_BY_TYPE = "OBSERVATIONS_BY_TYPE"; + +function getFilePath(params: { cdm: string; release: string }) { + const getUrl = window.location; + const baseUrl = + getUrl.protocol + "//" + getUrl.host + "/" + getUrl.pathname.split("/")[1]; + return { + [CONCEPT_METADATA]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/concept_metadata.parquet`, + [DAYS_SUPPLY_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/days_supply_distribution.parquet`, + [DEVICE_FREQUENCY_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/device_frequency_distribution.parquet`, + [DRUG_FREQUENCY_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/drug_frequency_distribution.parquet`, + [FREQUENCY_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/frequency_distribution.parquet`, + [LENGTH_OF_ERA]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/length_of_era.parquet`, + [MEASUREMENT_VALUE_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/measurement_value_distribution.parquet`, + [OBS_FREQUENCY_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/obs_frequency_distribution.parquet`, + [PREVALENCE_BY_MONTH]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/prevalence_by_month.parquet`, + [PROCEDURE_FREQUENCY_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/procedure_frequency_distribution.parquet`, + [QUANTITY_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/quantity_distribution.parquet`, + [RECORDS_BY_UNIT]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/records_by_unit.parquet`, + [REFILLS_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/refills_distribution.parquet`, + [VISIT_DETAIL_DURATION_BY_TYPE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/visit_detail_duration_by_type.parquet`, + [VISIT_DURATION_BY_TYPE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/visit_duration_by_type.parquet`, + [PREVALENCE_BY_GENDER_AGE_YEAR]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/prevalence_by_gender_age_year.parquet`, + [AGE_AT_FIRST_DIAGNOSIS]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/age_at_first_diagnosis.parquet`, + [CONDITIONS_BY_TYPE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/conditions_by_type.parquet`, + [AGE_AT_FIRST_OCCURRENCE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/age_at_first_occurrence.parquet`, + [LOWER_LIMIT_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/lower_limit_distribution.parquet`, + [MEASUREMENTS_BY_TYPE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/measurements_by_type.parquet`, + [RECORDS_PER_PERSON]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/records_per_person.parquet`, + [UPPER_LIMIT_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/upper_limit_distribution.parquet`, + [VALUES_RELATIVE_TO_NORM]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/values_relative_to_norm.parquet`, + [AGE_AT_FIRST_EXPOSURE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/age_at_first_exposure.parquet`, + [DRUGS_BY_TYPE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/drugs_by_type.parquet`, + [DEVICES_BY_TYPE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/devices_by_type.parquet`, + [PROCEDURES_BY_TYPE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/procedures_by_type.parquet`, + [OBSERVATIONS_BY_TYPE]: `${baseUrl}/data/${params.cdm}/${params.release}/concepts/observations_by_type.parquet`, + [COHORT_INDEX]: `${baseUrl}/data/${params.cdm}/${params.release}/cohort_index.parquet`, + [COHORT_CHARACTERIZATION]: `${baseUrl}/data/${params.cdm}/${params.release}/cohort_characterization.parquet`, + [COHORT_INDEX_EVENT_BREAKDOWN]: `${baseUrl}/data/${params.cdm}/${params.release}/cohort_index_event_breakdown.parquet`, + [COHORT_TEMPORAL_COVARIATE_DISTRIBUTION]: `${baseUrl}/data/${params.cdm}/${params.release}/cohort_temporal_covariate_distribution.parquet`, + }; +} + +export default getFilePath; diff --git a/src/shared/api/duckdb/instance.ts b/src/shared/api/duckdb/instance.ts new file mode 100644 index 00000000..d43c4c03 --- /dev/null +++ b/src/shared/api/duckdb/instance.ts @@ -0,0 +1,24 @@ +import * as duckdb from "@duckdb/duckdb-wasm"; +import duckdb_wasm from "@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm?url"; +import mvp_worker from "@duckdb/duckdb-wasm/dist/duckdb-browser-mvp.worker.js?url"; +import duckdb_wasm_eh from "@duckdb/duckdb-wasm/dist/duckdb-eh.wasm?url"; +import eh_worker from "@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js?url"; + +const MANUAL_BUNDLES: duckdb.DuckDBBundles = { + mvp: { + mainModule: duckdb_wasm, + mainWorker: mvp_worker, + }, + eh: { + mainModule: duckdb_wasm_eh, + mainWorker: eh_worker, + }, +}; +const bundle = await duckdb.selectBundle(MANUAL_BUNDLES); + +const worker = new Worker(bundle.mainWorker!); +const logger = new duckdb.ConsoleLogger(); +const db = new duckdb.AsyncDuckDB(logger, worker); +await db.instantiate(bundle.mainModule, bundle.pthreadWorker); + +export default db; diff --git a/src/shared/api/environment.ts b/src/shared/api/environment.ts new file mode 100644 index 00000000..c800c2b6 --- /dev/null +++ b/src/shared/api/environment.ts @@ -0,0 +1,16 @@ +import axios, { AxiosResponse } from "axios"; +const envUrl = "./env/env.json"; + +class Environment { + WEB_API_URL = null; + WEB_API_ENABLED = null; + DUCKDB_ENABLED = null; + load() { + const promise: Promise = axios.get(envUrl); + return promise.then((res) => { + Object.assign(this, res.data); + }); + } +} +const environment = new Environment(); +export default environment; diff --git a/src/shared/api/loadFile.js b/src/shared/api/loadFile.js deleted file mode 100644 index 130d70c1..00000000 --- a/src/shared/api/loadFile.js +++ /dev/null @@ -1,23 +0,0 @@ -import axios from "axios"; - -const loadFile = (path, payload) => { - const instance = axios.create(); - instance.interceptors.response.use( - function (response) { - return response; - }, - function (error) { - return error; - } - ); - return new Promise((resolve, reject) => { - instance - .get(path) - .then((response) => { - resolve({ response, payload }); - }) - .catch((error) => reject({ error, payload })); - }); -}; - -export default loadFile; diff --git a/src/shared/api/localStorageService.js b/src/shared/api/localStorageService.js deleted file mode 100644 index ef00890d..00000000 --- a/src/shared/api/localStorageService.js +++ /dev/null @@ -1,27 +0,0 @@ -class LocalStorageService { - constructor() {} - - get(key) { - const data = window.localStorage.getItem(key); - - try { - return JSON.parse(data); - } catch (e) { - return data; - } - } - - set(key, data) { - window.localStorage.setItem(key, JSON.stringify(data)); - } - - remove(key) { - window.localStorage.removeItem(key); - } - - clear() { - window.localStorage.clear(); - } -} - -export default new LocalStorageService(); diff --git a/src/shared/api/localStorageService.ts b/src/shared/api/localStorageService.ts new file mode 100644 index 00000000..d85038db --- /dev/null +++ b/src/shared/api/localStorageService.ts @@ -0,0 +1,36 @@ +class LocalStorageService { + watch(key, callback) { + window.addEventListener("storage", (event) => { + if (event.key === key) { + callback(event.newValue); + } + }); + } + get(key: string) { + const data = window.localStorage.getItem(key); + + try { + return JSON.parse(data); + } catch (e) { + return data; + } + } + + set(key: string, data: any) { + if (typeof data === "string") { + window.localStorage.setItem(key, data); + } else { + window.localStorage.setItem(key, JSON.stringify(data)); + } + } + + remove(key: string) { + window.localStorage.removeItem(key); + } + + clear() { + window.localStorage.clear(); + } +} + +export default new LocalStorageService(); diff --git a/src/shared/api/webAPI/authentication/model/store/actions.type.ts b/src/shared/api/webAPI/authentication/model/store/actions.type.ts new file mode 100644 index 00000000..4867c1b9 --- /dev/null +++ b/src/shared/api/webAPI/authentication/model/store/actions.type.ts @@ -0,0 +1,5 @@ +export const WEB_API_LOG_IN = "getAuthToken"; + +export const GET_USER = "getUser"; + +export const LOG_OUT = "logOut"; diff --git a/src/shared/api/webAPI/authentication/model/store/auth.module.ts b/src/shared/api/webAPI/authentication/model/store/auth.module.ts new file mode 100644 index 00000000..cd4c97eb --- /dev/null +++ b/src/shared/api/webAPI/authentication/model/store/auth.module.ts @@ -0,0 +1,133 @@ +import { SAVE_TOKEN, SET_AUTHENTICATED, SET_USER } from "./mutations.type"; +import { WEB_API_LOG_IN, GET_USER, LOG_OUT } from "./actions.type"; +import { authService } from "@/shared/api/webAPI/services/authService"; +import { ADD_ALERT } from "@/widgets/snackbar/model/store/actions.type"; +import environment from "@/shared/api/environment"; +import { jwtDecode } from "jwt-decode"; +import LocalStorageService from "@/shared/api/localStorageService"; +import cookiesService from "@/shared/api/cookiesService"; +import localStorageService from "@/shared/api/localStorageService"; +import { EDIT_USER } from "@/widgets/settings/model/store/actions.type"; + +const tokenKey = "bearerToken"; + +const state = { + user: null, + authenticated: false, +}; + +function checkExpiryDate(token) { + if (token) { + const decodedToken = jwtDecode(token); + const currentTime = Date.now() / 1000; + return decodedToken.exp < currentTime; + } +} + +function getExpiryDate(token) { + const decodedToken = jwtDecode(token); + return decodedToken.exp; +} + +const getters = { + authenticated: function (state) { + return state.authenticated; + }, + getWebAPIUser: function (state) { + return state.user; + }, +}; + +const actions = { + async [WEB_API_LOG_IN]({ commit, dispatch }) { + if (!environment.WEB_API_ENABLED) { + return; + } + try { + const savedToken = LocalStorageService.get(tokenKey); + const isExpired = checkExpiryDate(savedToken); + + let token = savedToken; + if (!savedToken || isExpired) { + const { headers } = await authService.token.get(); + token = headers?.["bearer"]; + if (!token) throw new Error("Token not found"); + commit(SAVE_TOKEN, token); + } + dispatch(GET_USER); + } catch (error) { + dispatch(ADD_ALERT, { + message: "Could not authenticate", + status: error.message ? error.message : "No additional data", + }); + } + }, + async [GET_USER]({ commit, dispatch, rootGetters }) { + if (!environment.WEB_API_ENABLED) return; + const isExpired = checkExpiryDate(LocalStorageService.get(tokenKey)); + + if (isExpired || !LocalStorageService.get(tokenKey)) { + dispatch(LOG_OUT); + return; + } + + const userData = await authService.user.get( + LocalStorageService.get(tokenKey) + ); + const user = await userData.data; + user.exp = new Date( + getExpiryDate(LocalStorageService.get(tokenKey)) * 1000 + ).toLocaleString(); + commit(SET_AUTHENTICATED, true); + dispatch(EDIT_USER, user); + const checkAuthStatus = setInterval(() => { + if ( + checkExpiryDate(LocalStorageService.get(tokenKey)) || + !localStorageService.get(tokenKey) + ) { + dispatch(LOG_OUT, { + message: "The session has expired. Please log in again", + }); + clearInterval(checkAuthStatus); + } + }, 1000); + }, + async [LOG_OUT]({ commit, dispatch, rootGetters }, payload) { + dispatch(EDIT_USER, null); + if (environment.WEB_API_ENABLED) { + commit(SET_AUTHENTICATED, false); + if (!checkExpiryDate(LocalStorageService.get(tokenKey))) { + await authService.token.logout(LocalStorageService.get(tokenKey)); + } + LocalStorageService.remove(tokenKey); + cookiesService.remove(tokenKey); + dispatch(ADD_ALERT, { + message: payload?.message + ? payload.message + : "You have been logged out", + status: "", + }); + } + dispatch(EDIT_USER, null); + }, +}; +const mutations = { + [SET_USER](state, user) { + state.user = user; + LocalStorageService.set("user", user); + }, + [SAVE_TOKEN](state, token) { + LocalStorageService.set("bearerToken", token); + cookiesService.set("bearerToken", token, getExpiryDate(token)); + }, + [SET_AUTHENTICATED](state, authenticated) { + state.authenticated = authenticated; + }, +}; + +export default { + state, + getters, + actions, + mutations, +}; diff --git a/src/shared/api/webAPI/authentication/model/store/mutations.type.ts b/src/shared/api/webAPI/authentication/model/store/mutations.type.ts new file mode 100644 index 00000000..19a97eb2 --- /dev/null +++ b/src/shared/api/webAPI/authentication/model/store/mutations.type.ts @@ -0,0 +1,3 @@ +export const SET_USER = "setUser"; +export const SAVE_TOKEN = "saveToken"; +export const SET_AUTHENTICATED = "setAuthenticated"; diff --git a/src/shared/api/webAPI/data/store/actions.type.ts b/src/shared/api/webAPI/data/store/actions.type.ts new file mode 100644 index 00000000..aa7721aa --- /dev/null +++ b/src/shared/api/webAPI/data/store/actions.type.ts @@ -0,0 +1,4 @@ +export const FETCH_WEBAPI_INFO = "fetchWebAPIInfo"; +export const FETCH_VOCABULARY_SEARCH_RESULTS = "fetchVocabularySearchResults"; +export const RESET_API_STORAGE = "resetApiStorage"; +export const GET_AUTH_TOKEN = "getAuthToken"; diff --git a/src/shared/api/webAPI/data/store/mutations.type.ts b/src/shared/api/webAPI/data/store/mutations.type.ts new file mode 100644 index 00000000..666f78c8 --- /dev/null +++ b/src/shared/api/webAPI/data/store/mutations.type.ts @@ -0,0 +1,2 @@ +export const SET_WEBAPI = "setWebApi"; +export const CLEAR_API_STORAGE = "clearApiStorage"; diff --git a/src/shared/api/webAPI/data/store/webApi.module.ts b/src/shared/api/webAPI/data/store/webApi.module.ts new file mode 100644 index 00000000..90c4dd44 --- /dev/null +++ b/src/shared/api/webAPI/data/store/webApi.module.ts @@ -0,0 +1,87 @@ +import { + FETCH_VOCABULARY_SEARCH_RESULTS, + FETCH_WEBAPI_INFO, + RESET_API_STORAGE, +} from "@/shared/api/webAPI/data/store/actions.type"; +import { InfoService } from "@/shared/api/webAPI/services/infoService"; +import { + CLEAR_API_STORAGE, + SET_WEBAPI, +} from "@/shared/api/webAPI/data/store/mutations.type"; +import { VocabularyService } from "@/shared/api/webAPI/services/vocabularyService"; +import CookiesService from "@/shared/api/cookiesService"; +import LocalStorageService from "@/shared/api/localStorageService"; + +const state = { + apiData: {}, + apiError: {}, +}; + +const getters = { + getApiData: (state) => { + return state.apiData; + }, +}; + +const actions = { + async [FETCH_WEBAPI_INFO]({ commit, dispatch, rootState, rootGetters }) { + commit(SET_WEBAPI, { loading: true }); + const webApiInfo = InfoService.webApi.get( + LocalStorageService.get("bearerToken") + ); + const sources = InfoService.sources.get( + LocalStorageService.get("bearerToken") + ); + return await Promise.all([webApiInfo, sources]) + .then((res) => { + commit(SET_WEBAPI, { + serviceDetails: res[0].data, + apiSources: res[1].data, + loading: false, + }); + }) + .catch((err) => commit(SET_WEBAPI, { loading: false, error: err.error })); + }, + + async [FETCH_VOCABULARY_SEARCH_RESULTS]( + { commit, dispatch, rootState, rootGetters }, + payload + ) { + commit(SET_WEBAPI, { loading: true }); + await VocabularyService.search + .get( + payload.search, + payload.source, + LocalStorageService.get("bearerToken") + ) + .then((data) => { + commit(SET_WEBAPI, { + data: data.data, + payload, + loading: false, + }); + }) + .catch((err) => { + commit(SET_WEBAPI, { loading: false, error: err }); + }); + }, + [RESET_API_STORAGE]({ commit }) { + commit(CLEAR_API_STORAGE); + }, +}; + +const mutations = { + [SET_WEBAPI](state, payload) { + state.apiData = payload; + }, + [CLEAR_API_STORAGE](state) { + state.apiData = {}; + }, +}; + +export default { + state, + getters, + actions, + mutations, +}; diff --git a/src/shared/api/webAPI/index.ts b/src/shared/api/webAPI/index.ts new file mode 100644 index 00000000..62dd8463 --- /dev/null +++ b/src/shared/api/webAPI/index.ts @@ -0,0 +1,6 @@ +import webApiStore from "@/shared/api/webAPI/data/store/webApi.module"; +import authStore from "@/shared/api/webAPI/authentication/model/store/auth.module"; +import * as authActions from "./authentication/model/store/actions.type"; +import * as webApiActions from "./data/store/actions.type"; + +export { webApiStore, webApiActions, authStore, authActions }; diff --git a/src/shared/api/webAPI/services/authService.ts b/src/shared/api/webAPI/services/authService.ts new file mode 100644 index 00000000..0bbb6d72 --- /dev/null +++ b/src/shared/api/webAPI/services/authService.ts @@ -0,0 +1,64 @@ +import apiService from "@/shared/api/axios/apiService"; +import environment from "@/shared/api/environment"; + +export const authService = { + token: { + get() { + //Test token + // return new Promise((resolve, reject) => { + // resolve({ + // headers: { + // bearer: + // "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE3MjE3MDUyNDcsImV4cCI6MTc1MzI0MTI0NywiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG5ueSIsIlN1cm5hbWUiOiJSb2NrZXQiLCJFbWFpbCI6Impyb2NrZXRAZXhhbXBsZS5jb20iLCJSb2xlIjpbIk1hbmFnZXIiLCJQcm9qZWN0IEFkbWluaXN0cmF0b3IiXX0.FU_myh_cHwNu8gob6Unp4itEY2cLGw_M_AZXiVSsSok", + // }, + // }); + // }); + + return apiService( + { + url: `${environment.WEB_API_URL}user/login/windows`, + method: "get", + baseURL: "/", + withCredentials: true, + headers: { + "Content-Type": "application/json", + }, + }, + {} + ); + }, + logout(token) { + return apiService( + { + url: `${environment.WEB_API_URL}user/logout`, + baseURL: "/", + method: "get", + headers: { + "Content-Type": "application/json", + Authorization: token ? `Bearer ${token}` : null, + }, + }, + {} + ); + }, + }, + user: { + get(token: string) { + // return new Promise((resolve, reject) => { + // resolve({ data: { name: "Test" } }); + // }); + return apiService( + { + url: `${environment.WEB_API_URL}user/me`, + baseURL: "/", + method: "get", + headers: { + "Content-Type": "application/json", + Authorization: token ? `Bearer ${token}` : null, + }, + }, + {} + ); + }, + }, +}; diff --git a/src/shared/api/webAPI/services/infoService.ts b/src/shared/api/webAPI/services/infoService.ts new file mode 100644 index 00000000..682d67a1 --- /dev/null +++ b/src/shared/api/webAPI/services/infoService.ts @@ -0,0 +1,37 @@ +import apiService from "@/shared/api/axios/apiService"; +import environment from "@/shared/api/environment"; + +export const InfoService = { + sources: { + get(token) { + return apiService( + { + url: `${environment.WEB_API_URL}source/sources`, + method: "get", + baseURL: "/", + headers: { + "Content-Type": "application/json", + Authorization: token ? `Bearer ${token}` : null, + }, + }, + {} + ); + }, + }, + webApi: { + get(token) { + return apiService( + { + url: `${environment.WEB_API_URL}info`, + method: "get", + baseURL: "/", + headers: { + "Content-Type": "application/json", + Authorization: token ? `Bearer ${token}` : null, + }, + }, + {} + ); + }, + }, +}; diff --git a/src/shared/api/webAPI/services/vocabularyService.ts b/src/shared/api/webAPI/services/vocabularyService.ts new file mode 100644 index 00000000..41939dcc --- /dev/null +++ b/src/shared/api/webAPI/services/vocabularyService.ts @@ -0,0 +1,25 @@ +import environment from "@/shared/api/environment"; +import apiService from "@/shared/api/axios/apiService"; + +export const VocabularyService = { + search: { + get(query, source, token) { + return apiService( + { + url: `${environment.WEB_API_URL}vocabulary/${source}/search/`, + baseURL: "./", + method: "post", + headers: { + "Content-Type": "application/json", + Authorization: token ? `Bearer ${token}` : null, + }, + data: { + STANDARD_CONCEPT: "S", + QUERY: query, + }, + }, + {} + ); + }, + }, +}; diff --git a/src/shared/assets/ares_logo.svg b/src/shared/assets/ares_logo.svg new file mode 100644 index 00000000..258e032a --- /dev/null +++ b/src/shared/assets/ares_logo.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + diff --git a/src/shared/config/files.js b/src/shared/config/files.ts similarity index 74% rename from src/shared/config/files.js rename to src/shared/config/files.ts index e864cf2a..f43df288 100644 --- a/src/shared/config/files.js +++ b/src/shared/config/files.ts @@ -2,6 +2,9 @@ export const INDEX = "index"; export const CONCEPT = "concept"; export const QUALITY_INDEX = "qualityIndex"; export const QUALITY_RESULTS = "qualityResults"; +export const QUALITY_DELTA = "qualityDelta"; + +export const NOTES = "notes"; export const DEATH = "death"; export const SOURCE_HISTORY_INDEX = "sourceHistoryIndex"; export const DENSITY_RECORDS_PERSON = "densityRecordsPerson"; @@ -14,6 +17,7 @@ export const NETWORK_QUALITY_SUMMARY = "networkQualitySummary"; export const RECORDS_DOMAIN = "recordsDomain"; export const OBSERVATION_PERIOD = "observationPeriod"; export const ACHILLES_PERFORMANCE = "achillesPerformance"; +export const COHORT_DIAGNOSTICS_PERFORMANCE = "cohort_diagnostics_performance"; export const PERSON = "person"; export const SOURCE_CONCEPT = "sourceConcept"; export const QUALITY_COMPLETENESS = "qualityCompleteness"; @@ -25,3 +29,14 @@ export const DENSITY_DOMAIN_PERSON = "densityDomainPerson"; export const NETWORK_PERFORMANCE = "networkPerformance"; export const EXPORT_QUERY_INDEX = "exportQueryIndex"; export const TEMPORAL_CHARACTERIZATION = "temporalCharacterization"; + +export const COHORT_INDEX = "cohortsIndex"; + +export const COHORT_CHARACTERIZATION = "cohortReport"; + +export const COHORT_INDEX_EVENT_BREAKDOWN = "cohortIndexEventBreakdown"; + +export const COHORT_TEMPORAL_COVARIATE_DISTRIBUTION = + "cohortTemporalCovariateDistribution"; + +export const LOCATION = "location"; diff --git a/src/shared/config/links.js b/src/shared/config/links.js deleted file mode 100644 index bf103cce..00000000 --- a/src/shared/config/links.js +++ /dev/null @@ -1,30 +0,0 @@ -const getSqlQueryLink = function (val) { - return `https://github.com/OHDSI/Achilles/tree/main/inst/sql/sql_server/${val}`; -}; -const getAchillesLink = function () { - return "https://github.com/ohdsi/achilles"; -}; -const getDatavizDatasheetLink = function () { - return "https://policyviz.com/2018/08/07/dataviz-cheatsheet/"; -}; -export const VEGA_SCHEMA = "https://vega.github.io/schema/vega-lite/v5.json"; -const getDataQualityDashboardLink = function () { - return "https://ohdsi.github.io/DataQualityDashboard/"; -}; -const getCastorLink = function () { - return "http://www.github.com/ohdsi/castor"; -}; -const getDocsLink = function (val) { - return `https://ohdsi.github.io/CommonDataModel/cdm531.html#${val}`; -}; - -export const getLinks = { - methods: { - getSqlQueryLink, - getDocsLink, - getCastorLink, - getAchillesLink, - getDatavizDatasheetLink, - getDataQualityDashboardLink, - }, -}; diff --git a/src/shared/config/links.ts b/src/shared/config/links.ts new file mode 100644 index 00000000..8624f6e3 --- /dev/null +++ b/src/shared/config/links.ts @@ -0,0 +1,33 @@ +const getSqlQueryLink = function (val: string): string { + return `https://github.com/OHDSI/Achilles/tree/main/inst/sql/sql_server/${val}`; +}; +const getAchillesLink = function (): string { + return "https://github.com/ohdsi/achilles"; +}; +const getDatavizDatasheetLink = function (): string { + return "https://policyviz.com/2018/08/07/dataviz-cheatsheet/"; +}; +export const VEGA_SCHEMA = "https://vega.github.io/schema/vega-lite/v5.json"; +const getDataQualityDashboardLink = function (): string { + return "https://ohdsi.github.io/DataQualityDashboard/"; +}; +const getCastorLink = function (): string { + return "http://www.github.com/ohdsi/castor"; +}; +const getDocsLink = function (val: string): string { + return `https://ohdsi.github.io/CommonDataModel/cdm531.html#${val}`; +}; + +const getNewIssueLink = function (title = "", body = "") { + return `https://github.com/OHDSI/Ares/issues/new?assignees=&labels=&projects=&template=bug_report.md&title=${title}&body=${body}`; +}; + +export const links = { + getSqlQueryLink, + getDocsLink, + getCastorLink, + getAchillesLink, + getDatavizDatasheetLink, + getDataQualityDashboardLink, + getNewIssueLink, +}; diff --git a/src/shared/config/webApiKeyMap.ts b/src/shared/config/webApiKeyMap.ts new file mode 100644 index 00000000..16023492 --- /dev/null +++ b/src/shared/config/webApiKeyMap.ts @@ -0,0 +1,10 @@ +export default { + domains: { + Condition: "condition_occurrence", + Drug: "drug_exposure", + Device: "device_exposure", + Measurement: "measurement", + Procedure: "procedure_occurrence", + Observation: "observation", + }, +}; diff --git a/src/shared/interfaces/Annotations.ts b/src/shared/interfaces/Annotations.ts new file mode 100644 index 00000000..711df749 --- /dev/null +++ b/src/shared/interfaces/Annotations.ts @@ -0,0 +1,36 @@ +export interface Annotation { + body: { + description: string; + title: string; + notes: Note[]; + }; + coordinates: { + height: number; + width: number; + x1Axis: number; + x2Axis: number; + y1Axis: number; + y2Axis: number; + }; + id: string; + metadata: { + createdAt: number; + createdBy: string; + updatedAt: string; + scope: { + type: string; + value: { source: string[]; concept: string[]; release: string[] }; + }; + }; +} + +export interface Note { + createdAt: number; + createdBy: string; + updatedAt: number; + title: string; + description: string; + id: string; + report?: string; + selection?: string; +} diff --git a/src/shared/interfaces/DataTableHeader.ts b/src/shared/interfaces/DataTableHeader.ts new file mode 100644 index 00000000..f18f0a3c --- /dev/null +++ b/src/shared/interfaces/DataTableHeader.ts @@ -0,0 +1,14 @@ +export interface DataTableHeader { + key: string; + title: string; + colspan?: number; + rowspan?: number; + fixed?: boolean; + align?: string; + width?: number; + minWidth?: string; + maxWidth?: string; + sortable?: boolean; + show?: boolean; + default?: boolean | undefined; +} diff --git a/src/shared/lib/composables/useAnnotationControls.ts b/src/shared/lib/composables/useAnnotationControls.ts new file mode 100644 index 00000000..b5f4fc60 --- /dev/null +++ b/src/shared/lib/composables/useAnnotationControls.ts @@ -0,0 +1,26 @@ +import { Ref, ref } from "vue"; + +interface AnnotationControlsComposable { + annotationsMode: Ref; + notesMode: Ref; + toggleAnnotationsMode: (arg: boolean) => void; + toggleNotesMode: (arg: boolean) => void; +} + +export default function useAnnotationControls(): AnnotationControlsComposable { + const annotationsMode = ref(false); + const notesMode = ref(false); + function toggleAnnotationsMode(mode: boolean) { + annotationsMode.value = mode; + } + function toggleNotesMode(mode: boolean) { + notesMode.value = mode; + } + + return { + annotationsMode, + notesMode, + toggleAnnotationsMode, + toggleNotesMode, + }; +} diff --git a/src/shared/lib/composables/useAnnotations.ts b/src/shared/lib/composables/useAnnotations.ts new file mode 100644 index 00000000..9372339e --- /dev/null +++ b/src/shared/lib/composables/useAnnotations.ts @@ -0,0 +1,66 @@ +import { computed, ComputedRef } from "vue"; +import { Store, useStore } from "vuex"; +import { RouteLocation, useRoute } from "vue-router"; +import { Annotation, Note } from "@/shared/interfaces/Annotations"; + +interface AnnotationComposable { + annotations: ComputedRef; + notes: ComputedRef; +} + +export default function useAnnotations(reportId: string): AnnotationComposable { + const store: Store = useStore(); + const route: RouteLocation = useRoute(); + + const currentScope = computed( + (): { concept: string; source: string; release: string } => { + return { + concept: Array.isArray(route.params.concept) + ? route.params.concept[0] + : route.params.concept, + source: store.getters.getSelectedSource.cdm_source_key, + release: store.getters.getSelectedRelease.release_id, + }; + } + ); + + const annotations = computed((): Annotation[] => { + const selections = store.getters.getNotes[reportId] || []; + + return selections.filter((val) => { + const scope = val.metadata.scope.value; + let showSelection = true; + if (scope.concept) { + showSelection = scope.concept.includes(currentScope.value.concept); + } + if (scope.source && showSelection) { + showSelection = scope.source.includes(currentScope.value.source); + } + if (scope.release && showSelection) { + showSelection = scope.release.includes(currentScope.value.release); + } + return showSelection; + }); + }); + + const notes = computed((): Note[] => { + if (annotations.value.length) { + return annotations.value.reduce((acc, val) => { + const selection = val.id; + const currentNotes = val.body.notes.map((note) => ({ + ...note, + report: reportId, + selection, + })); + return [...acc, ...currentNotes]; + }, []); + } else { + return []; + } + }); + + return { + annotations, + notes, + }; +} diff --git a/src/shared/lib/derive-results.js b/src/shared/lib/derive-results.ts similarity index 52% rename from src/shared/lib/derive-results.js rename to src/shared/lib/derive-results.ts index 9ad80c0f..a2423916 100644 --- a/src/shared/lib/derive-results.js +++ b/src/shared/lib/derive-results.ts @@ -1,21 +1,21 @@ -export default function deriveResults(dqResults) { +export default function deriveResults(data /*: CheckResults[]*/) { // Verification Plausibility - const VerificationPlausibilityPass = dqResults.CheckResults.filter( + const VerificationPlausibilityPass = data.filter( (c) => - c.FAILED == 0 && - c.CONTEXT == "Verification" && - c.CATEGORY == "Plausibility" + c.failed == 0 && + c.context == "Verification" && + c.category == "Plausibility" ).length; - const VerificationPlausibilityFail = dqResults.CheckResults.filter( + const VerificationPlausibilityFail = data.filter( (c) => - c.FAILED == 1 && - c.CONTEXT == "Verification" && - c.CATEGORY == "Plausibility" + c.failed == 1 && + c.context == "Verification" && + c.category == "Plausibility" ).length; - const VerificationPlausibilityTotal = dqResults.CheckResults.filter( - (c) => c.CONTEXT == "Verification" && c.CATEGORY == "Plausibility" + const VerificationPlausibilityTotal = data.filter( + (c) => c.context == "Verification" && c.category == "Plausibility" ).length; const VerificationPlausibilityPercentPass = @@ -27,22 +27,22 @@ export default function deriveResults(dqResults) { ).toFixed(1) + "%"; // Verification Conformance - const VerificationConformancePass = dqResults.CheckResults.filter( + const VerificationConformancePass = data.filter( (c) => - c.FAILED == 0 && - c.CONTEXT == "Verification" && - c.CATEGORY == "Conformance" + c.failed == 0 && + c.context == "Verification" && + c.category == "Conformance" ).length; - const VerificationConformanceFail = dqResults.CheckResults.filter( + const VerificationConformanceFail = data.filter( (c) => - c.FAILED == 1 && - c.CONTEXT == "Verification" && - c.CATEGORY == "Conformance" + c.failed == 1 && + c.context == "Verification" && + c.category == "Conformance" ).length; - const VerificationConformanceTotal = dqResults.CheckResults.filter( - (c) => c.CONTEXT == "Verification" && c.CATEGORY == "Conformance" + const VerificationConformanceTotal = data.filter( + (c) => c.context == "Verification" && c.category == "Conformance" ).length; const VerificationConformancePercentPass = @@ -54,22 +54,22 @@ export default function deriveResults(dqResults) { ).toFixed(1) + "%"; // Verification Completeness - const VerificationCompletenessPass = dqResults.CheckResults.filter( + const VerificationCompletenessPass = data.filter( (c) => - c.FAILED == 0 && - c.CONTEXT == "Verification" && - c.CATEGORY == "Completeness" + c.failed == 0 && + c.context == "Verification" && + c.category == "Completeness" ).length; - const VerificationCompletenessFail = dqResults.CheckResults.filter( + const VerificationCompletenessFail = data.filter( (c) => - c.FAILED == 1 && - c.CONTEXT == "Verification" && - c.CATEGORY == "Completeness" + c.failed == 1 && + c.context == "Verification" && + c.category == "Completeness" ).length; - const VerificationCompletenessTotal = dqResults.CheckResults.filter( - (c) => c.CONTEXT == "Verification" && c.CATEGORY == "Completeness" + const VerificationCompletenessTotal = data.filter( + (c) => c.context == "Verification" && c.category == "Completeness" ).length; const VerificationCompletenessPercentPass = @@ -81,16 +81,16 @@ export default function deriveResults(dqResults) { ).toFixed(1) + "%"; // Verification Totals - const VerificationPass = dqResults.CheckResults.filter( - (c) => c.FAILED == 0 && c.CONTEXT == "Verification" + const VerificationPass = data.filter( + (c) => c.failed == 0 && c.context == "Verification" ).length; - const VerificationFail = dqResults.CheckResults.filter( - (c) => c.FAILED == 1 && c.CONTEXT == "Verification" + const VerificationFail = data.filter( + (c) => c.failed == 1 && c.context == "Verification" ).length; - const VerificationTotal = dqResults.CheckResults.filter( - (c) => c.CONTEXT == "Verification" + const VerificationTotal = data.filter( + (c) => c.context == "Verification" ).length; const VerificationPercentPass = @@ -99,18 +99,18 @@ export default function deriveResults(dqResults) { : ((VerificationPass / VerificationTotal) * 100).toFixed(1) + "%"; // Validation Plausibility - const ValidationPlausibilityPass = dqResults.CheckResults.filter( + const ValidationPlausibilityPass = data.filter( (c) => - c.FAILED == 0 && c.CONTEXT == "Validation" && c.CATEGORY == "Plausibility" + c.failed == 0 && c.context == "Validation" && c.category == "Plausibility" ).length; - const ValidationPlausibilityFail = dqResults.CheckResults.filter( + const ValidationPlausibilityFail = data.filter( (c) => - c.FAILED == 1 && c.CONTEXT == "Validation" && c.CATEGORY == "Plausibility" + c.failed == 1 && c.context == "Validation" && c.category == "Plausibility" ).length; - const ValidationPlausibilityTotal = dqResults.CheckResults.filter( - (c) => c.CONTEXT == "Validation" && c.CATEGORY == "Plausibility" + const ValidationPlausibilityTotal = data.filter( + (c) => c.context == "Validation" && c.category == "Plausibility" ).length; const ValidationPlausibilityPercentPass = @@ -122,18 +122,18 @@ export default function deriveResults(dqResults) { ).toFixed(1) + "%"; // Validation Conformance - const ValidationConformancePass = dqResults.CheckResults.filter( + const ValidationConformancePass = data.filter( (c) => - c.FAILED == 0 && c.CONTEXT == "Validation" && c.CATEGORY == "Conformance" + c.failed == 0 && c.context == "Validation" && c.category == "Conformance" ).length; - const ValidationConformanceFail = dqResults.CheckResults.filter( + const ValidationConformanceFail = data.filter( (c) => - c.FAILED == 1 && c.CONTEXT == "Validation" && c.CATEGORY == "Conformance" + c.failed == 1 && c.context == "Validation" && c.category == "Conformance" ).length; - const ValidationConformanceTotal = dqResults.CheckResults.filter( - (c) => c.CONTEXT == "Validation" && c.CATEGORY == "Conformance" + const ValidationConformanceTotal = data.filter( + (c) => c.context == "Validation" && c.category == "Conformance" ).length; const ValidationConformancePercentPass = @@ -145,18 +145,18 @@ export default function deriveResults(dqResults) { ).toFixed(1) + "%"; // Validation Completeness - const ValidationCompletenessPass = dqResults.CheckResults.filter( + const ValidationCompletenessPass = data.filter( (c) => - c.FAILED == 0 && c.CONTEXT == "Validation" && c.CATEGORY == "Completeness" + c.failed == 0 && c.context == "Validation" && c.category == "Completeness" ).length; - const ValidationCompletenessFail = dqResults.CheckResults.filter( + const ValidationCompletenessFail = data.filter( (c) => - c.FAILED == 1 && c.CONTEXT == "Validation" && c.CATEGORY == "Completeness" + c.failed == 1 && c.context == "Validation" && c.category == "Completeness" ).length; - const ValidationCompletenessTotal = dqResults.CheckResults.filter( - (c) => c.CONTEXT == "Validation" && c.CATEGORY == "Completeness" + const ValidationCompletenessTotal = data.filter( + (c) => c.context == "Validation" && c.category == "Completeness" ).length; const ValidationCompletenessPercentPass = @@ -168,17 +168,15 @@ export default function deriveResults(dqResults) { ).toFixed(1) + "%"; // Validation - const ValidationPass = dqResults.CheckResults.filter( - (c) => c.FAILED == 0 && c.CONTEXT == "Validation" + const ValidationPass = data.filter( + (c) => c.failed == 0 && c.context == "Validation" ).length; - const ValidationFail = dqResults.CheckResults.filter( - (c) => c.FAILED == 1 && c.CONTEXT == "Validation" + const ValidationFail = data.filter( + (c) => c.failed == 1 && c.context == "Validation" ).length; - const ValidationTotal = dqResults.CheckResults.filter( - (c) => c.CONTEXT == "Validation" - ).length; + const ValidationTotal = data.filter((c) => c.context == "Validation").length; const ValidationPercentPass = ValidationTotal == 0 @@ -186,16 +184,16 @@ export default function deriveResults(dqResults) { : ((ValidationPass / ValidationTotal) * 100).toFixed(1) + "%"; // Plausibility - const PlausibilityPass = dqResults.CheckResults.filter( - (c) => c.FAILED == 0 && c.CATEGORY == "Plausibility" + const PlausibilityPass = data.filter( + (c) => c.failed == 0 && c.category == "Plausibility" ).length; - const PlausibilityFail = dqResults.CheckResults.filter( - (c) => c.FAILED == 1 && c.CATEGORY == "Plausibility" + const PlausibilityFail = data.filter( + (c) => c.failed == 1 && c.category == "Plausibility" ).length; - const PlausibilityTotal = dqResults.CheckResults.filter( - (c) => c.CATEGORY == "Plausibility" + const PlausibilityTotal = data.filter( + (c) => c.category == "Plausibility" ).length; const PlausibilityPercentPass = @@ -204,16 +202,16 @@ export default function deriveResults(dqResults) { : ((PlausibilityPass / PlausibilityTotal) * 100).toFixed(1) + "%"; // Conformance - const ConformancePass = dqResults.CheckResults.filter( - (c) => c.FAILED == 0 && c.CATEGORY == "Conformance" + const ConformancePass = data.filter( + (c) => c.failed == 0 && c.category == "Conformance" ).length; - const ConformanceFail = dqResults.CheckResults.filter( - (c) => c.FAILED == 1 && c.CATEGORY == "Conformance" + const ConformanceFail = data.filter( + (c) => c.failed == 1 && c.category == "Conformance" ).length; - const ConformanceTotal = dqResults.CheckResults.filter( - (c) => c.CATEGORY == "Conformance" + const ConformanceTotal = data.filter( + (c) => c.category == "Conformance" ).length; const ConformancePercentPass = @@ -222,16 +220,16 @@ export default function deriveResults(dqResults) { : ((ConformancePass / ConformanceTotal) * 100).toFixed(1) + "%"; // Completeness - const CompletenessPass = dqResults.CheckResults.filter( - (c) => c.FAILED == 0 && c.CATEGORY == "Completeness" + const CompletenessPass = data.filter( + (c) => c.failed == 0 && c.category == "Completeness" ).length; - const CompletenessFail = dqResults.CheckResults.filter( - (c) => c.FAILED == 1 && c.CATEGORY == "Completeness" + const CompletenessFail = data.filter( + (c) => c.failed == 1 && c.category == "Completeness" ).length; - const CompletenessTotal = dqResults.CheckResults.filter( - (c) => c.CATEGORY == "Completeness" + const CompletenessTotal = data.filter( + (c) => c.category == "Completeness" ).length; const CompletenessPercentPass = @@ -240,33 +238,32 @@ export default function deriveResults(dqResults) { : ((CompletenessPass / CompletenessTotal) * 100).toFixed(1) + "%"; // All - const AllPass = dqResults.CheckResults.filter((c) => c.FAILED == 0).length; + const AllPass = data.filter((c) => c.failed == 0).length; - const AllFail = dqResults.CheckResults.filter((c) => c.FAILED == 1).length; + const AllFail = data.filter((c) => c.failed == 1).length; - const AllTotal = dqResults.CheckResults.length; + const AllTotal = data.length; const AllPercentPass = AllTotal == 0 ? "-" : ((AllPass / AllTotal) * 100).toFixed(1) + "%"; - for (let i = 0; i < dqResults.CheckResults.length; i++) { - if (dqResults.CheckResults[i].FAILED == 0) { - dqResults.CheckResults[i].FAILED = "PASS"; + for (let i = 0; i < data.length; i++) { + if (data[i].failed == 0) { + data[i].failed = "PASS"; } else { - dqResults.CheckResults[i].FAILED = "FAIL"; + data[i].failed = "FAIL"; } - if (dqResults.CheckResults[i].NOTES == undefined) { - dqResults.CheckResults[i].NOTES_EXIST = "None"; + if (data[i].NOTES == undefined) { + data[i].NOTES_EXIST = "None"; } else { - dqResults.CheckResults[i].NOTES_EXIST = "Exists"; + data[i].NOTES_EXIST = "Exists"; } - if (!dqResults.CheckResults[i].CDM_FIELD_NAME) { - dqResults.CheckResults[i].CDM_FIELD_NAME = "N/A"; + if (!data[i].CDM_FIELD_NAME) { + data[i].CDM_FIELD_NAME = "N/A"; } else { - dqResults.CheckResults[i].CDM_FIELD_NAME = - dqResults.CheckResults[i].CDM_FIELD_NAME.toUpperCase(); + data[i].CDM_FIELD_NAME = data[i].CDM_FIELD_NAME.toUpperCase(); } } diff --git a/src/shared/lib/directives/clickOutside.ts b/src/shared/lib/directives/clickOutside.ts new file mode 100644 index 00000000..c64047e7 --- /dev/null +++ b/src/shared/lib/directives/clickOutside.ts @@ -0,0 +1,17 @@ +const clickOutside = { + beforeMount: (el, binding) => { + el.clickOutsideEvent = (event) => { + // here I check that click was outside the el and his children + if (!(el == event.target || el.contains(event.target))) { + // and if it did, call method provided in attribute value + binding.value(); + } + }; + document.addEventListener("click", el.clickOutsideEvent); + }, + unmounted: (el) => { + document.removeEventListener("click", el.clickOutsideEvent); + }, +}; + +export default clickOutside; diff --git a/src/shared/lib/directives/resize.ts b/src/shared/lib/directives/resize.ts new file mode 100644 index 00000000..3775f251 --- /dev/null +++ b/src/shared/lib/directives/resize.ts @@ -0,0 +1,16 @@ +const resize = { + beforeMount: (el, binding) => { + const onResizeCallback = binding.value; + el.resizeEvent = () => { + const width = document.documentElement.clientWidth; + const height = document.documentElement.clientHeight; + onResizeCallback({ width, height }); + }; + window.addEventListener("resize", el.resizeEvent); + }, + unmounted: (el) => { + window.removeEventListener("resize", el.resizeEvent); + }, +}; + +export default resize; diff --git a/src/shared/lib/get-percentage.js b/src/shared/lib/get-percentage.js deleted file mode 100644 index 7e929cea..00000000 --- a/src/shared/lib/get-percentage.js +++ /dev/null @@ -1,6 +0,0 @@ -export default function getPercentage(value, array) { - const denominator = array.reduce((acc, current) => { - return acc + current.COUNT_VALUE; - }, 0); - return ((value / denominator) * 100).toFixed(2); -} diff --git a/src/shared/lib/get-percentage.ts b/src/shared/lib/get-percentage.ts new file mode 100644 index 00000000..c5687fc4 --- /dev/null +++ b/src/shared/lib/get-percentage.ts @@ -0,0 +1,11 @@ +import { RecordsCountType } from "@/processes/exploreReports/model/interfaces/reportTypes/RecordsCountType"; + +export default function getPercentage( + value: number, + array: RecordsCountType[] +): string { + const denominator = array.reduce((acc, current) => { + return acc + current.COUNT_VALUE; + }, 0); + return ((value / denominator) * 100).toFixed(2); +} diff --git a/src/shared/lib/mixins/index.js b/src/shared/lib/mixins/index.ts similarity index 69% rename from src/shared/lib/mixins/index.js rename to src/shared/lib/mixins/index.ts index 68554bcb..2ef34dc0 100644 --- a/src/shared/lib/mixins/index.js +++ b/src/shared/lib/mixins/index.ts @@ -8,16 +8,16 @@ import { getValuesArray } from "@/shared/lib/mixins/methods/getValuesArray"; import { navigateTo } from "@/shared/lib/mixins/methods/navigateTo"; import { formatComma } from "@/shared/lib/mixins/methods/formatComma"; import { formatPercent } from "@/shared/lib/mixins/methods/formatPercent"; +import { openNewTab } from "@/shared/lib/mixins/methods/openNewTab"; -export const mixins = { - methods: { - debouncedSearch, - getFontWeight, - getPaddedDate, - getValuesArray, - navigateTo, - formatComma, - formatPercent, - padTo2Digits, - }, +export const helpers = { + debouncedSearch, + getFontWeight, + getPaddedDate, + getValuesArray, + navigateTo, + formatComma, + formatPercent, + padTo2Digits, + openNewTab, }; diff --git a/src/shared/lib/mixins/methods/checkJWTexpiry.ts b/src/shared/lib/mixins/methods/checkJWTexpiry.ts new file mode 100644 index 00000000..26a81deb --- /dev/null +++ b/src/shared/lib/mixins/methods/checkJWTexpiry.ts @@ -0,0 +1,9 @@ +import { jwtDecode } from "jwt-decode"; + +export function checkExpiryDate(token) { + if (token) { + const decodedToken = jwtDecode(token); + const currentTime = Date.now() / 1000; + return decodedToken.exp < currentTime; + } +} diff --git a/src/shared/lib/mixins/methods/debouncedSearch.js b/src/shared/lib/mixins/methods/debouncedSearch.js deleted file mode 100644 index dd838069..00000000 --- a/src/shared/lib/mixins/methods/debouncedSearch.js +++ /dev/null @@ -1,9 +0,0 @@ -import { debounce } from "lodash"; - -export const debouncedSearch = debounce(function (data) { - this.$router.push({ - query: { - search: data, - }, - }); -}, 300); diff --git a/src/shared/lib/mixins/methods/debouncedSearch.ts b/src/shared/lib/mixins/methods/debouncedSearch.ts new file mode 100644 index 00000000..1824b41f --- /dev/null +++ b/src/shared/lib/mixins/methods/debouncedSearch.ts @@ -0,0 +1,12 @@ +import { debounce } from "lodash"; +import { useRouter } from "vue-router"; + +const router = useRouter(); + +export const debouncedSearch = debounce(function (data: string) { + router.push({ + query: { + search: data, + }, + }); +}, 300); diff --git a/src/shared/lib/mixins/methods/formatComma.js b/src/shared/lib/mixins/methods/formatComma.ts similarity index 56% rename from src/shared/lib/mixins/methods/formatComma.js rename to src/shared/lib/mixins/methods/formatComma.ts index 9059356d..700b2c0a 100644 --- a/src/shared/lib/mixins/methods/formatComma.js +++ b/src/shared/lib/mixins/methods/formatComma.ts @@ -1,5 +1,5 @@ import * as d3Format from "d3-format"; -export const formatComma = function (value) { +export const formatComma = function (value: number): string { return d3Format.format(",")(value); }; diff --git a/src/shared/lib/mixins/methods/formatPercent.js b/src/shared/lib/mixins/methods/formatPercent.ts similarity index 56% rename from src/shared/lib/mixins/methods/formatPercent.js rename to src/shared/lib/mixins/methods/formatPercent.ts index 604f372c..53c5ea53 100644 --- a/src/shared/lib/mixins/methods/formatPercent.js +++ b/src/shared/lib/mixins/methods/formatPercent.ts @@ -1,5 +1,5 @@ import * as d3Format from "d3-format"; -export const formatPercent = function (value) { +export const formatPercent = function (value: number): string { return d3Format.format("0.0%")(value); }; diff --git a/src/shared/lib/mixins/methods/getFontWeight.js b/src/shared/lib/mixins/methods/getFontWeight.js deleted file mode 100644 index 5427dd08..00000000 --- a/src/shared/lib/mixins/methods/getFontWeight.js +++ /dev/null @@ -1,13 +0,0 @@ -export const getFontWeight = function (decile) { - if (decile == 1) { - return "font-weight-black"; - } else if (decile == 2) { - return "font-weight-bold"; - } else if (decile == 3) { - return "font-weight-medium"; - } else if (decile == 9 || decile == 10) { - return "font-weight-light"; - } else { - return "font-weight-regular"; - } -}; diff --git a/src/shared/lib/mixins/methods/getFontWeight.ts b/src/shared/lib/mixins/methods/getFontWeight.ts new file mode 100644 index 00000000..425d8303 --- /dev/null +++ b/src/shared/lib/mixins/methods/getFontWeight.ts @@ -0,0 +1,13 @@ +export const getFontWeight = function (decile: string): string { + if (decile === "1") { + return "font-black"; + } else if (decile === "2") { + return "font-bold"; + } else if (decile === "3") { + return "font-medium"; + } else if (decile === "9" || decile === "10") { + return "font-light"; + } else { + return "font-normal"; + } +}; diff --git a/src/shared/lib/mixins/methods/getPaddedDate.js b/src/shared/lib/mixins/methods/getPaddedDate.ts similarity index 58% rename from src/shared/lib/mixins/methods/getPaddedDate.js rename to src/shared/lib/mixins/methods/getPaddedDate.ts index b228edaa..137d3b57 100644 --- a/src/shared/lib/mixins/methods/getPaddedDate.js +++ b/src/shared/lib/mixins/methods/getPaddedDate.ts @@ -1,8 +1,8 @@ -export function padTo2Digits(num) { +export function padTo2Digits(num: number): string { return num.toString().padStart(2, "0"); } -export function getPaddedDate(date, divider) { +export function getPaddedDate(date: Date, divider: string): string { return [ date.getFullYear(), padTo2Digits(date.getMonth() + 1), diff --git a/src/shared/lib/mixins/methods/getValuesArray.js b/src/shared/lib/mixins/methods/getValuesArray.js deleted file mode 100644 index 349ccb5a..00000000 --- a/src/shared/lib/mixins/methods/getValuesArray.js +++ /dev/null @@ -1,3 +0,0 @@ -export const getValuesArray = function (array, val) { - return array.map((d) => d[val]); -}; diff --git a/src/shared/lib/mixins/methods/getValuesArray.ts b/src/shared/lib/mixins/methods/getValuesArray.ts new file mode 100644 index 00000000..54ddc4f5 --- /dev/null +++ b/src/shared/lib/mixins/methods/getValuesArray.ts @@ -0,0 +1,12 @@ +export const getValuesArray = function ( + array: never[], + val: string, + unique?: boolean +): never[] { + if (!array) return []; + if (unique) { + return [...new Set(array.map((d) => d[val]))]; + } else { + return array.map((d) => d[val]); + } +}; diff --git a/src/shared/lib/mixins/methods/navigateTo.js b/src/shared/lib/mixins/methods/navigateTo.ts similarity index 50% rename from src/shared/lib/mixins/methods/navigateTo.js rename to src/shared/lib/mixins/methods/navigateTo.ts index 813a98e1..995f35d9 100644 --- a/src/shared/lib/mixins/methods/navigateTo.js +++ b/src/shared/lib/mixins/methods/navigateTo.ts @@ -1,4 +1,9 @@ -export const navigateTo = function (name, params = "", query = "", hash = "") { +export const navigateTo = function ( + name: string, + params = "", + query = "", + hash = "" +) { this.$router.push({ name: name, params: params, diff --git a/src/shared/lib/mixins/methods/openNewTab.ts b/src/shared/lib/mixins/methods/openNewTab.ts new file mode 100644 index 00000000..35b7463c --- /dev/null +++ b/src/shared/lib/mixins/methods/openNewTab.ts @@ -0,0 +1,3 @@ +export function openNewTab(link) { + window.open(link, "_blank").focus(); +} diff --git a/src/shared/lib/range-sort.js b/src/shared/lib/range-sort.ts similarity index 83% rename from src/shared/lib/range-sort.js rename to src/shared/lib/range-sort.ts index d198608b..6ad458d2 100644 --- a/src/shared/lib/range-sort.js +++ b/src/shared/lib/range-sort.ts @@ -1,9 +1,9 @@ -export default function sortByRange( - array, - sortOrder, - rangeKey, - outputOrderKey -) { +export default function sortByRange( + array: Type[], + sortOrder: string, + rangeKey: string, + outputOrderKey: string +): Type[] { return array .map((item) => ({ ...item, diff --git a/src/shared/lib/vuex-router-sync.js b/src/shared/lib/vuex-router-sync.js index 36d4d785..ece5f91f 100644 --- a/src/shared/lib/vuex-router-sync.js +++ b/src/shared/lib/vuex-router-sync.js @@ -1,5 +1,4 @@ // Copyright (c) 2016 Evan You, https://github.com/vuejs/vuex-router-sync - export default function sync(store, router, options) { const moduleName = (options || {}).moduleName || "route"; diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts new file mode 100644 index 00000000..ceac722f --- /dev/null +++ b/src/shims-vue.d.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} + +declare module "vue-easytable" + +declare module "vue3-markdown-it" + +declare module "vue-pivottable" diff --git a/src/style.css b/src/style.css new file mode 100644 index 00000000..16c330a8 --- /dev/null +++ b/src/style.css @@ -0,0 +1,50 @@ +@import "@/roboto.css"; + +@layer base { + body { + @apply min-h-screen bg-surface-0 dark:bg-surface-900; + } +} + + +@layer tailwind-base, primevue, tailwind-utilities; + +@layer tailwind-base { + @tailwind base; +} + +@layer tailwind-utilities { + @tailwind components; + @tailwind utilities; +} + +/* Initial Values */ +:root { + + + + --primary-50: 233, 242, 252; /* Very light tint */ + --primary-100: 212, 228, 248; /* Light tint */ + --primary-200: 191, 215, 244; /* Medium-light tint */ + --primary-300: 169, 201, 240; /* Medium tint */ + --primary-400: 33, 150, 243; /* Light shade */ + --primary-500: 25, 118, 210; /* Base color */ + --primary-600: 7, 56, 104; /* Dark shade */ + --primary-700: 4, 41, 80; /* Deeper shade */ + --primary-800: 2, 28, 57; /* Darkest shade */ + --primary-900: 0, 5, 16; /* Almost black */ + + --surface-0: 255 255 255; + --surface-50: 240 240 240; + --surface-100: 225 225 225; + --surface-200: 210 210 210; + --surface-300: 195 195 195; + --surface-400: 180 180 180; + --surface-500: 107 114 128; + --surface-600: 75 85 99; + --surface-700: 66 66 66; + --surface-800: 33 33 33; + --surface-900: 18,18,18; + --surface-950: 8 8 8; + +} diff --git a/src/vuex.d.ts b/src/vuex.d.ts new file mode 100644 index 00000000..fc793e28 --- /dev/null +++ b/src/vuex.d.ts @@ -0,0 +1,13 @@ +import { Store } from "vuex"; + +declare module "@vue/runtime-core" { + // declare your own store states + interface State { + count: number; + } + + // provide typings for `this.$store` + interface ComponentCustomProperties { + $store: Store; + } +} diff --git a/src/widgets/bottomNav/index.js b/src/widgets/bottomNav/index.js deleted file mode 100644 index 87ad53f7..00000000 --- a/src/widgets/bottomNav/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import BottomNav from "@/widgets/bottomNav/ui/BottomNav"; - -export default BottomNav; diff --git a/src/widgets/bottomNav/index.ts b/src/widgets/bottomNav/index.ts new file mode 100644 index 00000000..ca1e8da8 --- /dev/null +++ b/src/widgets/bottomNav/index.ts @@ -0,0 +1,3 @@ +import BottomNav from "@/widgets/bottomNav/ui/BottomNav.vue"; + +export default BottomNav; diff --git a/src/widgets/bottomNav/ui/BottomNav.vue b/src/widgets/bottomNav/ui/BottomNav.vue index 6af7f92c..5a065e96 100644 --- a/src/widgets/bottomNav/ui/BottomNav.vue +++ b/src/widgets/bottomNav/ui/BottomNav.vue @@ -1,37 +1,96 @@ - - + + + diff --git a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstDiagnosis.js b/src/widgets/chart/config/chartSpecifications/specAgeAtFirstDiagnosis.js deleted file mode 100644 index 2bac1208..00000000 --- a/src/widgets/chart/config/chartSpecifications/specAgeAtFirstDiagnosis.js +++ /dev/null @@ -1,47 +0,0 @@ -import { VEGA_SCHEMA } from "@/shared/config/links"; - -export function specAgeAtFirstDiagnosis(zeroBaseline = false, minMax = false) { - return { - $schema: VEGA_SCHEMA, - height: 100, - width: "container", - encoding: { - y: { - field: "CATEGORY", - type: "nominal", - title: null, - scale: { - zero: zeroBaseline, - }, - }, - }, - layer: [ - { - mark: { type: "rule" }, - encoding: { - x: { - field: minMax ? "MIN_VALUE" : "P10_VALUE", - type: "quantitative", - scale: { zero: false }, - title: null, - }, - x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, - }, - }, - { - mark: { type: "bar", size: 14, tooltip: {} }, - encoding: { - x: { field: "P25_VALUE", type: "quantitative" }, - x2: { field: "P75_VALUE" }, - color: { field: "CATEGORY", type: "nominal", legend: null }, - }, - }, - { - mark: { type: "tick", color: "white", size: 14 }, - encoding: { - x: { field: "MEDIAN_VALUE", type: "quantitative" }, - }, - }, - ], - }; -} diff --git a/src/widgets/chart/config/chartSpecifications/specBirthYear.js b/src/widgets/chart/config/chartSpecifications/specBirthYear.js deleted file mode 100644 index 967c08e0..00000000 --- a/src/widgets/chart/config/chartSpecifications/specBirthYear.js +++ /dev/null @@ -1,48 +0,0 @@ -import { VEGA_SCHEMA } from "@/shared/config/links"; - -export function specBirthYear(zeroBaseline = false) { - return { - $schema: VEGA_SCHEMA, - width: "container", - height: 100, - params: [ - { - name: "paintbrush", - select: { type: "point", on: "mouseover", nearest: true }, - }, - ], - mark: { type: "bar" }, - encoding: { - tooltip: [ - { field: "COUNT_PERSON", title: "# of People", format: "," }, - { - field: "YEAR", - title: "Year of Birth", - type: "temporal", - format: "%Y", - }, - ], - x: { - field: "YEAR", - type: "temporal", - title: "Year of Birth", - }, - y: { - field: "COUNT_PERSON", - aggregate: "sum", - title: "Number of People", - scale: { - zero: zeroBaseline, - }, - }, - color: { - condition: { - param: "paintbrush", - type: "nominal", - legend: null, - }, - value: "grey", - }, - }, - }; -} diff --git a/src/widgets/chart/config/chartSpecifications/specMeasurementValueDistribution1.js b/src/widgets/chart/config/chartSpecifications/specMeasurementValueDistribution1.js deleted file mode 100644 index b54248ad..00000000 --- a/src/widgets/chart/config/chartSpecifications/specMeasurementValueDistribution1.js +++ /dev/null @@ -1,59 +0,0 @@ -import { VEGA_SCHEMA } from "@/shared/config/links"; - -export function specMeasurementValueDistribution1( - zeroBaseline = false, - minMax = false -) { - return { - $schema: VEGA_SCHEMA, - height: { step: 20 }, - width: "container", - encoding: { - y: { - field: "SOURCE_UNIT_KEY", - type: "nominal", - title: null, - scale: { - zero: zeroBaseline, - }, - }, - }, - layer: [ - { - mark: { type: "rule" }, - encoding: { - x: { - field: minMax ? "MIN_VALUE" : "P10_VALUE", - type: "quantitative", - scale: { zero: false }, - title: null, - }, - x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, - }, - }, - { - mark: { type: "bar", size: 14, tooltip: {} }, - encoding: { - x: { field: "P25_VALUE", type: "quantitative" }, - x2: { field: "P75_VALUE" }, - color: { - field: "SOURCE_UNIT_KEY", - type: "nominal", - legend: null, - }, - }, - }, - { - mark: { type: "tick", color: "white", size: 14 }, - encoding: { - x: { field: "MEDIAN_VALUE", type: "quantitative" }, - }, - }, - ], - row: { - field: "SOURCE_UNIT_KEY", - type: "nominal", - title: "Measurement", - }, - }; -} diff --git a/src/widgets/chart/config/chartSpecifications/specVisitDurationByType.js b/src/widgets/chart/config/chartSpecifications/specVisitDurationByType.js deleted file mode 100644 index f975d913..00000000 --- a/src/widgets/chart/config/chartSpecifications/specVisitDurationByType.js +++ /dev/null @@ -1,47 +0,0 @@ -import { VEGA_SCHEMA } from "@/shared/config/links"; - -export function specVisitDurationByType(zeroBaseline = false, minMax = false) { - return { - $schema: VEGA_SCHEMA, - height: 100, - width: "container", - encoding: { - y: { - field: "CATEGORY", - type: "nominal", - title: null, - scale: { - zero: zeroBaseline, - }, - }, - }, - layer: [ - { - mark: { type: "rule" }, - encoding: { - x: { - field: minMax ? "MIN_VALUE" : "P10_VALUE", - type: "quantitative", - scale: { zero: false }, - title: null, - }, - x2: { field: minMax ? "MAX_VALUE" : "P90_VALUE" }, - }, - }, - { - mark: { type: "bar", size: 14, tooltip: {} }, - encoding: { - x: { field: "P25_VALUE", type: "quantitative" }, - x2: { field: "P75_VALUE" }, - color: { field: "CATEGORY", type: "nominal", legend: null }, - }, - }, - { - mark: { type: "tick", color: "white", size: 14 }, - encoding: { - x: { field: "MEDIAN_VALUE", type: "quantitative" }, - }, - }, - ], - }; -} diff --git a/src/widgets/chart/config/index.js b/src/widgets/chart/config/index.js deleted file mode 100644 index cd49a5e4..00000000 --- a/src/widgets/chart/config/index.js +++ /dev/null @@ -1,89 +0,0 @@ -import { specRace } from "@/widgets/chart/config/chartSpecifications/specRace"; -import { specAgeSex } from "@/widgets/chart/config/chartSpecifications/specAgeSex"; -import { defOverview } from "@/widgets/chart/config/chartSpecifications/defOverview"; -import { specAgeBySex } from "@/widgets/chart/config/chartSpecifications/specAgeBySex"; -import { specOverview } from "@/widgets/chart/config/chartSpecifications/specOverview"; -import { specQuantity } from "@/widgets/chart/config/chartSpecifications/specQuantity"; -import { specBirthYear } from "@/widgets/chart/config/chartSpecifications/specBirthYear"; -import { specEthnicity } from "@/widgets/chart/config/chartSpecifications/specEthnicity"; -import { specAgeAtDeath } from "@/widgets/chart/config/chartSpecifications/specAgeAtDeath"; -import { specDatastrand } from "@/widgets/chart/config/chartSpecifications/specDatastrand"; -import { specDaysSupply } from "@/widgets/chart/config/chartSpecifications/specDaysSupply"; -import { specDeathByType } from "@/widgets/chart/config/chartSpecifications/specDeathByType"; -import { specDrugsByType } from "@/widgets/chart/config/chartSpecifications/specDrugsByType"; -import { specLengthOfEra } from "@/widgets/chart/config/chartSpecifications/specLengthOfEra"; -import { specRecordsByUnit } from "@/widgets/chart/config/chartSpecifications/specRecordsByUnit"; -import { defRecordsPerPerson } from "@/widgets/chart/config/chartSpecifications/defRecordsPerPerson"; -import { specConditionsByType } from "@/widgets/chart/config/chartSpecifications/specConditionsByType"; -import { specObservationByAge } from "@/widgets/chart/config/chartSpecifications/specObservationByAge"; -import { specObservationBySex } from "@/widgets/chart/config/chartSpecifications/specObservationBySex"; -import { specAgeAtFirstExposure } from "@/widgets/chart/config/chartSpecifications/specAgeAtFirstExposure"; -import { specDataQualityResults } from "@/widgets/chart/config/chartSpecifications/specDataQualityResults"; -import { specMeasurementsByType } from "@/widgets/chart/config/chartSpecifications/specMeasurementsByType"; -import { specObservationByMonth } from "@/widgets/chart/config/chartSpecifications/specObservationByMonth"; -import { specAgeAtFirstDiagnosis } from "@/widgets/chart/config/chartSpecifications/specAgeAtFirstDiagnosis"; -import { specVisitDurationByType } from "@/widgets/chart/config/chartSpecifications/specVisitDurationByType"; -import { specVisitStratification } from "@/widgets/chart/config/chartSpecifications/specVisitStratification"; -import { specAgeAtFirstOccurrence } from "@/widgets/chart/config/chartSpecifications/specAgeAtFirstOccurrence"; -import { specAgeAtFirstObservationBySource } from "@/widgets/chart/config/chartSpecifications/specAgeAtFirstObservationBySource"; -import { specCumulativeObservationBySource } from "@/widgets/chart/config/chartSpecifications/specCumulativeObservationBySource"; -import { specRecordProportionByMonthByRelease } from "@/widgets/chart/config/chartSpecifications/specRecordProportionByMonthByRelease"; -import { specDataQualityResultsByDomain } from "@/widgets/chart/config/chartSpecifications/specDataQualityResultsByDomain"; -import { specIssueStratificationByTable } from "@/widgets/chart/config/chartSpecifications/specIssueStratificationByTable"; -import { specDataQualityResultsByCategory } from "@/widgets/chart/config/chartSpecifications/specDataQualityResultsByCategory"; -import { specMeasurementValueDistribution } from "@/widgets/chart/config/chartSpecifications/specMeasurementValueDistribution"; -import { specRecordProportionByAgeSexYear } from "@/widgets/chart/config/chartSpecifications/specRecordProportionByAgeSexYear"; -import { specIssueStratificationByCategory } from "@/widgets/chart/config/chartSpecifications/specIssueStratificationByCategory"; -import { specMeasurementValueDistribution1 } from "@/widgets/chart/config/chartSpecifications/specMeasurementValueDistribution1"; -import { specDrugTypeStratification } from "@/widgets/chart/config/chartSpecifications/specDrugTypeStratification"; -import { specCumulativeObservation } from "@/widgets/chart/config/chartSpecifications/specCumulativeObservation"; -import { specAgeAtFirstObservation } from "@/widgets/chart/config/chartSpecifications/specAgeAtFirstObservation"; -import { specRecordProportionByMonth } from "@/widgets/chart/config/chartSpecifications/specRecordProportionByMonth"; -import { specPopulationByRelease } from "@/widgets/chart/config/chartSpecifications/specPopulationByRelease"; -import { specIssuesByRelease } from "@/widgets/chart/config/chartSpecifications/specIssuesByRelease"; - -export const chartConfigs = { - specRace, - specAgeSex, - specAgeBySex, - defOverview, - defRecordsPerPerson, - specDrugTypeStratification, - specOverview, - specQuantity, - specBirthYear, - specEthnicity, - specAgeAtDeath, - specDatastrand, - specDaysSupply, - specDeathByType, - specDrugsByType, - specLengthOfEra, - specRecordsByUnit, - specConditionsByType, - specObservationByAge, - specObservationByMonth, - specObservationBySex, - specAgeAtFirstObservation, - specAgeAtFirstObservationBySource, - specAgeAtFirstDiagnosis, - specAgeAtFirstExposure, - specDataQualityResults, - specMeasurementValueDistribution1, - specMeasurementValueDistribution, - specMeasurementsByType, - specVisitStratification, - specVisitDurationByType, - specIssueStratificationByTable, - specIssueStratificationByCategory, - specAgeAtFirstOccurrence, - specRecordProportionByMonthByRelease, - specRecordProportionByMonth, - specRecordProportionByAgeSexYear, - specCumulativeObservationBySource, - specDataQualityResultsByDomain, - specDataQualityResultsByCategory, - specCumulativeObservation, - specPopulationByRelease, - specIssuesByRelease, -}; diff --git a/src/widgets/chart/index.js b/src/widgets/chart/index.js deleted file mode 100644 index 1c3c6bb8..00000000 --- a/src/widgets/chart/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import { chartConfigs } from "@/widgets/chart/config"; -import Chart from "@/widgets/chart/ui/Chart"; - -export { chartConfigs, Chart }; diff --git a/src/widgets/chart/index.ts b/src/widgets/chart/index.ts new file mode 100644 index 00000000..ce67032a --- /dev/null +++ b/src/widgets/chart/index.ts @@ -0,0 +1,3 @@ +import Chart from "@/widgets/chart/ui/Chart.vue"; + +export { Chart }; diff --git a/src/widgets/chart/model/themes.ts b/src/widgets/chart/model/themes.ts new file mode 100644 index 00000000..e32ae263 --- /dev/null +++ b/src/widgets/chart/model/themes.ts @@ -0,0 +1,49 @@ +export const darkTheme = { + background: "#212121", + title: { color: "#f0f0f0", fontSize: 18 }, + axis: { + domainColor: "#f0f0f0", + domainWidth: 1, + gridColor: "#888888", + gridWidth: 0.5, + labelColor: "#f0f0f0", + labelFontSize: 10, + tickColor: "#f0f0f0", + tickWidth: 1, + titleColor: "#f0f0f0", + titleFontSize: 12, + }, + legend: { + labelColor: "#f0f0f0", + labelFontSize: 10, + titleColor: "#f0f0f0", + titleFontSize: 12, + }, + mark: { color: "#4178BC" }, + rule: { color: "#f0f0f0" }, +}; + +export const lightTheme = { + background: "#FFFFFF", + title: { color: "#282828", fontSize: 18 }, + axis: { + domainColor: "#282828", + domainWidth: 1, + gridColor: "#888888", + gridWidth: 0.5, + labelColor: "#282828", + labelFontSize: 10, + tickColor: "#282828", + tickWidth: 1, + titleColor: "#282828", + titleFontSize: 12, + }, + legend: { + labelColor: "#282828", + labelFontSize: 10, + titleColor: "#282828", + titleFontSize: 12, + }, + mark: { color: "#4178BC" }, + rule: { color: "#282828" }, +}; diff --git a/src/widgets/chart/ui/Chart.vue b/src/widgets/chart/ui/Chart.vue old mode 100644 new mode 100755 index 2f95c8e9..2acadf69 --- a/src/widgets/chart/ui/Chart.vue +++ b/src/widgets/chart/ui/Chart.vue @@ -1,65 +1,473 @@ - + + - + diff --git a/src/widgets/chart/ui/ChartHeader.vue b/src/widgets/chart/ui/ChartHeader.vue new file mode 100644 index 00000000..b88129ef --- /dev/null +++ b/src/widgets/chart/ui/ChartHeader.vue @@ -0,0 +1,82 @@ + + + + diff --git a/src/widgets/conceptSearchForm/index.ts b/src/widgets/conceptSearchForm/index.ts new file mode 100644 index 00000000..0de4d02c --- /dev/null +++ b/src/widgets/conceptSearchForm/index.ts @@ -0,0 +1,3 @@ +import ConceptSearchForm from "@/widgets/conceptSearchForm/ui/ConceptSearchForm.vue"; + +export { ConceptSearchForm }; diff --git a/src/widgets/conceptSearchForm/ui/ConceptSearchForm.vue b/src/widgets/conceptSearchForm/ui/ConceptSearchForm.vue new file mode 100644 index 00000000..7425433c --- /dev/null +++ b/src/widgets/conceptSearchForm/ui/ConceptSearchForm.vue @@ -0,0 +1,428 @@ + + + + + + + diff --git a/src/widgets/error/index.js b/src/widgets/error/index.ts similarity index 77% rename from src/widgets/error/index.js rename to src/widgets/error/index.ts index 89ae2066..747f1a34 100644 --- a/src/widgets/error/index.js +++ b/src/widgets/error/index.ts @@ -1,5 +1,5 @@ import errorStore from "@/widgets/error/model/store/errors.module"; import * as errorActions from "./model/store/actions.type"; -import Error from "@/widgets/error/ui/Error"; +import Error from "@/widgets/error/ui/Error.vue"; export { Error, errorStore, errorActions }; diff --git a/src/widgets/error/model/config/errorMessages.ts b/src/widgets/error/model/config/errorMessages.ts new file mode 100644 index 00000000..96103486 --- /dev/null +++ b/src/widgets/error/model/config/errorMessages.ts @@ -0,0 +1,45 @@ +export default { + reportsMissingFiles: { + temporalCharacterization: + "Temporal characterization file is not found. Please make sure it exists within the current release folder then try again", + feasibility: "Requested files not found", + networkPerformance: + "Network performance file is not found. Please make sure it exists within the data directory then try again", + networkDiversityReport: "Requested files not found", + networkUnmappedSourceCodes: "Requested files not found", + networkConcept: "Requested files not found", + networkDataQuality: "Requested files not found", + cohorts: "Requested files not found", + cohortReport: "Requested files not found", + dataStrandReport: "Requested files not found", + population: "No files found across all data sources", + concept: "Seems like the data file for that particular concept is missing.", + dataQuality: "Requested files not found", + death: "Requested files not found", + dataDensity: "Requested files not found", + domainTable: "Requested files not found", + metadata: "Requested files not found", + observationPeriod: "Requested files not found", + performance: "Requested files not found", + person: "Requested files not found", + unmappedSourceCodes: "Requested files not found", + dataQualityHistory: "Requested files not found", + domainContinuity: "Requested files not found", + sourceConceptOverlay: "Requested files not found", + index: "Index file is missing. Please run AresIndexer then try again", + location: + "Location data is not available. Please run the latest version of achilles then try again", + }, + technicalError: { + codeError: + "Something went wrong. Please submit an issue on Github and describe the steps to reproduce it", + networkError: + "It seems that the server is not available at this time. Please make sure you have internet connection" + + " and the server is running then reload the page", + }, + webApiErrors: { + 404: "Resource is not found", + 500: "Internal server error", + 403: "You don't have permission for this action", + }, +}; diff --git a/src/widgets/error/model/interfaces/Error.ts b/src/widgets/error/model/interfaces/Error.ts new file mode 100644 index 00000000..540a27e2 --- /dev/null +++ b/src/widgets/error/model/interfaces/Error.ts @@ -0,0 +1,4 @@ +export interface Error { + message: string; + details: string; +} diff --git a/src/widgets/error/model/store/actions.type.js b/src/widgets/error/model/store/actions.type.ts similarity index 100% rename from src/widgets/error/model/store/actions.type.js rename to src/widgets/error/model/store/actions.type.ts diff --git a/src/widgets/error/model/store/errors.module.js b/src/widgets/error/model/store/errors.module.ts similarity index 87% rename from src/widgets/error/model/store/errors.module.js rename to src/widgets/error/model/store/errors.module.ts index 6f32c199..a55b600e 100644 --- a/src/widgets/error/model/store/errors.module.js +++ b/src/widgets/error/model/store/errors.module.ts @@ -6,13 +6,14 @@ import { ADD_ERROR, CLEAR_ERRORS, } from "@/widgets/error/model/store/mutations.type"; +import { Error } from "@/widgets/error/model/interfaces/Error"; const state = { errors: [], }; const getters = { - getErrors: (state) => { + getErrors: (state): Error[] | null => { return state.errors.length > 0 ? state.errors : null; }, }; diff --git a/src/widgets/error/model/store/mutations.type.js b/src/widgets/error/model/store/mutations.type.ts similarity index 100% rename from src/widgets/error/model/store/mutations.type.js rename to src/widgets/error/model/store/mutations.type.ts diff --git a/src/widgets/error/ui/Error.vue b/src/widgets/error/ui/Error.vue index aae4a6de..1a29a0a8 100644 --- a/src/widgets/error/ui/Error.vue +++ b/src/widgets/error/ui/Error.vue @@ -1,25 +1,138 @@ - diff --git a/src/widgets/explorer/config/folders.js b/src/widgets/explorer/config/folders.ts similarity index 50% rename from src/widgets/explorer/config/folders.js rename to src/widgets/explorer/config/folders.ts index e4485896..26dd4c16 100644 --- a/src/widgets/explorer/config/folders.js +++ b/src/widgets/explorer/config/folders.ts @@ -1,16 +1,22 @@ +import { + mdiDatabaseClockOutline, + mdiDatabaseOutline, + mdiNetworkOutline, +} from "@mdi/js"; + export const folders = [ { - icon: "mdi-network", + icon: mdiNetworkOutline, name: "Data Network", key: "network", }, { - icon: "mdi-database", + icon: mdiDatabaseOutline, name: "Data Source", key: "datasource", }, { - icon: "mdi-database-clock", + icon: mdiDatabaseClockOutline, name: "Data Source Release", key: "cdm", }, diff --git a/src/widgets/explorer/config/index.js b/src/widgets/explorer/config/index.ts similarity index 100% rename from src/widgets/explorer/config/index.js rename to src/widgets/explorer/config/index.ts diff --git a/src/widgets/explorer/config/reports.js b/src/widgets/explorer/config/reports.js deleted file mode 100644 index 133e5d3c..00000000 --- a/src/widgets/explorer/config/reports.js +++ /dev/null @@ -1,183 +0,0 @@ -export const reports = [ - { - folder: "Data Source Release", - icon: "mdi-sigma-lower", - name: "Data Quality", - routeName: "dataQuality", - }, - { - folder: "Data Source Release", - icon: "mdi-chart-line", - name: "Person", - routeName: "person", - }, - { - folder: "Data Network", - icon: "mdi-database-search", - name: "Data Source Feasibility", - routeName: "feasibility", - }, - { - folder: "Data Network", - icon: "mdi-speedometer", - name: "Network Performance", - routeName: "networkPerformance", - }, - { - folder: "Data Source Release", - icon: "mdi-chart-line", - name: "Data Density", - routeName: "dataDensity", - }, - { - folder: "Data Source Release", - icon: "mdi-chart-line", - name: "Observation Period", - routeName: "observationPeriod", - }, - { - folder: "Data Source", - name: "Data Quality History", - routeName: "dataQualityHistory", - }, - { - folder: "Data Source", - name: "Data Source Overview", - routeName: "dataSourceOverview", - }, - { - folder: "Data Source", - name: "Domain Continuity", - routeName: "domainContinuity", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Conditions", - routeName: "domainTable", - domain: "condition_occurrence", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Condition Eras", - routeName: "domainTable", - domain: "condition_era", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Drugs", - routeName: "domainTable", - domain: "drug_exposure", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Drug Eras", - routeName: "domainTable", - domain: "drug_era", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Visit Occurrence", - routeName: "domainTable", - domain: "visit_occurrence", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Visit Detail", - routeName: "domainTable", - domain: "visit_detail", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Measurements", - routeName: "domainTable", - domain: "measurement", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Observations", - routeName: "domainTable", - domain: "observation", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Procedures", - routeName: "domainTable", - domain: "procedure_occurrence", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Device Exposures", - routeName: "domainTable", - domain: "device_exposure", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Death", - routeName: "death", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Unmapped Source Codes", - routeName: "unmappedSourceCodes", - }, - { - folder: "Data Source Release", - icon: "mdi-table", - name: "Temporal Characterization", - routeName: "temporalCharacterization", - }, - { - folder: "Data Source Release", - icon: "mdi-speedometer", - name: "Performance", - routeName: "performance", - }, - { - folder: "Data Source Release", - icon: "mdi-alpha-m-circle-outline", - name: "Metadata", - routeName: "metadata", - }, - { - folder: "Data Network", - icon: "mdi-table", - name: "Overview", - routeName: "overview", - }, - { - folder: "Data Network", - icon: "mdi-sigma-lower", - name: "Quality Assessment", - routeName: "networkDataQuality", - }, - { - folder: "Data Network", - icon: "mdi-chart-line", - name: "Population Overview", - routeName: "population", - }, - { - folder: "Data Network", - icon: "mdi-dna", - name: "Data Strand Report", - routeName: "dataStrandReport", - }, - { - folder: "Data Network", - icon: "mdi-table", - name: "Unmapped Source Codes", - routeName: "networkUnmappedSourceCodes", - }, -]; diff --git a/src/widgets/explorer/config/reports.ts b/src/widgets/explorer/config/reports.ts new file mode 100644 index 00000000..fc77db2b --- /dev/null +++ b/src/widgets/explorer/config/reports.ts @@ -0,0 +1,278 @@ +import { + mdiAlphaMCircleOutline, + mdiChartLine, + mdiChartTimeline, + mdiCheckNetwork, + mdiDatabaseSearch, + mdiDna, + mdiShape, + mdiHistory, + mdiSigmaLower, + mdiSpeedometer, + mdiTable, + mdiAccountGroupOutline, + mdiTextBoxMultipleOutline, + mdiAccountOutline, + mdiTestTube, + mdiTransitConnectionVariant, + mdiHeartOffOutline, + mdiPill, + mdiVirusOutline, + mdiEyeCircleOutline, + mdiHospitalBuilding, + mdiNeedle, + mdiHeartFlash, + mdiMapMarkerOutline, + mdiCompareHorizontal, +} from "@mdi/js"; + +export const reports = [ + { + folder: "Data Source Release", + icon: mdiSigmaLower, + name: "Data Quality", + routeName: "dataQuality", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiAccountOutline, + name: "Person", + routeName: "person", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiTable, + name: "Domains", + routeName: "domainTable", + domain: true, + reports: [ + { + folder: "Data Source Release", + icon: mdiVirusOutline, + name: "Conditions", + routeName: "domainTable", + domain: "condition_occurrence", + }, + { + folder: "Data Source Release", + icon: mdiVirusOutline, + name: "Condition Eras", + routeName: "domainTable", + domain: "condition_era", + }, + { + folder: "Data Source Release", + icon: mdiPill, + name: "Drugs", + routeName: "domainTable", + domain: "drug_exposure", + }, + { + folder: "Data Source Release", + icon: mdiPill, + name: "Drug Eras", + routeName: "domainTable", + domain: "drug_era", + }, + { + folder: "Data Source Release", + icon: mdiHospitalBuilding, + name: "Visit Occurrence", + routeName: "domainTable", + domain: "visit_occurrence", + }, + { + folder: "Data Source Release", + icon: mdiHospitalBuilding, + name: "Visit Detail", + routeName: "domainTable", + domain: "visit_detail", + }, + { + folder: "Data Source Release", + icon: mdiTestTube, + name: "Measurements", + routeName: "domainTable", + domain: "measurement", + }, + { + folder: "Data Source Release", + icon: mdiEyeCircleOutline, + name: "Observations", + routeName: "domainTable", + domain: "observation", + }, + { + folder: "Data Source Release", + icon: mdiNeedle, + name: "Procedures", + routeName: "domainTable", + domain: "procedure_occurrence", + }, + { + folder: "Data Source Release", + icon: mdiHeartFlash, + name: "Device Exposures", + routeName: "domainTable", + domain: "device_exposure", + }, + ], + }, + { + folder: "Data Source Release", + icon: mdiAccountGroupOutline, + name: "Cohorts", + routeName: "cohorts", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiChartLine, + name: "Data Density", + routeName: "dataDensity", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiEyeCircleOutline, + name: "Observation Period", + routeName: "observationPeriod", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiMapMarkerOutline, + name: "Location", + routeName: "location", + reports: [], + }, + { + folder: "Data Network", + icon: mdiCompareHorizontal, + name: "Network Comparison Tool", + routeName: "networkComparisonTool", + }, + { + folder: "Data Network", + icon: mdiDatabaseSearch, + name: "Data Source Feasibility", + routeName: "feasibility", + }, + { + folder: "Data Network", + icon: mdiCheckNetwork, + name: "Network Concept Report", + routeName: "networkConcept", + }, + { + folder: "Data Network", + icon: mdiDatabaseSearch, + name: "Network Concept Dashboard", + routeName: "networkConceptDashboard", + }, + { + folder: "Data Network", + icon: mdiDatabaseSearch, + name: "Web API", + routeName: "webApi", + webApiRequired: true, + }, + { + folder: "Data Network", + icon: mdiSpeedometer, + name: "Network Performance", + routeName: "networkPerformance", + }, + { + folder: "Data Source", + icon: mdiHistory, + name: "Data Quality History", + routeName: "dataQualityHistory", + }, + { + folder: "Data Source", + icon: mdiTable, + name: "Data Source Overview", + routeName: "dataSourceOverview", + }, + { + folder: "Data Source", + icon: mdiChartTimeline, + name: "Domain Continuity", + routeName: "domainContinuity", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiHeartOffOutline, + name: "Death", + routeName: "death", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiTransitConnectionVariant, + name: "Unmapped Source Codes", + routeName: "unmappedSourceCodes", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiAlphaMCircleOutline, + name: "Metadata", + routeName: "metadata", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiTextBoxMultipleOutline, + name: "Temporal Characterization", + routeName: "temporalCharacterization", + reports: [], + }, + { + folder: "Data Source Release", + icon: mdiSpeedometer, + name: "Performance", + routeName: "performance", + reports: [], + }, + { + folder: "Data Network", + icon: mdiTable, + name: "Overview", + routeName: "overview", + }, + { + folder: "Data Network", + icon: mdiSigmaLower, + name: "Quality Assessment", + routeName: "networkDataQuality", + }, + { + folder: "Data Network", + icon: mdiChartLine, + name: "Population Overview", + routeName: "population", + }, + { + folder: "Data Network", + icon: mdiShape, + name: "Network Diversity Report", + routeName: "networkDiversityReport", + }, + { + folder: "Data Network", + icon: mdiDna, + name: "Data Strand Report", + routeName: "dataStrandReport", + }, + { + folder: "Data Network", + icon: mdiTable, + name: "Unmapped Source Codes", + routeName: "networkUnmappedSourceCodes", + }, +]; diff --git a/src/widgets/explorer/index.js b/src/widgets/explorer/index.ts similarity index 76% rename from src/widgets/explorer/index.js rename to src/widgets/explorer/index.ts index a0159c54..2ce8b774 100644 --- a/src/widgets/explorer/index.js +++ b/src/widgets/explorer/index.ts @@ -1,5 +1,5 @@ import explorerStore from "@/widgets/explorer/model/store/explorer.module"; -import Explorer from "@/widgets/explorer/ui/Explorer"; +import Explorer from "@/widgets/explorer/ui/Explorer.vue"; import * as explorerActions from "./model/store/actions.type"; export { explorerStore, Explorer, explorerActions }; diff --git a/src/widgets/explorer/model/store/actions.type.js b/src/widgets/explorer/model/store/actions.type.ts similarity index 100% rename from src/widgets/explorer/model/store/actions.type.js rename to src/widgets/explorer/model/store/actions.type.ts diff --git a/src/widgets/explorer/model/store/explorer.module.js b/src/widgets/explorer/model/store/explorer.module.js deleted file mode 100644 index bf365ef0..00000000 --- a/src/widgets/explorer/model/store/explorer.module.js +++ /dev/null @@ -1,126 +0,0 @@ -import { - SOURCES, - EXPLORER_LOADED, - LOAD_QUERY_INDEX, -} from "@/widgets/explorer/model/store/mutations.type"; - -import { - FETCH_INDEX, - FETCH_QUERY_INDEX, -} from "@/widgets/explorer/model/store/actions.type"; -import { EXPORT_QUERY_INDEX, INDEX } from "@/shared/config/files"; -import loadFile from "@/shared/api/loadFile"; -import getFilePath from "@/shared/api/getFilePath"; -import config from "@/widgets/explorer/config"; -import { errorActions } from "@/widgets/error"; - -const state = { - folders: config.folders, - sources: null, - reports: config.reports, - queryIndex: null, - dataLoaded: false, -}; - -const getters = { - getQueryIndex: function (state) { - return state.queryIndex; - }, - getSources: function (state) { - return state.sources; - }, - explorerLoaded: function (state) { - return state.dataLoaded; - }, - getSelectedFolder: function (state, getters, rootState) { - return state.folders.find((folder) => - rootState.route.matched.some((route) => route.name === folder.key) - ); - }, - getFilteredReports: function (state, getters) { - return state.reports.filter( - (report) => report.folder === getters.getSelectedFolder.name - ); - }, - getSelectedSource: function (state, getters, rootState) { - return getters.getSources.find( - (source) => rootState.route.params.cdm === source.cdm_source_key - ); - }, - getReleases: function (state, getters) { - return getters.getSelectedSource.releases; - }, - getSelectedRelease: function (state, getters, rootState) { - return rootState.route.params.release - ? getters.getReleases.find( - (release) => rootState.route.params.release === release.release_id - ) - : getters.getReleases[0]; - }, - getSelectedReport: function (state, getters, rootState) { - return getters.getFilteredReports.find((report) => - report.domain - ? rootState.route.params.domain === report.domain - : rootState.route.matched.some( - (route) => route.name === report.routeName - ) - ); - }, -}; - -const actions = { - [FETCH_INDEX]({ commit, dispatch }, params) { - loadFile(getFilePath(params)[INDEX], { required: true }).then( - (response) => { - if ( - response.payload?.required && - response.response?.name === "AxiosError" - ) { - dispatch(errorActions.NEW_ERROR, { - message: response.response.message, - details: response.response.request.responseURL, - }); - return; - } - commit(SOURCES, response.response.data.sources); - commit(EXPLORER_LOADED); - } - ); - }, - [FETCH_QUERY_INDEX]({ commit, dispatch }, params) { - loadFile(getFilePath(params)[EXPORT_QUERY_INDEX], { required: false }).then( - (response) => { - if ( - response.payload?.required && - response.response?.name === "AxiosError" - ) { - dispatch(errorActions.NEW_ERROR, { - message: response.response.message, - details: response.response.request.responseURL, - }); - return; - } - commit(LOAD_QUERY_INDEX, response.response.data); - } - ); - }, -}; - -const mutations = { - [SOURCES](state, payload) { - state.sources = payload; - }, - [EXPLORER_LOADED](state) { - state.dataLoaded = true; - }, - [LOAD_QUERY_INDEX](state, payload) { - state.queryIndex = payload; - }, -}; - -export default { - state, - getters, - actions, - mutations, -}; diff --git a/src/widgets/explorer/model/store/explorer.module.ts b/src/widgets/explorer/model/store/explorer.module.ts new file mode 100644 index 00000000..6909af11 --- /dev/null +++ b/src/widgets/explorer/model/store/explorer.module.ts @@ -0,0 +1,145 @@ +import { + SOURCES, + EXPLORER_LOADED, + LOAD_QUERY_INDEX, +} from "@/widgets/explorer/model/store/mutations.type"; + +import { + FETCH_INDEX, + FETCH_QUERY_INDEX, +} from "@/widgets/explorer/model/store/actions.type"; +import { EXPORT_QUERY_INDEX, INDEX } from "@/shared/config/files"; +import apiService from "@/shared/api/axios/apiService"; +import getFilePath from "@/shared/api/axios/files"; +import config from "@/widgets/explorer/config"; +import { errorActions } from "@/widgets/error"; +import { QueryIndexType } from "@/processes/exploreReports/model/interfaces/files/QueryIndex"; +import { + Source, + SourceRelease, +} from "@/processes/exploreReports/model/interfaces/files/SourceIndex"; +import errorMessages from "@/widgets/error/model/config/errorMessages"; +import environment from "@/shared/api/environment"; + +const state = { + folders: config.folders, + sources: null, + reports: config.reports, + queryIndex: null, + dataLoaded: false, +}; + +const getters = { + getQueryIndex: function (state): QueryIndexType { + return state.queryIndex; + }, + getSources: function (state): Source[] { + return state.sources; + }, + explorerLoaded: function (state): boolean { + return state.dataLoaded; + }, + getSelectedFolder: function (state, getters, rootState) { + return state.folders.find((folder) => + rootState.route.matched.some((route) => route.name === folder.key) + ); + }, + getFilteredReports: function (state, getters, rootState) { + const webApiEnabled = environment.WEB_API_ENABLED; + return state.reports.filter((report) => { + const folderMatch = report.folder === getters.getSelectedFolder.name; + const webApiCondition = webApiEnabled || !report.webApiRequired; + return folderMatch && webApiCondition; + }); + }, + getSelectedSource: function (state, getters, rootState): Source { + return getters.getSources.find( + (source) => rootState.route.params.cdm === source.cdm_source_key + ); + }, + getReleases: function (state, getters): SourceRelease[] { + return getters.getSelectedSource.releases; + }, + getSelectedRelease: function (state, getters, rootState): SourceRelease { + return rootState.route.params.release + ? getters.getReleases.find( + (release) => rootState.route.params.release === release.release_id + ) + : getters.getReleases[0]; + }, + getSelectedReport: function (state, getters, rootState) { + const isDomain = rootState.route.params.domain; + const isRelease = rootState.route.params.release; + const isCohort = rootState.route.params.cohort_id; + if ( + isDomain && + isRelease && + rootState.route.name !== "networkComparisonTool" + ) { + const domainTable = getters.getFilteredReports.find( + (report) => report.domain + ); + return domainTable.reports.find((report) => { + return isDomain === report.domain; + }); + } + if (isCohort) { + return getters.getFilteredReports.find((report) => { + return report.routeName === "cohorts"; + }); + } else { + return getters.getFilteredReports.find((report) => { + return rootState.route.matched.some( + (route) => route.name === report.routeName + ); + }); + } + }, +}; + +const actions = { + [FETCH_INDEX]({ commit, dispatch }, params) { + return apiService(getFilePath(params)[INDEX], { required: true }) + .then((response) => { + commit(SOURCES, response.data.sources); + commit(EXPLORER_LOADED); + }) + .catch((error) => { + const errorMessage = errorMessages.reportsMissingFiles.index; + const url = error.config.url; + const errorCode = error.response.status; + + dispatch(errorActions.NEW_ERROR, { + userMessage: errorMessage, + technicalMessage: { errorCode, url }, + details: url, + }); + }); + }, + [FETCH_QUERY_INDEX]({ commit, dispatch }, params) { + return apiService(getFilePath(params)[EXPORT_QUERY_INDEX], { + required: false, + }).then((response) => { + commit(LOAD_QUERY_INDEX, response.data); + }); + }, +}; + +const mutations = { + [SOURCES](state, payload) { + state.sources = payload; + }, + [EXPLORER_LOADED](state) { + state.dataLoaded = true; + }, + [LOAD_QUERY_INDEX](state, payload) { + state.queryIndex = payload; + }, +}; + +export default { + state, + getters, + actions, + mutations, +}; diff --git a/src/widgets/explorer/model/store/mutations.type.js b/src/widgets/explorer/model/store/mutations.type.ts similarity index 100% rename from src/widgets/explorer/model/store/mutations.type.js rename to src/widgets/explorer/model/store/mutations.type.ts diff --git a/src/widgets/explorer/ui/Explorer.vue b/src/widgets/explorer/ui/Explorer.vue index 5789d2cd..1aa22f03 100644 --- a/src/widgets/explorer/ui/Explorer.vue +++ b/src/widgets/explorer/ui/Explorer.vue @@ -1,185 +1,221 @@