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
+
+
+
+
+ We're sorry but Ares doesn't work properly without JavaScript enabled.
+ Please enable it to continue.
+
+
+
+
+
+
+
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
-
-
-
-
- We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
- Please enable it to continue.
-
-
-
-
-
\ 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 @@
+
+
+
+
+ Loading...
+
+
+
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 @@
+
+
+
+
{{ props.note.title }}
+
+
+
+
+
+
+
{{ props.note.description }}
+
+
+
+
+
+
+
{{ slotProps.message.message }}
+
+
+
+
+
+
+
+
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 @@
+
+
+
+ {{ props.title }}
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+ {{ props.count }}
+
+
+
+
+
+
+
+
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 @@
-
- mdi-arrow-left
- Back
-
+
+
+ Back
+
-
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 @@
-
-
-
-
- mdi-view-column-outline
- Choose Columns to Display
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
-
-
-
-
-
-
- {{
- zeroBaseline ? "Zero Baseline" : "Non-zero baseline"
- }}
- Determines whether the axis starts from the 0 or the lowest value in
- the set
-
-
-
-
-
-
-
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 @@
-
-
-
-
-
-
- {{
- darkMode ? "Dark Mode" : "Light Mode"
- }}
- Select the Color mode
-
-
-
-
-
-
-
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 @@
-
-
-
-
-
-
- {{
- minMax ? "MIN/MAX" : "P10/P90"
- }}
- Applicable to some reports. Determines whether to use Min/Max or
- P10/P90 values for chart rendering
-
-
-
-
-
-
-
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 @@
-
-
-
- A data ingestion analysis of COVID-19 vaccine related source data.
-
- C.Blacketer, F.DeFalco
-
-
Background
- COVID-19 as a global pandemic is testing the ability of the world's
- researchers to understand the impact of the disease as well as the
- efficacy and safety of the vaccines intended to prevent its spread. Real
- world data is being leveraged to aid in the efforts to track post
- marketing safety surveillence. In order to fully understand the nature
- of the rapidly evolving methods for identifying the vaccine information
- in real world evidence this paper evaluates a network of observational
- data sources for data elements and their likely mappings to the eventual
- data standards that can be reliably leveraged to extract research
- quality evidence from real world data sources.
-
Methods
- Queries were developed to expose the internal mappings of source values
- to their standardized concepts and further to the manufacturer.
-
Results
-
-
-
-
-
-
-
+
+
+ A data ingestion analysis of COVID-19 vaccine related source data.
+
+
C.Blacketer, F.DeFalco
+
+
Background
+ COVID-19 as a global pandemic is testing the ability of the world's
+ researchers to understand the impact of the disease as well as the
+ efficacy and safety of the vaccines intended to prevent its spread. Real
+ world data is being leveraged to aid in the efforts to track post
+ marketing safety surveillence. In order to fully understand the nature of
+ the rapidly evolving methods for identifying the vaccine information in
+ real world evidence this paper evaluates a network of observational data
+ sources for data elements and their likely mappings to the eventual data
+ standards that can be reliably leveraged to extract research quality
+ evidence from real world data sources.
+
Methods
+ Queries were developed to expose the internal mappings of source values to
+ their standardized concepts and further to the manufacturer.
+
Results
+
+
+
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 @@
-
-
- A R E S
-
-
-
-
-
+
+
A R E S
+
+
A R esearch E xploration S ystem that facilitates
exploration of patient level, observational data research accompanied by
source data characterization and quality assessment ensuring that results
are presented with proper context.
-
-
-
-
- mdi-database Explore Data Sources
-
-
-
-
-
+
+
+
+ Explore Data Sources
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+ DATA SOURCES
+
+
+
+ Add at least one data source to display the results
+
+
+
+
+
+
+ SELECTED DATA SOURCES
+
+
+
+ removeSource({
+ source: source.source,
+ release: source.release,
+ })
+ "
+ removable
+ >{{ source.source }} {{ source.release }}
+
+
+
+
+ ADD A DATA SOURCE
+
+
+
+
+
+ ADD TO SELECTED DATA SOURCES
+
+
+ fetchMultiple(loadList)"
+ >LOAD SELECTED
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+ Add concepts
+
+
+
+
+
+
+
+
+
+
+ {{ helpers.formatComma(slotProps.data.PEOPLE_COUNT) }}
+
+
+
+
+ {{ slotProps.data.PEOPLE_PERCENT }}%
+
+
+
+
+ Add at least one concept to display the results
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
-
-
- {{ getData.metadata.conceptName }}
- NETWORK REPORT
-
-
-
-
-
- mdi-identifier
-
- Concept Identifier
-
-
- mdi-account-group
-
- Number of People in Network
-
-
-
-
-
-
-
- Measurement Value Distributions by Database and Unit
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+ Search concepts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No data available. Please select a concept.
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.X_CALENDAR_MONTH
+ ? slotProps.data.X_CALENDAR_MONTH
+ : "no data"
+ }}
+
+
+
+
+
+
+
+ {{
+ slotProps.data.Y_PREVALENCE_1000PP
+ ? helpers.formatComma(slotProps.data.Y_PREVALENCE_1000PP)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.MIN_VALUE
+ ? helpers.formatComma(slotProps.data.MIN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P10_VALUE
+ ? helpers.formatComma(slotProps.data.P10_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P25_VALUE
+ ? helpers.formatComma(slotProps.data.P25_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MEDIAN_VALUE
+ ? helpers.formatComma(slotProps.data.MEDIAN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P75_VALUE
+ ? helpers.formatComma(slotProps.data.P75_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P90_VALUE
+ ? helpers.formatComma(slotProps.data.P90_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MAX_VALUE
+ ? helpers.formatComma(slotProps.data.MAX_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.MIN_VALUE
+ ? helpers.formatComma(slotProps.data.MIN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P10_VALUE
+ ? helpers.formatComma(slotProps.data.P10_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P25_VALUE
+ ? helpers.formatComma(slotProps.data.P25_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MEDIAN_VALUE
+ ? helpers.formatComma(slotProps.data.MEDIAN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P75_VALUE
+ ? helpers.formatComma(slotProps.data.P75_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P90_VALUE
+ ? helpers.formatComma(slotProps.data.P90_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MAX_VALUE
+ ? helpers.formatComma(slotProps.data.MAX_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.MIN_VALUE
+ ? helpers.formatComma(slotProps.data.MIN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P10_VALUE
+ ? helpers.formatComma(slotProps.data.P10_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P25_VALUE
+ ? helpers.formatComma(slotProps.data.P25_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MEDIAN_VALUE
+ ? helpers.formatComma(slotProps.data.MEDIAN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P75_VALUE
+ ? helpers.formatComma(slotProps.data.P75_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P90_VALUE
+ ? helpers.formatComma(slotProps.data.P90_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MAX_VALUE
+ ? helpers.formatComma(slotProps.data.MAX_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.MIN_VALUE
+ ? helpers.formatComma(slotProps.data.MIN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P10_VALUE
+ ? helpers.formatComma(slotProps.data.P10_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P25_VALUE
+ ? helpers.formatComma(slotProps.data.P25_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MEDIAN_VALUE
+ ? helpers.formatComma(slotProps.data.MEDIAN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P75_VALUE
+ ? helpers.formatComma(slotProps.data.P75_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P90_VALUE
+ ? helpers.formatComma(slotProps.data.P90_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MAX_VALUE
+ ? helpers.formatComma(slotProps.data.MAX_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.MIN_VALUE
+ ? helpers.formatComma(slotProps.data.MIN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P10_VALUE
+ ? helpers.formatComma(slotProps.data.P10_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P25_VALUE
+ ? helpers.formatComma(slotProps.data.P25_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MEDIAN_VALUE
+ ? helpers.formatComma(slotProps.data.MEDIAN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P75_VALUE
+ ? helpers.formatComma(slotProps.data.P75_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P90_VALUE
+ ? helpers.formatComma(slotProps.data.P90_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MAX_VALUE
+ ? helpers.formatComma(slotProps.data.MAX_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.UNIT_COUNT
+ ? helpers.formatComma(slotProps.data.UNIT_COUNT)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MIN_VALUE
+ ? helpers.formatComma(slotProps.data.MIN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P10_VALUE
+ ? helpers.formatComma(slotProps.data.P10_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P25_VALUE
+ ? helpers.formatComma(slotProps.data.P25_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MEDIAN_VALUE
+ ? helpers.formatComma(slotProps.data.MEDIAN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P75_VALUE
+ ? helpers.formatComma(slotProps.data.P75_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P90_VALUE
+ ? helpers.formatComma(slotProps.data.P90_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MAX_VALUE
+ ? helpers.formatComma(slotProps.data.MAX_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.MIN_VALUE
+ ? helpers.formatComma(slotProps.data.MIN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P10_VALUE
+ ? helpers.formatComma(slotProps.data.P10_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P25_VALUE
+ ? helpers.formatComma(slotProps.data.P25_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MEDIAN_VALUE
+ ? helpers.formatComma(slotProps.data.MEDIAN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P75_VALUE
+ ? helpers.formatComma(slotProps.data.P75_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P90_VALUE
+ ? helpers.formatComma(slotProps.data.P90_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MAX_VALUE
+ ? helpers.formatComma(slotProps.data.MAX_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.MIN_VALUE
+ ? helpers.formatComma(slotProps.data.MIN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P10_VALUE
+ ? helpers.formatComma(slotProps.data.P10_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P25_VALUE
+ ? helpers.formatComma(slotProps.data.P25_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MEDIAN_VALUE
+ ? helpers.formatComma(slotProps.data.MEDIAN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P75_VALUE
+ ? helpers.formatComma(slotProps.data.P75_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P90_VALUE
+ ? helpers.formatComma(slotProps.data.P90_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MAX_VALUE
+ ? helpers.formatComma(slotProps.data.MAX_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
-
-
- {{
- item.condition_occurrence.data ? "Yes" : "No"
- }}
- {{
- item.drug_exposure.data ? "Yes" : "No"
- }} {{
- item.device_exposure.data ? "Yes" : "No"
- }}
- {{
- item.measurement.data ? "Yes" : "No"
- }}
- {{
- item.death.data ? "Yes" : "No"
- }}
- {{
- item.procedure_occurrence.data ? "Yes" : "No"
- }}
- {{
- item.observation_period.data ? "Yes" : "No"
- }}
-
-
-
- This section shows data availability for chosen domains.
-
-
-
-
-
-
-
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 @@
-
-
-
-
-
-
- {{
- (item.percentage * 100).toFixed(2)
- }}
- {{
- formatComma(item.population)
- }}
-
-
-
- This section uses pre-calculated data to display % of overlapping values
-
-
-
-
-
-
-
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 @@
-
-
-
- {{
- item.domain_percent.data
- ? (item.domain_percent.data * 100).toFixed(2)
- : "No data"
- }}
- {{
- item.observation_percent.data
- ? (item.observation_percent.data * 100).toFixed(2)
- : "No data"
- }}
- {{
- item.visit_types_percent.data
- ? (item.visit_types_percent.data * 100).toFixed(2)
- : "No data"
- }}
- {{
- item.concepts_percent.data
- ? (item.concepts_percent.data * 100).toFixed(2)
- : "No data"
- }}
- {{
- item.cumulative_duration_percent.data
- ? (item.cumulative_duration_percent.data * 100).toFixed(2)
- : "No data"
- }}
- {{
- item.population.data ? formatComma(item.population.data) : "No data"
- }}
- {{
- item.estimation ? formatComma(item.estimation.toFixed(2)) : "No data"
- }}
- {{
- item.population_age_percent.data
- ? (item.population_age_percent.data * 100).toFixed(2)
- : "No data"
- }}
- {{
- item.desired_domain_value.data ? "Present" : "No data"
- }}
-
-
-
- This section derives data from the sections above. The contents of the
- table depend on the sections used in calculations.
-
-
-
-
-
-
-
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 @@
-
-
-
- Age range
-
-
-
-
-
-
-
-
- Observation year range
-
-
-
-
-
-
-
-
- Minimum continuous observation
-
-
-
-
-
-
-
- {{
- !isNaN(item.population_observed)
- ? formatComma(item.population_observed)
- : "No data"
- }}
- {{
- item.population_age ? formatComma(item.population_age) : "No data"
- }}
- {{
- item.average_population_percentage
- ? (item.average_population_percentage * 100).toFixed(2)
- : "No data"
- }}
- {{
- item.continuous_duration
- ? (item.continuous_duration * 100).toFixed(2)
- : "No data"
- }}
- {{
- item.population_age_percent
- ? (item.population_age_percent * 100).toFixed(2)
- : "No data"
- }}
-
-
-
- The continuous duration column shows the lowest % of all values found in
- the range.
-
-
-
-
-
-
-
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 @@
-
-
-
-
-
-
-
-
-
- Add concept
-
-
-
-
-
- New Concept
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Cancel
-
- Save
-
-
-
-
-
-
- Are you sure you want to delete this item?
-
-
- Cancel
- OK
-
-
-
-
-
-
- {{
- formatComma(item.min_population) || "No data"
- }}
- {{
- formatComma(item.max_population) || "No data"
- }}
- {{
- `${item.concepts.length}/${conceptsCount}`
- }}
-
-
-
- {{
- item.time_series
- ? item.time_series[0] === false
- ? "Non-stationary"
- : "Stationary"
- : "No data"
- }}
- {{
- item.issues ? item.issues[0] : ""
- }}
- {{
- (item.percentage * 100).toFixed(2) || "No data"
- }}
- {{
- formatComma(item.population)
- }}
- {{
- !item.measurement
- ? isNaN(item.measurement)
- ? "No data"
- : "N/A"
- : item.measurement
- }}
-
-
-
-
- mdi-delete
-
-
- No concepts selected
-
-
-
-
- The overview section uses the smallest population count of all added
- concepts in estimations.
-
-
-
-
-
-
-
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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{
- item.percentage ? (item.percentage * 100).toFixed(2) : ""
- }}
-
-
-
-
-
- The table on the left lists all visit types found across available data
- sources. The table on the right lists all matching data sources displaying
- the lowest % of all chosen visit types.
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+ {{ slotProps.data.condition_occurrence.data ? "Yes" : "No" }}
+
+
+
+
+ {{ slotProps.data.drug_exposure.data ? "Yes" : "No" }}
+
+
+
+
+ {{ slotProps.data.device_exposure.data ? "Yes" : "No" }}
+
+
+
+
+ {{ slotProps.data.measurement.data ? "Yes" : "No" }}
+
+
+
+
+ {{ slotProps.data.death.data ? "Yes" : "No" }}
+
+
+
+
+ {{ slotProps.data.procedure_occurrence.data ? "Yes" : "No" }}
+
+
+
+
+ {{ slotProps.data.observation_period.data ? "Yes" : "No" }}
+
+
+
+
+
+
+ This section shows data availability for chosen domains.
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+ {{ formatComma(slotProps.data.population) }}
+
+
+
+
+ {{ (slotProps.data.percentage * 100).toFixed(2) }}
+
+
+
+
+
+ This section uses pre-calculated data to display % of overlapping values
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+ {{
+ slotProps.data.population.data
+ ? formatComma(slotProps.data.population.data)
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.domain_percent.data
+ ? (slotProps.data.domain_percent.data * 100).toFixed(2)
+ : "No data"
+ }}
+
+
+
+
+ {{ slotProps.data.desired_domain_value.data ? "Present" : "No data" }}
+
+
+
+
+ {{
+ slotProps.data.cumulative_duration_percent.data
+ ? (slotProps.data.cumulative_duration_percent.data * 100).toFixed(
+ 2
+ )
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.population_age_percent.data
+ ? (slotProps.data.population_age_percent.data * 100).toFixed(2)
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.observation_percent.data
+ ? (slotProps.data.observation_percent.data * 100).toFixed(2)
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.visit_types_percent.data
+ ? (slotProps.data.visit_types_percent.data * 100).toFixed(2)
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.concepts_percent.data
+ ? (slotProps.data.concepts_percent.data * 100).toFixed(2)
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.estimation
+ ? formatComma(slotProps.data.estimation.toFixed(2))
+ : "No data"
+ }}
+
+
+
+
+
+ This section derives data from the sections above. The contents of the
+ table depend on the sections used in calculations.
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
Observation year range
+
+
+
+
+
+
+
+
Minimum continuous observation
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.population_age
+ ? formatComma(slotProps.data.population_age)
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.population_age_percent
+ ? (slotProps.data.population_age_percent * 100).toFixed(2)
+ : "No data"
+ }}
+
+
+
+
+
+
+ {{
+ !isNaN(slotProps.data.population_observed)
+ ? formatComma(slotProps.data.population_observed)
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.average_population_percentage
+ ? (slotProps.data.average_population_percentage * 100).toFixed(
+ 2
+ )
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+ The continuous duration column shows the lowest % of all values found in
+ the range.
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+ Add concepts
+
+
+
+ save(item)"
+ @missing-concepts-changed="(item) => (missingConcepts = item)"
+ :show="dialog"
+ multi-selection
+ />
+
+
+
+
+
+
+ {{
+ `${slotProps.data.concepts.length}/${
+ addedConceptsCount + missingConcepts
+ }`
+ }}
+
+
+
+
+ {{ helpers.formatComma(slotProps.data.min_population) || "No data" }}
+
+
+
+
+ {{ helpers.formatComma(slotProps.data.max_population) || "No data" }}
+
+
+
+
+
+
+
+
+
+
+ {{ helpers.formatComma(slotProps.data.population) }}
+
+
+
+
+ {{ (slotProps.data.percentage * 100).toFixed(2) || "No data" }}
+
+
+
+
+ {{
+ slotProps.data.time_series
+ ? slotProps.data.time_series[0] === false
+ ? "Non-stationary"
+ : "Stationary"
+ : "No data"
+ }}
+
+
+
+
+ {{ slotProps.issues ? slotProps.data.issues[0] : "" }}
+
+
+
+
+ {{
+ !slotProps.data.measurement
+ ? isNaN(slotProps.data.measurement)
+ ? "No data"
+ : "N/A"
+ : slotProps.data.measurement
+ }}
+
+
+
+
+
+
+
+ The overview section uses the smallest population count of all added
+ concepts in estimations.
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.percentage
+ ? (slotProps.data.percentage * 100).toFixed(2)
+ : ""
+ }}
+
+
+
+
+
+
+ The table on the left lists all visit types found across available data
+ sources. The table on the right lists all matching data sources displaying
+ the lowest % of all chosen visit types.
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
-
- Domain Requirements
-
-
-
-
-
- Desired Domains
-
-
-
-
-
- Range requirements
-
-
-
-
-
- Visit types requirements
-
-
-
-
-
- Concepts requirements
-
-
-
-
-
- Data Source Feasibility Overview
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
+
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 @@
-
-
-
- Data Strands
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.count_records
+ ? helpers.formatComma(slotProps.data.count_records)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
-
- Data Network Overview
-
-
-
- Data Sources
-
- {{ getSources.length
- }}mdi-database
-
-
-
- People
-
- {{ personCountFormatter(countPeople)
- }}mdi-account
-
-
-
- Data Quality Issues
-
- {{ countDataQualityIssues
- }}mdi-database-alert
-
-
-
- Data Source Releases
-
- {{ countDataSourceReleases
- }}mdi-history
-
-
-
-
-
-
-
-
-
-
-
- Data Sources
-
-
-
- {{ formatComma(item.releases[0].count_person) }}
-
-
- {{ item.cdm_source_abbreviation }}
-
-
-
- {{ item.releases[0].obs_period_start }}
-
-
- {{ item.releases[0].obs_period_end }}
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
Data Sources
+
+
{{ store.getters.getSources.length }}
+
+
+
+
+
People
+
+
{{ personCountFormatter(countPeople) }}
+
+
+
+
+
Data Quality Issues
+
+
{{ countDataQualityIssues }}
+
+
+
+
+
Data Source Releases
+
+
{{ countDataSourceReleases }}
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ slotProps.data.cdm_source_name }}
+
+
+
+
+ {{ slotProps.data.releases[0].obs_period_start }}
+
+
+
+
+ {{ slotProps.data.releases[0].obs_period_end }}
+
+
+
+
+ {{ slotProps.data.releases[0].release_name }}
+
+
+
+
+ {{ slotProps.data.releases[0].vocabulary_version }}
+
+
+
+
+
+ {{ slotProps.data.releases[0].count_data_quality_issues }}
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.releases[0].count_person
+ ? helpers.formatComma(slotProps.data.releases[0].count_person)
+ : 0
+ }}
+
+
+
+
+ {{ slotProps.data.average_update_interval_days }}
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
- NETWORK POPULATION OVERVIEW
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.PERCENT_VALUE
+ ? helpers.formatPercent(slotProps.data.PERCENT_VALUE)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.PERCENT_PEOPLE
+ ? helpers.formatPercent(slotProps.data.PERCENT_PEOPLE)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
- Unmapped Source Codes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.CDM_TABLE_NAME }}
-
-
- {{ item.CDM_FIELD_NAME }}
-
-
- {{ item.SOURCE_VALUE }}
-
-
- {{ formatComma(item.RECORD_COUNT) }}
-
-
- {{ item.DATA_SOURCE_COUNT }}
-
-
- {{ item.DATA_SOURCES }}
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ slotProps.data.DATA_SOURCE_COUNT }}
+
+
+
+
+
+
+
+ {{
+ slotProps.data.RECORD_COUNT
+ ? helpers.formatComma(slotProps.data.RECORD_COUNT)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Columns to display
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.mean
+ ? `${(slotProps.data.mean * 100).toFixed(2)} %`
+ : "No data"
+ }}
+
+
+
+
+ {{ parseFloat(slotProps.data.sd).toFixed(2) }}
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Columns to display
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.subject_count
+ ? formatComma(slotProps.data.subject_count)
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.concept_count
+ ? formatComma(slotProps.data.concept_count)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.mean
+ ? parseFloat(slotProps.data.mean).toFixed(2)
+ : "No data"
+ }}
+
+
+
+
+ {{
+ slotProps.data.sd
+ ? parseFloat(slotProps.data.sd).toFixed(2)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ slotProps.data.cohort_id }}
+
+
+
+
+
+ {{ slotProps.data.cohort_name }}
+
+
+
+
+
+ {{
+ parseFloat(slotProps.data.cohort_subjects) &&
+ !isNaN(parseFloat(slotProps.data.cohort_subjects))
+ ? formatComma(slotProps.data.cohort_subjects)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
-
-
- {{ getData.conceptName }}
-
-
-
-
- mdi-identifier
-
- Concept Identifier
- mdi-account-group
-
- Number of People
- mdi-percent
-
- % of People
- mdi-table-row
-
- Records per Person
-
- mdi-database-check-outline
-
- % with Values
-
- mdi-database-alert
-
- Data Quality Issues
- mdi-clock-alert
- Non-Stationary Time Series
-
- Measurement Value Distributions
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+ Network Report
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+ No concepts found
+
+
+
+
+ {{
+ slotProps.data.MIN_VALUE
+ ? helpers.formatComma(slotProps.data.MIN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P10_VALUE
+ ? helpers.formatComma(slotProps.data.P10_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P25_VALUE
+ ? helpers.formatComma(slotProps.data.P25_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MEDIAN_VALUE
+ ? helpers.formatComma(slotProps.data.MEDIAN_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P75_VALUE
+ ? helpers.formatComma(slotProps.data.P75_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.P90_VALUE
+ ? helpers.formatComma(slotProps.data.P90_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.MAX_VALUE
+ ? helpers.formatComma(slotProps.data.MAX_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.UNIT_COUNT
+ ? helpers.formatComma(slotProps.data.UNIT_COUNT)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.X_CALENDAR_MONTH
+ ? slotProps.data.X_CALENDAR_MONTH
+ : "no data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
-
- Overview
- Metadata
- Results
- Pivot table
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{
- getData.derivedResults.Verification.Plausibility.Pass
- }}
-
-
- {{
- getData.derivedResults.Verification.Plausibility.Fail
- }}
-
-
- {{
- getData.derivedResults.Verification.Plausibility.Total
- }}
-
-
- {{ getData.derivedResults.Validation.Plausibility.Pass }}
-
-
- {{ getData.derivedResults.Validation.Plausibility.Fail }}
-
-
- {{ getData.derivedResults.Validation.Plausibility.Total }}
-
-
- {{ getData.derivedResults.Total.Plausibility.Pass }}
-
-
- {{ getData.derivedResults.Total.Plausibility.Fail }}
-
-
- {{ getData.derivedResults.Total.Plausibility.Total }}
-
-
-
-
-
- {{ getData.derivedResults.Verification.Conformance.Pass }}
-
-
- {{ getData.derivedResults.Verification.Conformance.Fail }}
-
-
- {{
- getData.derivedResults.Verification.Conformance.Total
- }}
-
-
- {{ getData.derivedResults.Validation.Conformance.Pass }}
-
-
- {{ getData.derivedResults.Validation.Conformance.Fail }}
-
-
- {{ getData.derivedResults.Validation.Conformance.Total }}
-
- {{ getData.derivedResults.Total.Conformance.Pass }}
-
- {{ getData.derivedResults.Total.Conformance.Fail }}
-
-
- {{ getData.derivedResults.Total.Conformance.Total }}
-
-
-
-
-
- {{
- getData.derivedResults.Verification.Completeness.Pass
- }}
-
-
- {{
- getData.derivedResults.Verification.Completeness.Fail
- }}
-
-
- {{
- getData.derivedResults.Verification.Completeness.Total
- }}
-
-
- {{ getData.derivedResults.Validation.Completeness.Pass }}
-
-
- {{ getData.derivedResults.Validation.Completeness.Fail }}
-
-
- {{ getData.derivedResults.Validation.Completeness.Total }}
-
-
- {{ getData.derivedResults.Total.Completeness.Pass }}
-
-
- {{ getData.derivedResults.Total.Completeness.Fail }}
-
-
- {{ getData.derivedResults.Total.Completeness.Total }}
-
-
-
-
-
- {{ getData.derivedResults.Verification.Total.Pass }}
-
-
- {{ getData.derivedResults.Verification.Total.Fail }}
-
-
- {{ getData.derivedResults.Verification.Total.Total }}
-
- {{ getData.derivedResults.Validation.Total.Pass }}
-
- {{ getData.derivedResults.Validation.Total.Fail }}
-
- {{ getData.derivedResults.Validation.Total.Total }}
- {{ getData.derivedResults.Total.Total.Pass }}
-
- {{ getData.derivedResults.Total.Total.Fail }}
-
- {{ getData.derivedResults.Total.Total.Total }}
-
-
-
-
-
-
-
-
-
- CDM Source Name
- {{ getData.cdmSourceName }}
-
-
- Description
- {{ getData.sourceDescription }}
-
-
- Licensee
- {{ getData.cdmHolder }}
-
-
- Source Released
- {{ getData.sourceReleaseDate }}
-
-
- CDM Released
- {{ getData.cdmReleaseDate }}
-
-
- CDM Version
- {{ getData.cdmVersion }}
-
-
- DQD Version
- {{ getData.dqdVersion }}
-
-
- Vocabulary Version
- {{ getData.vocabularyVersion }}
-
-
- Source Documentation
-
- {{ getData.sourceDocumentationReference }}
-
- mdi-open-in-new
-
-
-
-
- ETL Reference
-
- {{ getData.cdmEtlReference }}
-
- mdi-open-in-new
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- mdi-filter
- Helpful Filters
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- mdi-filter
-
-
-
-
-
-
-
-
-
-
- Check Name
- {{ item.CHECK_NAME }}
-
-
- Description
- {{ item.CHECK_DESCRIPTION }} (threshold
- {{ item.THRESHOLD_VALUE }}%)
-
-
- Threshold
- {{ item.THRESHOLD_VALUE }}
-
-
- Notes
- {{ item.NOTE_VALUE }}
-
-
- Level
- {{ item.CHECK_LEVEL }}
-
-
- Table
-
-
- {{ item.CDM_TABLE_NAME }}
- mdi-open-in-new
-
-
-
-
- Field
- {{ item.CDM_FIELD_NAME }}
-
-
- Concept Id
-
-
- {{ item.CONCEPT_ID }}
- mdi-open-in-new
-
-
-
-
- Unit Concept Id
- {{ item.UNIT_CONCEPT_ID }}
-
-
- # Rows Violated
- {{ item.NUM_VIOLATED_ROWS }}
-
-
- # Rows Total
- {{ item.NUM_DENOMINATOR_ROWS }}
-
-
- % Rows Violated
- {{ (item.PCT_VIOLATED_ROWS * 100).toFixed(2) }} %
-
-
- Execution Time
- {{ item.EXECUTION_TIME }}
-
-
- SQL Query
-
-
-
-
-
- Errors
- {{ item.ERROR }}
-
-
-
- {{
- item.SUBCATEGORY == undefined ? d.SUBCATEGORY : "None"
- }}
- {{
- renderDescription(item)
- }}
-
- {{ renderPercentPassed(item) }} %
-
-
-
- {{ formatComma(item.NUM_VIOLATED_ROWS) }}
-
-
-
-
- {{ formatComma(item.NUM_DENOMINATOR_ROWS) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+ CDM Source Name
+ {{ store.getters.getData.cdmSourceName }}
+
+
+ Description
+ {{ store.getters.getData.sourceDescription }}
+
+
+ Licensee
+ {{ store.getters.getData.cdmHolder }}
+
+
+ Source Released
+ {{ store.getters.getData.sourceReleaseDate }}
+
+
+ CDM Version
+ {{ store.getters.getData.cdmVersion }}
+
+
+ DQD Version
+ {{ store.getters.getData.dqdVersion }}
+
+
+ Vocabulary Version
+ {{ store.getters.getData.vocabularyVersion }}
+
+
+ Source Documentation
+
+
+ {{ store.getters.getData.sourceDocumentationReference }}
+
+
+
+
+
+
+
+
+ ETL Reference
+
+ {{ store.getters.getData.cdmEtlReference }}
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ store.getters.getData.derivedResults.Verification.Plausibility
+ .Pass
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Verification.Plausibility
+ .Fail
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Verification.Plausibility
+ .Total
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Validation.Plausibility.Pass
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Validation.Plausibility.Fail
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Validation.Plausibility.Total
+ }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Plausibility.Pass }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Plausibility.Fail }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Plausibility.Total }}
+
+
+
+
+
+ {{
+ store.getters.getData.derivedResults.Verification.Conformance.Pass
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Verification.Conformance.Fail
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Verification.Conformance
+ .Total
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Validation.Conformance.Pass
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Validation.Conformance.Fail
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Validation.Conformance.Total
+ }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Conformance.Pass }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Conformance.Fail }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Conformance.Total }}
+
+
+
+
+
+ {{
+ store.getters.getData.derivedResults.Verification.Completeness
+ .Pass
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Verification.Completeness
+ .Fail
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Verification.Completeness
+ .Total
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Validation.Completeness.Pass
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Validation.Completeness.Fail
+ }}
+
+
+ {{
+ store.getters.getData.derivedResults.Validation.Completeness.Total
+ }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Completeness.Pass }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Completeness.Fail }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Completeness.Total }}
+
+
+
+
+
+ {{ store.getters.getData.derivedResults.Verification.Total.Pass }}
+
+
+ {{ store.getters.getData.derivedResults.Verification.Total.Fail }}
+
+
+ {{ store.getters.getData.derivedResults.Verification.Total.Total }}
+
+
+ {{ store.getters.getData.derivedResults.Validation.Total.Pass }}
+
+
+ {{ store.getters.getData.derivedResults.Validation.Total.Fail }}
+
+
+ {{ store.getters.getData.derivedResults.Validation.Total.Total }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Total.Pass }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Total.Fail }}
+
+
+ {{ store.getters.getData.derivedResults.Total.Total.Total }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Columns to display
+
+
+
+
+
+
+
+
+ No matching rows
+
+
+ {{ data.failed }}
+
+
+
+
+
+
+
+
+ {{ data.cdmTableName }}
+
+
+
+
+
+ {{ slotProps.option }}
+
+
+
+
+
+
+ {{ data.cdmFieldName }}
+
+
+
+
+ {{ slotProps.option }}
+
+
+
+
+
+
+ {{ data.checkName }}
+
+
+
+
+ {{ slotProps.option }}
+
+
+
+
+
+
+ {{ data.category }}
+
+
+
+
+ {{ slotProps.option }}
+
+
+
+
+
+
+ {{ slotProps.data.subcategory ? slotProps.data.subcategory : "None" }}
+
+
+
+
+ {{ slotProps.option }}
+
+
+
+
+
+
+ {{ data.context }}
+
+
+
+
+ {{ slotProps.option }}
+
+
+
+
+
+
+
+
+ {{ slotProps.option }}
+
+
+
+
+
+
+
+
+ {{ slotProps.option }}
+
+
+
+
+
+
+ {{ renderDescription(slotProps.data) }}
+
+
+
+
+
+ {{ renderPercentPassed(slotProps.data) }} %
+
+
+
+
+
+ {{ helpers.formatComma(slotProps.data.numViolatedRows) }}
+
+
+
+
+
+ {{ helpers.formatComma(slotProps.data.numDenominatorRows) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ slotProps.option }}
+
+
+
+
+
+ {{ slotProps.data.delta }}
+
+
+ {{ slotProps.data.delta }}
+
+
+ {{ slotProps.data.delta }}
+
+
+ {{ slotProps.data.delta }}
+
+
+
+
+
+
+
+
+
+
+
+ Check Name
+
+
+ {{ slotProps.data.checkName }}
+
+
+
+ Description
+
+
+ {{ slotProps.data.checkDescription }} (threshold
+ {{ slotProps.data.thresholdValue }}%)
+
+
+
+
+ Threshold
+
+ {{ slotProps.data.thresholdValue }}
+
+
+
+ Notes
+
+ {{ slotProps.data.noteValue }}
+
+
+
+ Check Level
+
+ {{ slotProps.data.checkLevel }}
+
+
+
+ Table
+
+
+
+ {{ slotProps.data.cdmTableName }}
+
+
+
+
+
+
+
+ Field
+
+
+ {{ slotProps.data.cdmFieldName }}
+
+
+
+
+ Concept Id
+
+
+
+
+ {{ slotProps.data.conceptId }}
+
+
+
+
+
+
+ Unit Concept Id
+
+ {{ slotProps.data.UNIT_conceptId }}
+
+
+
+
+ # Rows Violated
+
+
+ {{ slotProps.data.numViolatedRows }}
+
+
+
+ # Rows Total
+
+ {{ slotProps.data.numDenominatorRows }}
+
+
+
+
+ % Rows Violated
+
+
+ {{ (slotProps.data.pctViolatedRows * 100).toFixed(2) }} %
+
+
+
+ Execution Time
+
+ {{ slotProps.data.executionTime }}
+
+
+
+ Errors
+
+ {{ slotProps.data.ERROR }}
+
+
+
+ SQL Query
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
- Death Report
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.records
+ ? helpers.formatComma(slotProps.data.records)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.records
+ ? helpers.formatComma(slotProps.data.records)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
-
-
-
- {{
- this.$route.params.domain.toUpperCase().replace("_", " ")
- }}
-
-
-
-
-
-
- mdi-database-alert
-
-
-
- Data quality issues were identified for this domain.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{
- item.CONCEPT_ID
- }}
-
-
-
-
- {{ item.CONCEPT_NAME }}
-
-
-
-
-
- {{ formatComma(item.NUM_PERSONS) }}
-
-
- {{ (item.PERCENT_PERSONS * 100).toFixed(2) }} %
-
-
- {{ item.RECORDS_PER_PERSON }}
-
-
- {{
- item.PERCENT_MISSING_VALUES
- ? `${((1 - item.PERCENT_MISSING_VALUES) * 100).toFixed(2)}%`
- : "No data"
- }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Columns to display
+
+
+
+
+
+
+
+
+
+
+ {{ slotProps.data.CONCEPT_ID }}
+
+
+
+
+
+ {{ slotProps.data.CONCEPT_NAME }}
+
+
+
+
+
+
+ {{ helpers.formatComma(slotProps.data.NUM_PERSONS) }}
+
+
+
+
+
+
+ {{
+ slotProps.data.DIFF_NUM_PERSONS
+ ? helpers.formatComma(slotProps.data.DIFF_NUM_PERSONS)
+ : "No data"
+ }}
+
+
+
+
+
+
+ {{ (slotProps.data.PERCENT_PERSONS * 100).toFixed(2) }} %
+
+
+
+
+
+
+ {{
+ slotProps.data.DIFF_PERCENT_PERSONS
+ ? helpers.formatComma(slotProps.data.DIFF_PERCENT_PERSONS)
+ : "No Data"
+ }}
+
+
+
+
+
+
+ {{ slotProps.data.RECORDS_PER_PERSON }}
+
+
+
+
+
+ {{
+ slotProps.data.DIFF_RECORDS_PER_PERSON
+ ? slotProps.data.DIFF_RECORDS_PER_PERSON
+ : "No data"
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.PERCENT_MISSING_VALUES
+ ? `${(
+ (1 - slotProps.data.PERCENT_MISSING_VALUES) *
+ 100
+ ).toFixed(2)} %`
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+ {{
+ parseInt(slotProps.data.COUNT_PERSONS) &&
+ !isNaN(parseInt(slotProps.data.COUNT_PERSONS))
+ ? formatComma(slotProps.data.COUNT_PERSONS)
+ : "No data"
+ }}
+
+
+
+
+ {{ (slotProps.data.PERCENT_PERSONS * 100).toFixed(2) }} %
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
- CDM Source Details
-
-
- {{ d }}: {{ getData.cdmsourceData[0][d] }}
-
-
-
-
-
-
- Metadata
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+ {{ d }} : {{ store.getters.getData.cdmsourceData[0][d] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
- Observation Period Report
-
-
-
-
-
- Observation Periods per Person
-
-
- {{ item.PERCENT_PEOPLE }}%
-
-
- {{ formatComma(item.COUNT_VALUE) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : "No data"
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.PERCENT_VALUE
+ ? helpers.formatPercent(slotProps.data.PERCENT_VALUE)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.PERCENT_PEOPLE
+ ? helpers.formatPercent(slotProps.data.PERCENT_PEOPLE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.DATE
+ ? slotProps.data.DATE.toLocaleDateString()
+ : "no data"
+ }}
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+ {{
+ slotProps.data.PERCENT_VALUE
+ ? helpers.formatPercent(slotProps.data.PERCENT_VALUE)
+ : 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+ {{ helpers.formatComma(slotProps.data.COUNT_VALUE) }}
+
+
+
+
+ {{ slotProps.data.PERCENT_PEOPLE }}%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseFloat(slotProps.data.executionTime).toFixed(2) }}
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
- Performance
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.analysis_id }}
-
-
- {{ item.elapsed_seconds }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
-
-
-
-
- Person Report
-
-
-
-
- mdi-account-group
-
- Number of People
-
-
-
- mdi-human-male-female
-
-
- Proportion by Sex
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_VALUE
+ ? helpers.formatComma(slotProps.data.COUNT_VALUE)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.COUNT_PERSON
+ ? helpers.formatComma(slotProps.data.COUNT_PERSON)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
- Temporal Characterization
-
-
-
-
-
-
-
-
- {{
- item.CONCEPT_ID
- }}
-
-
-
-
- {{ item.CONCEPT_NAME }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.CONCEPT_ID
+ }}
+
+
+
+
+ {{
+ slotProps.data.CONCEPT_NAME
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
- Unmapped Source Codes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ formatComma(item.RECORD_COUNT) }}
-
-
-
- mdi-help-circle
- This report identifies columns in tables within the CDM where values are
- mapped to 0 (unknown concept). It provides a listing of all unmapped
- source values to be reviewed for potential inclusion or remediation.
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.RECORD_COUNT
+ ? helpers.formatComma(slotProps.data.RECORD_COUNT)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
-
-
- {{ item.cdm_release_date }}
-
-
-
- {{ item.count_failed }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+ {{ slotProps.data.cdm_release_date }}
+
+
+
+
+
+
+
+
+ {{ slotProps.data.count_passed }}
+
+
+
+
+
+ {{
+ slotProps.data.count_failed
+ }}
+
+
+
+
+
+
+ {{ slotProps.data.count_total }}
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+ {{ slotProps.data.cdm_release_date }}
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.count_value
+ ? helpers.formatComma(slotProps.data.count_value)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+ {{ slotProps.data.cdm_release_date }}
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.count_value
+ ? helpers.formatComma(slotProps.data.count_value)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.count_records
+ ? helpers.formatComma(slotProps.data.count_records)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
- Data Source Release Comparison
-
-
- {{ getData.conceptName }}
-
-
-
- mdi-identifier
-
- Concept Identifier
- mdi-account-group
-
- Number of People in Network
-
-
-
-
-
-
-
-
-
-
-
-
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 @@
-
-
-
-
-
- Source Overview
-
-
-
- Releases
-
- {{ getReleasesCount
- }}mdi-history
-
-
-
-
- Average Days Between Releases
-
-
- {{ getDaysBetweenReleases.toFixed(0)
- }}mdi-clock-outline
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Release Listing
-
-
-
- {{ formatComma(item.count_person) }}
-
-
- {{
- formatComma(item.count_data_quality_issues)
- }}
-
-
-
-
- '
-
-
-
-
-
-
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.count_data_quality_issues
+ ? helpers.formatComma(
+ slotProps.data.count_data_quality_issues
+ )
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.count_person
+ ? helpers.formatComma(slotProps.data.count_person)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+ {{
+ helpers.formatComma(slotProps.data.count_person)
+ }}
+
+
+
+
+
+
+ {{
+ helpers.formatComma(slotProps.data.count_data_quality_issues)
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ slotProps.data.count_records
+ ? helpers.formatComma(slotProps.data.count_records)
+ : "No data"
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
- mdi-help-circle-outline
-
-
- mdi-database
-
-
-
-
-
- mdi-cog-outline
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
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 @@
-
-
{{ title }}
-
+
-
+
+
-
+
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 @@
+
+
+
+
+
+
+
+
+
+ Search
+
+
+
+
+
+ No data available
+
+
+
+
+
+
+
+
+ Status
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CLOSE
+
+
+
+
+
+
+
+
+
+
+
+
+ CANCEL
+ LOAD
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
- An error has occurred
-
-
- {{ error.message }} --
- { {{ error.details }} }
-
-
-
-
+
+
+
+
+
+
Something went wrong
+
+
+ {{ errors[0].userMessage }}
+
+
+
+
+
+
+
+
+
+ Submit the issue on
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Something went wrong
+
+
+ {{ error.userMessage }}
+
+
+
+
+
+
+
+
+ Path: {{ detail.url }} , Error code: {{ detail.errorCode }}
+
+
+
+ Message:
+ {{ errorDetails.technicalMessage.message }}
+
+
+
+
+
+
-
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 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
-
- {{ item.icon }} {{ item.name }}
+
+
+
+
{{ slotProps.option.name }}
+
-
-
-
-
-
-
-
-
-
-
+ Report category
-
- {{ item.icon }} {{ item.name }}
+
+
+
+
+
+ Source
+
+
+
+
+
+ Release
+
+
+
+
+
+
+
{{ slotProps.option.name }}
+
-
-
-
-
-
-
+
+ Report
+
+
+
+ Concept ID
+
+
+
+ Cohort ID
+
+
-
-
diff --git a/src/widgets/infoPanel/index.js b/src/widgets/infoPanel/index.js
deleted file mode 100644
index 2aac77e2..00000000
--- a/src/widgets/infoPanel/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import InfoPanel from "@/widgets/infoPanel/ui/InfoPanel";
-
-export default InfoPanel;
diff --git a/src/widgets/infoPanel/index.ts b/src/widgets/infoPanel/index.ts
new file mode 100644
index 00000000..c28bf107
--- /dev/null
+++ b/src/widgets/infoPanel/index.ts
@@ -0,0 +1,2 @@
+import InfoPanel from "./infoPanel.vue";
+export default InfoPanel;
diff --git a/src/widgets/infoPanel/infoPanel.vue b/src/widgets/infoPanel/infoPanel.vue
new file mode 100644
index 00000000..3a67988e
--- /dev/null
+++ b/src/widgets/infoPanel/infoPanel.vue
@@ -0,0 +1,212 @@
+
+
+
+
+
+
+
+
Concept Identifier
+
+
+
+
+
+
+
+
Number of People
+
+
+
+
+
+
+
+
Records per Person
+
+
+
+
+
+
+
% with Values
+
+
+
+
+
+
+
Records Per Person
+
+
+
+
+
+
+ Non-Stationary Time Series
+
+
+
+
+
+
+
+
+
+ Number of People in Network
+
+
+
+
+
+
+
+
diff --git a/src/widgets/infoPanel/ui/InfoPanel.vue b/src/widgets/infoPanel/ui/InfoPanel.vue
deleted file mode 100644
index dc2619e7..00000000
--- a/src/widgets/infoPanel/ui/InfoPanel.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
- {{ icon }}
- {{ details }}
-
- Click here to learn more
- mdi-open-in-new
- {{ details }}
- mdi-open-in-new
-
-
- Click here to learn more
- mdi-open-in-new
- {{ details }}
- mdi-open-in-new
-
-
-
-
-
-
-
-
-
diff --git a/src/widgets/notesPanel/index.ts b/src/widgets/notesPanel/index.ts
new file mode 100755
index 00000000..e69de29b
diff --git a/src/widgets/notesPanel/model/lib/helpers.ts b/src/widgets/notesPanel/model/lib/helpers.ts
new file mode 100644
index 00000000..53561b5d
--- /dev/null
+++ b/src/widgets/notesPanel/model/lib/helpers.ts
@@ -0,0 +1,117 @@
+export function mergeAndCompareByDate(obj1, obj2) {
+ const mergedObject = {};
+
+ // Merge obj1 into mergedObject
+ Object.keys(obj1).forEach((key) => {
+ if (obj2.hasOwnProperty(key)) {
+ const arr1 = obj1[key];
+ const arr2 = obj2[key];
+ mergedObject[key] = mergeArraysByDate(arr1, arr2);
+ } else {
+ mergedObject[key] = obj1[key];
+ }
+ });
+
+ // Merge obj2 into mergedObject
+ Object.keys(obj2).forEach((key) => {
+ if (!mergedObject.hasOwnProperty(key)) {
+ mergedObject[key] = obj2[key];
+ }
+ });
+
+ return mergedObject;
+}
+
+function mergeArraysByDate(arr1, arr2) {
+ const mergedArray = [...arr1];
+
+ arr2.forEach((obj2) => {
+ const existingObjIndex = arr1.findIndex((obj1) => obj1.id === obj2.id);
+
+ if (existingObjIndex === -1) {
+ mergedArray.push(obj2);
+ } else {
+ const date1 = new Date(mergedArray[existingObjIndex].metadata.updatedAt);
+ const date2 = new Date(obj2.metadata.updatedAt);
+
+ if (date2 > date1) {
+ mergedArray[existingObjIndex] = obj2;
+ }
+ }
+ });
+
+ return mergedArray;
+}
+
+export function mergeObjects(obj1, obj2, identifier = "id") {
+ if (typeof obj1 !== "object" || typeof obj2 !== "object") {
+ throw new Error("Both arguments must be objects");
+ }
+
+ const mergedObject = { ...obj1 };
+
+ for (const key in obj2) {
+ if (obj2.hasOwnProperty(key)) {
+ if (!mergedObject.hasOwnProperty(key)) {
+ mergedObject[key] = obj2[key];
+ } else if (Array.isArray(obj1[key]) && Array.isArray(obj2[key])) {
+ const mergedArray = mergeArraysOfObjects(
+ obj1[key],
+ obj2[key],
+ identifier
+ );
+ mergedObject[key] = mergedArray;
+ }
+ }
+ }
+
+ return mergedObject;
+}
+
+function mergeArraysOfObjects(arr1, arr2, identifier) {
+ const mergedArray = [];
+
+ const uniqueIds = new Set();
+
+ arr1.forEach((item1) => {
+ const matchingItem = arr2.find(
+ (item2) => item1[identifier] === item2[identifier]
+ );
+
+ if (matchingItem) {
+ const mergedItem = mergeObjects(item1, matchingItem, identifier);
+ mergedArray.push(mergedItem);
+ uniqueIds.add(item1[identifier]);
+ uniqueIds.add(matchingItem[identifier]);
+ } else if (!uniqueIds.has(item1[identifier])) {
+ mergedArray.push(item1);
+ uniqueIds.add(item1[identifier]);
+ }
+ });
+
+ arr2.forEach((item2) => {
+ if (!uniqueIds.has(item2[identifier])) {
+ mergedArray.push(item2);
+ uniqueIds.add(item2[identifier]);
+ }
+ });
+
+ return mergedArray;
+}
+
+export const createNestedProperty = (obj, path) => {
+ const newObj = { ...obj };
+ let currentObj = newObj;
+
+ for (let i = 0; i < path.length; i++) {
+ if (i + 1 !== path.length) {
+ currentObj[path[i]] = currentObj[path[i]] || {};
+ currentObj = currentObj[path[i]];
+ } else {
+ currentObj[path[i]] = currentObj[path[i]] || [];
+ currentObj = currentObj[path[i]];
+ }
+ }
+
+ return newObj;
+};
diff --git a/src/widgets/notesPanel/model/store/actions.type.ts b/src/widgets/notesPanel/model/store/actions.type.ts
new file mode 100755
index 00000000..3eb19c24
--- /dev/null
+++ b/src/widgets/notesPanel/model/store/actions.type.ts
@@ -0,0 +1,12 @@
+export const SHOW_DIALOG = "showDialog";
+export const LOAD_NOTES = "loadNotes";
+
+export const SHOW_DATUM_NOTES = "showDatumNotes";
+
+export const DELETE_SELECTION = "deleteSelection";
+
+export const EDIT_SELECTION = "editSelection";
+
+export const CREATE_SELECTION = "createSelection";
+
+export const EXPORT_NOTES = "exportNotes";
diff --git a/src/widgets/notesPanel/model/store/mutations.type.ts b/src/widgets/notesPanel/model/store/mutations.type.ts
new file mode 100755
index 00000000..ec126cd7
--- /dev/null
+++ b/src/widgets/notesPanel/model/store/mutations.type.ts
@@ -0,0 +1,4 @@
+export const SET_NOTES = "setNewNotes";
+
+export const SET_DIALOG = "setShowDialog";
+export const SET_SELECTED_RECTANGLE = "setSelectedRectangle";
diff --git a/src/widgets/notesPanel/model/store/notes.module.ts b/src/widgets/notesPanel/model/store/notes.module.ts
new file mode 100755
index 00000000..e29ce712
--- /dev/null
+++ b/src/widgets/notesPanel/model/store/notes.module.ts
@@ -0,0 +1,213 @@
+import localStorageService from "@/shared/api/localStorageService";
+import {
+ CREATE_SELECTION,
+ DELETE_SELECTION,
+ EDIT_SELECTION,
+ EXPORT_NOTES,
+ LOAD_NOTES,
+ SHOW_DATUM_NOTES,
+ SHOW_DIALOG,
+} from "@/widgets/notesPanel/model/store/actions.type";
+import _ from "lodash";
+import {
+ createNestedProperty,
+ mergeAndCompareByDate,
+ mergeObjects,
+} from "@/widgets/notesPanel/model/lib/helpers";
+
+import {
+ SET_NOTES,
+ SET_SELECTED_RECTANGLE,
+ SET_DIALOG,
+} from "@/widgets/notesPanel/model/store/mutations.type";
+import apiService from "@/shared/api/axios/apiService";
+import getFilePath from "@/shared/api/axios/files";
+import { NOTES } from "@/shared/config/files";
+import JSZip from "jszip";
+import { saveAs } from "file-saver";
+
+const state = {
+ notes: {},
+ dialog: { show: false, data: {}, action: null, coordinates: null },
+ selectedRectangle: null,
+};
+
+const getters = {
+ getNotes: function (state) {
+ return state.notes;
+ },
+ getDialogData: function (state) {
+ return state.dialog;
+ },
+ getSelectedRectangle: function (state) {
+ return state.selectedRectangle;
+ },
+};
+
+const actions = {
+ async [LOAD_NOTES]({ commit, rootGetters }) {
+ const sources = [...rootGetters.getSources, { cdm_source_key: undefined }];
+ await Promise.allSettled(
+ sources.map((source) =>
+ apiService(
+ {
+ url: getFilePath({
+ cdm: source.cdm_source_key,
+ })[NOTES],
+ method: "get",
+ },
+ { source }
+ )
+ )
+ ).then((responses) => {
+ const loadedData = responses.reduce((object, response) => {
+ if (response.status === "fulfilled") {
+ return mergeObjects(object, response.value.data, "id");
+ }
+ return object;
+ }, {});
+ const notes = localStorageService.get("notes")
+ ? mergeAndCompareByDate(localStorageService.get("notes"), loadedData)
+ : loadedData;
+
+ commit(SET_NOTES, { data: notes });
+ localStorageService.set("notes", notes);
+ });
+ },
+
+ [EXPORT_NOTES]({ getters }) {
+ const allNotes = getters.getNotes;
+ const zip = new JSZip();
+ const sources = {};
+ const network = {};
+ for (const report in allNotes) {
+ allNotes[report].forEach((annotation) => {
+ const annotationSource = annotation.metadata.scope.value.source;
+ if (annotationSource) {
+ annotationSource.forEach((source) => {
+ sources[source] = sources[source]
+ ? {
+ ...sources[source],
+ [report]: sources[source][report]
+ ? [...sources[source][report], annotation]
+ : [annotation],
+ }
+ : { [report]: [annotation] };
+ });
+ } else {
+ network[report] = network[report]
+ ? [...network[report], annotation]
+ : [annotation];
+ }
+ });
+ }
+ for (const source in sources) {
+ const sourceContainer = new Blob([JSON.stringify(sources[source])], {
+ type: "application/json",
+ });
+ zip.folder(source).file("notes.json", sourceContainer);
+ }
+ const networkContainer = new Blob([JSON.stringify(network)], {
+ type: "application/json",
+ });
+ zip.folder("network").file("notes.json", networkContainer);
+
+ zip
+ .generateAsync({
+ type: "blob",
+ compression: "DEFLATE",
+ compressionOptions: {
+ level: 6,
+ },
+ })
+ .then(function (content) {
+ // see FileSaver.js
+ saveAs(content, "notes.zip");
+ });
+ },
+
+ [CREATE_SELECTION]({ commit, getters, rootState }, params) {
+ const chartName = params.reportName;
+
+ let data = { ...getters.getNotes };
+ const path = [chartName].filter(Boolean);
+ data = createNestedProperty(data, path);
+ _.get(data, path.join(".")).push(params.selection);
+ commit(SET_NOTES, { data });
+ commit(SET_SELECTED_RECTANGLE, null);
+ localStorageService.set("notes", getters.getNotes);
+ },
+
+ [EDIT_SELECTION]({ commit, state, getters, rootState }, params) {
+ const chartName = getters.getSelectedRectangle?.report || params.report;
+ const selectionId =
+ getters.getSelectedRectangle?.item?.id || params.data.id;
+
+ const data = _.cloneDeep(state.notes);
+ const path = [chartName].filter(Boolean);
+ const selections = [..._.get(data, path.join("."))];
+ let newSelections = [];
+ const selectionIndex = selections.findIndex(
+ (selection) => selection.id === selectionId
+ );
+ if (selectionIndex !== -1) {
+ newSelections = selections.map((selection, index) => {
+ if (index === selectionIndex) {
+ return params.data;
+ } else {
+ return selection;
+ }
+ });
+ }
+ _.set(data, path.join("."), newSelections);
+ commit(SET_SELECTED_RECTANGLE, null);
+ commit(SET_NOTES, { data });
+ localStorageService.set("notes", state.notes);
+ },
+
+ [DELETE_SELECTION]({ commit, getters, rootState }) {
+ const chartName = getters.getSelectedRectangle.report;
+ const selectionId = getters.getSelectedRectangle.item.id;
+
+ const data = { ...getters.getNotes };
+ const path = [chartName].filter(Boolean);
+ const selections = _.get(data, path.join(".")).filter(
+ (selection) => selection.id !== selectionId
+ );
+
+ _.set(data, path.join("."), selections);
+ commit(SET_SELECTED_RECTANGLE, null);
+ commit(SET_NOTES, { data });
+ localStorageService.set("notes", getters.getNotes);
+ },
+ [SHOW_DIALOG]({ commit }, params) {
+ commit(SET_DIALOG, {
+ show: params.show,
+ data: params.data,
+ coordinates: params.coordinates,
+ action: params.action,
+ });
+ },
+ [SHOW_DATUM_NOTES]({ commit }) {
+ commit(SET_SELECTED_RECTANGLE, null);
+ },
+};
+
+const mutations = {
+ [SET_NOTES](state, payload) {
+ state.notes = payload.data;
+ },
+ [SET_DIALOG](state, payload) {
+ state.dialog = payload;
+ },
+ [SET_SELECTED_RECTANGLE](state, payload) {
+ state.selectedRectangle = payload;
+ },
+};
+
+export default {
+ state,
+ getters,
+ actions,
+ mutations,
+};
diff --git a/src/widgets/notesPanel/ui/NotesPanel.vue b/src/widgets/notesPanel/ui/NotesPanel.vue
new file mode 100755
index 00000000..aff59010
--- /dev/null
+++ b/src/widgets/notesPanel/ui/NotesPanel.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/widgets/pivot/index.js b/src/widgets/pivot/index.js
deleted file mode 100644
index 9c88f547..00000000
--- a/src/widgets/pivot/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import Pivot from "@/widgets/pivot/ui/Pivot";
-
-export default Pivot;
diff --git a/src/widgets/pivot/index.ts b/src/widgets/pivot/index.ts
new file mode 100644
index 00000000..689a4c46
--- /dev/null
+++ b/src/widgets/pivot/index.ts
@@ -0,0 +1,3 @@
+import Pivot from "@/widgets/pivot/ui/Pivot.vue";
+
+export default Pivot;
diff --git a/src/widgets/pivot/ui/Pivot.vue b/src/widgets/pivot/ui/Pivot.vue
index 383c5f40..74ebd487 100644
--- a/src/widgets/pivot/ui/Pivot.vue
+++ b/src/widgets/pivot/ui/Pivot.vue
@@ -1,332 +1,391 @@
-
-
-
-
- mdi-table
- Table
-
-
- mdi-database-cog
- Result manipulation
-
+
+
+
+
+
+
+
+ Table
+
+
+
+
+
+ Row Attributes
+
+
+
+
-
-
-
-
-
-
- mdi-plus-box filter
-
-
-
-
-
- {{ item }}
-
-
- mdi-close
-
-
-
-
- Select attributes to display
-
-
-
-
-
-
-
- mdi-plus-box
-
-
-
-
-
-
- {{ item }}
-
-
- mdi-close
-
-
+
+
+
+
{{ element }}
+
+
+
+
+
+
+
+
+ Select attributes to display
+
+
-
- Select attributes to display
-
-
-
-
-
-
-
-
-
-
+
+
+
+
- {{ item }} ({{
- selectedFilterValues[item]
- ? Object.keys(selectedFilterValues[item]).length
- : 0
- }})
-
-
+ Column Attributes
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
{{ element }}
+
+
+
+
+
+
+
+
+ Select attributes to display
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ Settings
+
+
+
+
+
+
+
+
+ {{ aggregateValue[0] }}
+
+
+
+
+
+
- Choose at least one attribute to display the results
+
+
+
+
-
-
-
+
+
+
+
+ Choose at least one attribute to display the results
+
+
+
+
-
-
diff --git a/src/widgets/pivot/ui/vue-pivottable.css b/src/widgets/pivot/ui/vue-pivottable.scss
similarity index 95%
rename from src/widgets/pivot/ui/vue-pivottable.css
rename to src/widgets/pivot/ui/vue-pivottable.scss
index 967e4819..c86e89c6 100644
--- a/src/widgets/pivot/ui/vue-pivottable.css
+++ b/src/widgets/pivot/ui/vue-pivottable.scss
@@ -1,14 +1,15 @@
-* {
- box-sizing: border-box;
- font-family: inherit;
- font-weight: normal;
-}
+/** {*/
+/* box-sizing: border-box;*/
+/* font-family: inherit;*/
+/* font-weight: normal;*/
+/*}*/
.pvtUi {
table-layout: fixed;
width: 100%;
- border-collapse: collapse;
+ border-collapse: separate;
+ border-spacing: 2px;
}
.pvtUi select {
user-select: none;
@@ -31,13 +32,14 @@
table.pvtTable {
text-align: left;
border-spacing: 2px;
+ border-collapse: separate;
width: 100%;
}
table.pvtTable thead tr th,
table.pvtTable tbody tr th {
- background-color: var(--v-accent-base);
+ @apply bg-surface-200 dark:bg-surface-700 #{!important};
padding: 5px;
}
@@ -50,8 +52,7 @@ table.pvtTable .pvtTotalLabel {
table.pvtTable tbody tr td {
padding: 3px;
- background-color: var(--v-base);
- border: 1px solid var(--v-accent-base);
+ border: 1px solid rgb(140, 140, 140);
vertical-align: top;
text-align: right;
text-decoration: underline;
@@ -332,4 +333,4 @@ table.pvtTable tbody tr td {
.pvtRendererArea {
width: 50%;
padding: 5px;
-}
\ No newline at end of file
+}
diff --git a/src/widgets/selectionEditDialog/lib/lib.ts b/src/widgets/selectionEditDialog/lib/lib.ts
new file mode 100644
index 00000000..3f98c70a
--- /dev/null
+++ b/src/widgets/selectionEditDialog/lib/lib.ts
@@ -0,0 +1,29 @@
+import { v4 as uuid } from "uuid";
+
+export function createSelection(coordinates, params) {
+ return {
+ coordinates: {
+ x1Axis: coordinates?.x1Axis,
+ x2Axis: coordinates?.x2Axis,
+ y1Axis: coordinates?.y1Axis,
+ y2Axis: coordinates?.y2Axis,
+ width: coordinates?.width,
+ height: coordinates?.height,
+ },
+ metadata: {
+ createdBy: params.metadata.createdBy,
+ createdAt: params.metadata.createdAt || Date.now(),
+ updatedAt: Date.now(),
+ scope: {
+ type: params.metadata.scope.type,
+ value: params.metadata.scope.value,
+ },
+ },
+ body: {
+ title: params.body.title,
+ description: params.body.description,
+ notes: params.body.notes,
+ },
+ id: params.id || uuid(),
+ };
+}
diff --git a/src/widgets/selectionEditDialog/ui/selectionEditDialog.vue b/src/widgets/selectionEditDialog/ui/selectionEditDialog.vue
new file mode 100755
index 00000000..ee7e2529
--- /dev/null
+++ b/src/widgets/selectionEditDialog/ui/selectionEditDialog.vue
@@ -0,0 +1,303 @@
+
+
+
+
+
+
+
Selection
+
+
+
+
+
Scope
+
+
+
+
+
+
+
+
Notes
+
+
+
+
+ Add new note
+
+
+
+
+
+
+
+
+
+
+ CANCEL
+ SAVE
+
+
+
+
+
+
+
+
diff --git a/src/widgets/settings/index.js b/src/widgets/settings/index.ts
similarity index 76%
rename from src/widgets/settings/index.js
rename to src/widgets/settings/index.ts
index c5ebae93..c86fae0d 100644
--- a/src/widgets/settings/index.js
+++ b/src/widgets/settings/index.ts
@@ -1,4 +1,4 @@
-import Settings from "@/widgets/settings/ui/Settings";
+import Settings from "@/widgets/settings/ui/Settings.vue";
import settingsStore from "@/widgets/settings/model/store/settings.module";
import * as settingsActions from "./model/store/actions.type";
diff --git a/src/widgets/settings/model/store/actions.type.js b/src/widgets/settings/model/store/actions.type.js
deleted file mode 100644
index 4c438a9a..00000000
--- a/src/widgets/settings/model/store/actions.type.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export const LOAD_SETTINGS_FROM_STORAGE = "loadSettingsFromStorage";
-export const CHANGE_THEME_SETTING = "setDarkMode";
-export const CHANGE_BASELINE_SETTING = "setBaseline";
-export const CHANGE_MINMAX_SETTING = "setMinMax";
-export const CHANGE_UI_VISIBILITY = "setVisibility";
diff --git a/src/widgets/settings/model/store/actions.type.ts b/src/widgets/settings/model/store/actions.type.ts
new file mode 100644
index 00000000..80618cae
--- /dev/null
+++ b/src/widgets/settings/model/store/actions.type.ts
@@ -0,0 +1,11 @@
+export const LOAD_SETTINGS_FROM_STORAGE = "loadSettingsFromStorage";
+export const TOGGLE_THEME_SETTING = "setTheme";
+export const TOGGLE_DARK_MODE = "toggleDarkMode";
+export const TOGGLE_BASELINE_SETTING = "setBaseline";
+export const TOGGLE_MINMAX_SETTING = "setMinMax";
+export const TOGGLE_UI_VISIBILITY = "setVisibility";
+export const TOGGLE_DEFAULT_ANNOTATIONS_MODE = "changeDefaultAnnotationsMode";
+export const TOGGLE_DEFAULT_ALL_NOTES_MODE = "toggleDefaultNotesMode";
+export const EDIT_USER = "editUser";
+export const UPDATE_COLUMN_SELECTION = "updateColumnSelection";
+export const TOGGLE_STICKY_NAV_BAR = "toggleStickyNavBar";
diff --git a/src/widgets/settings/model/store/mutations.type.js b/src/widgets/settings/model/store/mutations.type.js
deleted file mode 100644
index 14ef15b9..00000000
--- a/src/widgets/settings/model/store/mutations.type.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export const SET_DARK_MODE = "setDarkMode";
-export const SET_BASELINE = "setBaseline";
-export const SET_SETTINGS = "setSettings";
-export const SET_MINMAX = "setMinMax";
-export const SET_VISIBILITY = "setVisibility";
diff --git a/src/widgets/settings/model/store/mutations.type.ts b/src/widgets/settings/model/store/mutations.type.ts
new file mode 100644
index 00000000..0e0ef49b
--- /dev/null
+++ b/src/widgets/settings/model/store/mutations.type.ts
@@ -0,0 +1,2 @@
+export const SET_SETTINGS = "setSettings";
+export const SET_VISIBILITY = "setVisibility";
diff --git a/src/widgets/settings/model/store/settings.module.js b/src/widgets/settings/model/store/settings.module.js
deleted file mode 100644
index 1b1f6b05..00000000
--- a/src/widgets/settings/model/store/settings.module.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import localStorageService from "@/shared/api/localStorageService";
-import {
- LOAD_SETTINGS_FROM_STORAGE,
- CHANGE_BASELINE_SETTING,
- CHANGE_MINMAX_SETTING,
- CHANGE_THEME_SETTING,
- CHANGE_UI_VISIBILITY,
-} from "@/widgets/settings/model/store/actions.type";
-import {
- SET_BASELINE,
- SET_DARK_MODE,
- SET_MINMAX,
- SET_SETTINGS,
- SET_VISIBILITY,
-} from "@/widgets/settings/model/store/mutations.type";
-
-const state = {
- settings: {
- darkMode: false,
- zeroBaseline: true,
- minMax: false,
- },
- visible: false,
-};
-
-const getters = {
- getSettings: function (state) {
- return state.settings;
- },
- getVisibility: function (state) {
- return state.visible;
- },
-};
-
-const actions = {
- [LOAD_SETTINGS_FROM_STORAGE]({ commit }) {
- if (localStorageService.get("settings")) {
- commit(SET_SETTINGS, localStorageService.get("settings"));
- }
- },
- [CHANGE_BASELINE_SETTING]({ commit }, payload) {
- commit(SET_BASELINE, payload);
- },
- [CHANGE_THEME_SETTING]({ commit }, payload) {
- commit(SET_DARK_MODE, payload);
- },
- [CHANGE_MINMAX_SETTING]({ commit }, payload) {
- commit(SET_MINMAX, payload);
- },
- [CHANGE_UI_VISIBILITY]({ commit }, payload) {
- commit(SET_VISIBILITY, payload);
- },
-};
-
-const mutations = {
- [SET_DARK_MODE](state, payload) {
- state.settings.darkMode = payload;
- localStorageService.set("settings", state.settings);
- },
- [SET_BASELINE](state, payload) {
- state.settings.zeroBaseline = payload;
- localStorageService.set("settings", state.settings);
- },
- [SET_MINMAX](state, payload) {
- state.settings.minMax = payload;
- localStorageService.set("settings", state.settings);
- },
- [SET_SETTINGS](state, payload) {
- state.settings = payload;
- },
- [SET_VISIBILITY](state, payload) {
- state.visible = payload;
- },
-};
-
-export default {
- state,
- getters,
- actions,
- mutations,
-};
diff --git a/src/widgets/settings/model/store/settings.module.ts b/src/widgets/settings/model/store/settings.module.ts
new file mode 100644
index 00000000..9b6e69fe
--- /dev/null
+++ b/src/widgets/settings/model/store/settings.module.ts
@@ -0,0 +1,104 @@
+import localStorageService from "@/shared/api/localStorageService";
+import {
+ LOAD_SETTINGS_FROM_STORAGE,
+ TOGGLE_DARK_MODE,
+ TOGGLE_THEME_SETTING,
+ TOGGLE_MINMAX_SETTING,
+ TOGGLE_UI_VISIBILITY,
+ TOGGLE_DEFAULT_ANNOTATIONS_MODE,
+ TOGGLE_BASELINE_SETTING,
+ EDIT_USER,
+ TOGGLE_DEFAULT_ALL_NOTES_MODE,
+ UPDATE_COLUMN_SELECTION,
+ TOGGLE_STICKY_NAV_BAR,
+} from "@/widgets/settings/model/store/actions.type";
+import {
+ SET_SETTINGS,
+ SET_VISIBILITY,
+} from "@/widgets/settings/model/store/mutations.type";
+
+const state = {
+ settings: {
+ darkMode: false,
+ zeroBaseline: true,
+ minMax: false,
+ theme: "blue",
+ annotationsMode: false,
+ notesMode: false,
+ user: null,
+ columnSelection: {},
+ stickyNavBar: true,
+ },
+ visible: false,
+};
+
+const getters = {
+ getSettings: function (state) {
+ return state.settings;
+ },
+ getVisibility: function (state): boolean {
+ return state.visible;
+ },
+};
+
+const actions = {
+ [LOAD_SETTINGS_FROM_STORAGE]({ commit }) {
+ if (localStorageService.get("settings")) {
+ commit(SET_SETTINGS, { data: localStorageService.get("settings") });
+ }
+ },
+ [TOGGLE_BASELINE_SETTING]({ commit }, payload) {
+ commit(SET_SETTINGS, { data: payload, field: "zeroBaseline" });
+ },
+ [TOGGLE_DARK_MODE]({ commit }, payload) {
+ commit(SET_SETTINGS, { data: payload, field: "darkMode" });
+ },
+ [TOGGLE_THEME_SETTING]({ commit }, payload) {
+ commit(SET_SETTINGS, { data: payload, field: "theme" });
+ },
+ [TOGGLE_MINMAX_SETTING]({ commit }, payload) {
+ commit(SET_SETTINGS, { data: payload, field: "minMax" });
+ },
+ [TOGGLE_UI_VISIBILITY]({ commit }, payload) {
+ commit(SET_VISIBILITY, payload);
+ },
+ [TOGGLE_DEFAULT_ANNOTATIONS_MODE]({ commit }, payload) {
+ commit(SET_SETTINGS, { data: payload, field: "annotationsMode" });
+ },
+ [TOGGLE_DEFAULT_ALL_NOTES_MODE]({ commit }, payload) {
+ commit(SET_SETTINGS, { data: payload, field: "notesMode" });
+ },
+ [TOGGLE_STICKY_NAV_BAR]({ commit }, payload) {
+ commit(SET_SETTINGS, { data: payload, field: "stickyNavBar" });
+ },
+ [UPDATE_COLUMN_SELECTION]({ commit, rootGetters }, payload) {
+ commit(SET_SETTINGS, {
+ data: { ...rootGetters.getSettings.columnSelection, ...payload },
+ field: "columnSelection",
+ });
+ },
+ [EDIT_USER]({ commit }, payload) {
+ commit(SET_SETTINGS, { data: payload, field: "user" });
+ },
+};
+
+const mutations = {
+ [SET_SETTINGS](state, payload) {
+ if (payload.field) {
+ state.settings = { ...state.settings, [payload.field]: payload.data };
+ } else {
+ state.settings = payload.data;
+ }
+ localStorageService.set("settings", state.settings);
+ },
+ [SET_VISIBILITY](state, payload) {
+ state.visible = payload;
+ },
+};
+
+export default {
+ state,
+ getters,
+ actions,
+ mutations,
+};
diff --git a/src/widgets/settings/ui/Settings.vue b/src/widgets/settings/ui/Settings.vue
old mode 100644
new mode 100755
index b6ed05cc..1ade2f4a
--- a/src/widgets/settings/ui/Settings.vue
+++ b/src/widgets/settings/ui/Settings.vue
@@ -1,53 +1,78 @@
-
-
-
-
-
- mdi-close
-
- Settings
-
-
-
- Charts
-
+
+
+
+
Settings
+
+
+
+
+
+
+
Charts
-
-
-
- General
-
+
+
+
+
+
Appearance
-
-
-
-
-
+
+
+
-
+
+
diff --git a/src/widgets/settings/ui/components/exportNotes/ExportNotes.vue b/src/widgets/settings/ui/components/exportNotes/ExportNotes.vue
new file mode 100755
index 00000000..bf8e089e
--- /dev/null
+++ b/src/widgets/settings/ui/components/exportNotes/ExportNotes.vue
@@ -0,0 +1,19 @@
+
+
+ Export Notes
+
+
+
+
+
+
diff --git a/src/widgets/settings/ui/components/stickyNavBar/StickyNavBar.vue b/src/widgets/settings/ui/components/stickyNavBar/StickyNavBar.vue
new file mode 100644
index 00000000..15ba3ea1
--- /dev/null
+++ b/src/widgets/settings/ui/components/stickyNavBar/StickyNavBar.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
Sticky navigation bar
+
+ Keep the navigation bar fixed at the top while scrolling
+
+
+
+
+
+
+
+
+
+
diff --git a/src/widgets/settings/ui/components/stickyNavBar/index.ts b/src/widgets/settings/ui/components/stickyNavBar/index.ts
new file mode 100644
index 00000000..d40fd4d2
--- /dev/null
+++ b/src/widgets/settings/ui/components/stickyNavBar/index.ts
@@ -0,0 +1,2 @@
+import StickyNavBar from "@/widgets/settings/ui/components/stickyNavBar/StickyNavBar.vue";
+export default StickyNavBar;
diff --git a/src/widgets/settings/ui/components/toggleBaseLine/ToggleBaseLine.vue b/src/widgets/settings/ui/components/toggleBaseLine/ToggleBaseLine.vue
new file mode 100644
index 00000000..ff73269e
--- /dev/null
+++ b/src/widgets/settings/ui/components/toggleBaseLine/ToggleBaseLine.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+ {{ zeroBaseLine ? "Zero Baseline" : "Non-zero baseline" }}
+
+
+ Determines whether the axis starts from the 0 or the lowest value in the
+ set
+
+
+
+
+
+
+
+
+
+
diff --git a/src/widgets/settings/ui/components/toggleBaseLine/index.ts b/src/widgets/settings/ui/components/toggleBaseLine/index.ts
new file mode 100644
index 00000000..86932225
--- /dev/null
+++ b/src/widgets/settings/ui/components/toggleBaseLine/index.ts
@@ -0,0 +1,3 @@
+import ToggleBaseLine from "./ToggleBaseLine.vue";
+
+export default ToggleBaseLine;
diff --git a/src/widgets/settings/ui/components/toggleDarkMode/ToggleDarkMode.vue b/src/widgets/settings/ui/components/toggleDarkMode/ToggleDarkMode.vue
new file mode 100644
index 00000000..50e92a9b
--- /dev/null
+++ b/src/widgets/settings/ui/components/toggleDarkMode/ToggleDarkMode.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+ {{ darkMode ? "Dark Mode" : "Light mode" }}
+
+
Select the Color mode
+
+
+
+
+
+
+
+
+
diff --git a/src/widgets/settings/ui/components/toggleDarkMode/index.ts b/src/widgets/settings/ui/components/toggleDarkMode/index.ts
new file mode 100644
index 00000000..2c4834aa
--- /dev/null
+++ b/src/widgets/settings/ui/components/toggleDarkMode/index.ts
@@ -0,0 +1,3 @@
+import ToggleDarkMode from "./ToggleDarkMode.vue";
+
+export default ToggleDarkMode;
diff --git a/src/widgets/settings/ui/components/toggleDefaultAnnotationsMode/ToggleDefaultAnnotatonsMode.vue b/src/widgets/settings/ui/components/toggleDefaultAnnotationsMode/ToggleDefaultAnnotatonsMode.vue
new file mode 100644
index 00000000..fc43eccd
--- /dev/null
+++ b/src/widgets/settings/ui/components/toggleDefaultAnnotationsMode/ToggleDefaultAnnotatonsMode.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
{{ annotationsMode ? "On" : "Off" }}
+
Switch default annotations mode
+
+
+
+
+
+
+
diff --git a/src/widgets/settings/ui/components/toggleDefaultNotesMode/ToggleDefaultNotesMode.vue b/src/widgets/settings/ui/components/toggleDefaultNotesMode/ToggleDefaultNotesMode.vue
new file mode 100644
index 00000000..aeffef00
--- /dev/null
+++ b/src/widgets/settings/ui/components/toggleDefaultNotesMode/ToggleDefaultNotesMode.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
{{ notesMode ? "On" : "Off" }}
+
Switch default notes mode
+
+
+
+
+
+
+
diff --git a/src/widgets/settings/ui/components/toggleMinMax/ToggleMinMax.vue b/src/widgets/settings/ui/components/toggleMinMax/ToggleMinMax.vue
new file mode 100644
index 00000000..18388988
--- /dev/null
+++ b/src/widgets/settings/ui/components/toggleMinMax/ToggleMinMax.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
{{ minMax ? "MIN/MAX" : "P10/P90" }}
+
+ Applicable to some reports. Determines whether to use Min/Max or P10/P90
+
+
+
+
+
+
+
+
+
+
diff --git a/src/widgets/settings/ui/components/toggleMinMax/index.ts b/src/widgets/settings/ui/components/toggleMinMax/index.ts
new file mode 100644
index 00000000..18d98ad8
--- /dev/null
+++ b/src/widgets/settings/ui/components/toggleMinMax/index.ts
@@ -0,0 +1,3 @@
+import ToggleMinMax from "./ToggleMinMax.vue";
+
+export default ToggleMinMax;
diff --git a/src/widgets/settings/ui/components/userAccount/UserAccount.vue b/src/widgets/settings/ui/components/userAccount/UserAccount.vue
new file mode 100644
index 00000000..1a35ba72
--- /dev/null
+++ b/src/widgets/settings/ui/components/userAccount/UserAccount.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+ Log in to WebAPI
+
+
+
+
+
+
+
{{ user?.name }}
+
+ Expires: {{ user?.exp }}
+
+
+
+
Log out
+
+
+
+
+
+
diff --git a/src/widgets/snackbar/index.ts b/src/widgets/snackbar/index.ts
new file mode 100644
index 00000000..07afe192
--- /dev/null
+++ b/src/widgets/snackbar/index.ts
@@ -0,0 +1,4 @@
+import snackbarStore from "@/widgets/snackbar/model/store/snackbar.module";
+import Snackbar from "@/widgets/snackbar/ui/Snackbar.vue";
+
+export { Snackbar, snackbarStore };
diff --git a/src/widgets/snackbar/model/store/actions.type.ts b/src/widgets/snackbar/model/store/actions.type.ts
new file mode 100644
index 00000000..473dcbca
--- /dev/null
+++ b/src/widgets/snackbar/model/store/actions.type.ts
@@ -0,0 +1,2 @@
+export const ADD_ALERT = "addAlert";
+export const RESET_ALERTS = "resetAlerts";
diff --git a/src/widgets/snackbar/model/store/mutations.type.ts b/src/widgets/snackbar/model/store/mutations.type.ts
new file mode 100644
index 00000000..fb3a0229
--- /dev/null
+++ b/src/widgets/snackbar/model/store/mutations.type.ts
@@ -0,0 +1,3 @@
+export const SET_ALERT = "setAlert";
+export const SET_ALERT_VISIBILITY = "setAlertVisibility";
+export const CLEAR_ALERTS = "clearAlerts";
diff --git a/src/widgets/snackbar/model/store/snackbar.module.ts b/src/widgets/snackbar/model/store/snackbar.module.ts
new file mode 100644
index 00000000..d8445591
--- /dev/null
+++ b/src/widgets/snackbar/model/store/snackbar.module.ts
@@ -0,0 +1,53 @@
+import {
+ ADD_ALERT,
+ RESET_ALERTS,
+} from "@/widgets/snackbar/model/store/actions.type";
+import {
+ CLEAR_ALERTS,
+ SET_ALERT,
+ SET_ALERT_VISIBILITY,
+} from "@/widgets/snackbar/model/store/mutations.type";
+
+const state = {
+ alert: {},
+ showAlert: false,
+};
+
+const getters = {
+ getAlert: function (state) {
+ return state.alert;
+ },
+ getAlertVisibility: function (state) {
+ return state.showAlert;
+ },
+};
+
+const actions = {
+ [ADD_ALERT]({ commit }, payload) {
+ commit(SET_ALERT, payload);
+ commit(SET_ALERT_VISIBILITY);
+ },
+ [RESET_ALERTS]({ commit }) {
+ commit(CLEAR_ALERTS);
+ },
+};
+
+const mutations = {
+ [SET_ALERT](state, payload) {
+ state.alert = payload;
+ },
+ [SET_ALERT_VISIBILITY](state) {
+ state.showAlert = true;
+ },
+ [CLEAR_ALERTS](state) {
+ state.alert = {};
+ state.showAlert = false;
+ },
+};
+
+export default {
+ state,
+ getters,
+ actions,
+ mutations,
+};
diff --git a/src/widgets/snackbar/ui/Snackbar.vue b/src/widgets/snackbar/ui/Snackbar.vue
new file mode 100644
index 00000000..6956c0b7
--- /dev/null
+++ b/src/widgets/snackbar/ui/Snackbar.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 00000000..859a6afa
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,42 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ darkMode: "class",
+ content: [
+ "./index.html",
+ "./src/**/*.{vue,js,ts,jsx,tsx}",
+ "./node_modules/primevue/**/*.{vue,js,ts,jsx,tsx}",
+ ],
+ theme: {
+ fontFamily: {
+ sans: ["Roboto", "Arial"],
+ },
+ extend: {
+ colors: {
+ "primary-50": "rgb(var(--primary-50))",
+ "primary-100": "rgb(var(--primary-100))",
+ "primary-200": "rgb(var(--primary-200))",
+ "primary-300": "rgb(var(--primary-300))",
+ "primary-400": "rgb(var(--primary-400))",
+ "primary-500": "rgb(var(--primary-500))",
+ "primary-600": "rgb(var(--primary-600))",
+ "primary-700": "rgb(var(--primary-700))",
+ "primary-800": "rgb(var(--primary-800))",
+ "primary-900": "rgb(var(--primary-900))",
+ "primary-950": "rgb(var(--primary-950))",
+ "surface-0": "rgb(var(--surface-0))",
+ "surface-50": "rgb(var(--surface-50))",
+ "surface-100": "rgb(var(--surface-100))",
+ "surface-200": "rgb(var(--surface-200))",
+ "surface-300": "rgb(var(--surface-300))",
+ "surface-400": "rgb(var(--surface-400))",
+ "surface-500": "rgb(var(--surface-500))",
+ "surface-600": "rgb(var(--surface-600))",
+ "surface-700": "rgb(var(--surface-700))",
+ "surface-800": "rgb(var(--surface-800))",
+ "surface-900": "rgb(var(--surface-900))",
+ "surface-950": "rgb(var(--surface-950))",
+ },
+ },
+ },
+ plugins: [],
+};
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000..2e3149ba
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,38 @@
+{
+ "compilerOptions": {
+ "allowJs": true,
+ "target": "esnext",
+ "module": "esnext",
+ "strict": false,
+ "jsx": "preserve",
+ "moduleResolution": "node",
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "forceConsistentCasingInFileNames": true,
+ "useDefineForClassFields": true,
+ "sourceMap": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": [
+ "src/*"
+ ]
+ },
+ "lib": [
+ "esnext",
+ "dom",
+ "dom.iterable",
+ "scripthost"
+ ]
+ },
+ "include": [
+ "src/**/*.ts",
+ "src/**/*.tsx",
+ "src/**/*.vue",
+ "tests/**/*.ts",
+ "tests/**/*.tsx"
+ ],
+ "exclude": [
+ "node_modules",
+ ]
+}
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 00000000..34de12a1
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,28 @@
+import { defineConfig } from "vite";
+import "./logger";
+
+import path from "path";
+import vue from "@vitejs/plugin-vue";
+import vueJsx from "@vitejs/plugin-vue-jsx";
+
+export default defineConfig({
+ base: "/ares/",
+ plugins: [vue(), vueJsx({})],
+ server: {
+ port: 8080,
+ },
+ resolve: {
+ alias: [
+ {
+ find: "@",
+ replacement: path.resolve(__dirname, "src"),
+ },
+ ],
+ },
+ build: {
+ chunkSizeWarningLimit: 600,
+ cssCodeSplit: false,
+ target: "esnext",
+ sourcemap: true,
+ },
+});
diff --git a/vue.config.js b/vue.config.js
deleted file mode 100644
index 7d334b55..00000000
--- a/vue.config.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = {
- publicPath: "/ares/",
- lintOnSave: false,
-};
diff --git a/webpack.config.js b/webpack.config.js
deleted file mode 100644
index ae9222eb..00000000
--- a/webpack.config.js
+++ /dev/null
@@ -1,21 +0,0 @@
-module.exports = {
- rules: [
- {
- test: /\.s(c|a)ss$/,
- use: [
- "vue-style-loader",
- "css-loader",
- {
- loader: "sass-loader",
- options: {
- implementation: require("sass"),
- sassOptions: {
- fiber: require("fibers"),
- indentedSyntax: true, // optional
- },
- },
- },
- ],
- },
- ],
-};