From bdfe079c3f8bf7088e14ac08df6596adc74c76ad Mon Sep 17 00:00:00 2001 From: pangpang20 <676814828@qq.com> Date: Mon, 30 Dec 2024 16:38:05 +0800 Subject: [PATCH 1/8] update codes and docs --- .gitignore | 5 +- docker/development/Dockerfile | 6 + docker/docker-compose-quickstart/Dockerfile | 4 + ingestion/Dockerfile | 41 +- ingestion/Dockerfile.ci | 38 +- ingestion/operators/docker/Dockerfile | 32 +- ingestion/operators/docker/Dockerfile.ci | 32 +- package.json | 1 + yarn.lock | 1062 ++++++++++++++++++- 9 files changed, 1178 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index a518bbde95a0..d9f42a0cb373 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,9 @@ logs *.jar *.war *.ear +.files +yarn.lock +package.json # mac dir files .DS_Store @@ -132,4 +135,4 @@ ingestion/tests/cli_e2e/**/*test.yaml /ingestion/tests/integration/great_expectations/gx/* # Tests -**/metastore_db/ \ No newline at end of file +**/metastore_db/ diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index 68535876503b..7f923b10a7cb 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -12,6 +12,9 @@ # Build stage FROM alpine:3 AS build +RUN sed -i 's|http://dl-cdn.alpinelinux.org|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apk/repositories + + COPY openmetadata-dist/target/openmetadata-*.tar.gz / RUN mkdir -p /opt/openmetadata && \ @@ -23,6 +26,9 @@ FROM alpine:3 EXPOSE 8585 +RUN sed -i 's|http://dl-cdn.alpinelinux.org|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apk/repositories + + RUN adduser -D openmetadata && \ apk update && \ apk upgrade && \ diff --git a/docker/docker-compose-quickstart/Dockerfile b/docker/docker-compose-quickstart/Dockerfile index 81c9750f2d9f..bf11fc722813 100644 --- a/docker/docker-compose-quickstart/Dockerfile +++ b/docker/docker-compose-quickstart/Dockerfile @@ -11,6 +11,8 @@ # Build stage FROM alpine:3 AS build +RUN sed -i 's|http://dl-cdn.alpinelinux.org|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apk/repositories + ARG RI_VERSION="1.6.0-SNAPSHOT" ENV RELEASE_URL="https://github.com/open-metadata/OpenMetadata/releases/download/${RI_VERSION}-release/openmetadata-${RI_VERSION}.tar.gz" @@ -21,6 +23,8 @@ RUN mkdir -p /opt/openmetadata && \ # Final stage FROM alpine:3 +RUN sed -i 's|http://dl-cdn.alpinelinux.org|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apk/repositories + ARG RI_VERSION="1.6.0-SNAPSHOT" ARG BUILD_DATE ARG COMMIT_ID diff --git a/ingestion/Dockerfile b/ingestion/Dockerfile index cc0df5ad259c..e7270c5c53ea 100644 --- a/ingestion/Dockerfile +++ b/ingestion/Dockerfile @@ -5,6 +5,8 @@ USER root RUN curl -sS https://packages.microsoft.com/keys/microsoft.asc | apt-key add - RUN curl -sS https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list # Install Dependencies (listed in alphabetical order) + + ENV DEBIAN_FRONTEND=noninteractive RUN apt-get -qq update \ && apt-get -qq install -y \ @@ -42,14 +44,30 @@ RUN apt-get -qq update \ && rm -rf /var/lib/apt/lists/* COPY --from=mysql /usr/bin/mysqldump /usr/bin/mysqldump -RUN if [ $(uname -m) = "arm64" || $(uname -m) = "aarch64" ]; \ - then \ - wget -q https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip -O /oracle-instantclient.zip && \ - unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ - else \ - wget -q https://download.oracle.com/otn_software/linux/instantclient/1917000/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip -O /oracle-instantclient.zip && \ - unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ - fi +# RUN if [ $(uname -m) = "arm64" || $(uname -m) = "aarch64" ]; \ +# then \ +# wget -q https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip -O /oracle-instantclient.zip && \ +# unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ +# else \ +# wget -q https://download.oracle.com/otn_software/linux/instantclient/1917000/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip -O /oracle-instantclient.zip && \ +# unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ +# fi + +# local +COPY ./.files/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip +COPY ./.files/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip + +RUN if [ $(uname -m) = "arm64" ] || [ $(uname -m) = "aarch64" ]; then \ + unzip -qq -d /instantclient -j /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip; \ + else \ + unzip -qq -d /instantclient -j /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip; \ + fi + +USER airflow +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \ + python3 -m pip install --upgrade pip +USER root + ENV LD_LIBRARY_PATH=/instantclient @@ -79,7 +97,8 @@ ENV PIP_QUIET=1 ARG RI_VERSION="1.6.0.0.dev0" RUN pip install --upgrade pip RUN pip install "openmetadata-managed-apis~=${RI_VERSION}" --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.9.1/constraints-3.10.txt" -RUN pip install "openmetadata-ingestion[${INGESTION_DEPENDENCY}]~=${RI_VERSION}" +RUN pip install "openmetadata-ingestion[${INGESTION_DEPENDENCY}]~=${RI_VERSION}" -i https://pypi.tuna.tsinghua.edu.cn/simple +# RUN pip install "openmetadata-ingestion[${INGESTION_DEPENDENCY}]~=${RI_VERSION}" # Temporary workaround for https://github.com/open-metadata/OpenMetadata/issues/9593 RUN [ $(uname -m) = "x86_64" ] \ @@ -90,8 +109,8 @@ RUN [ $(uname -m) = "x86_64" ] \ RUN pip install "python-daemon>=3.0.0" # remove all airflow providers except for docker and cncf kubernetes RUN pip freeze | grep "apache-airflow-providers" | grep --invert-match -E "docker|http|cncf|fab" | xargs pip uninstall -y -# Uninstalling psycopg2-binary and installing psycopg2 instead -# because the psycopg2-binary generates a architecture specific error +# Uninstalling psycopg2-binary and installing psycopg2 instead +# because the psycopg2-binary generates a architecture specific error # while authenticating connection with the airflow, psycopg2 solves this error RUN pip uninstall psycopg2-binary -y RUN pip install psycopg2 mysqlclient==2.1.1 diff --git a/ingestion/Dockerfile.ci b/ingestion/Dockerfile.ci index f8433f776ca3..c14e75ce06bc 100644 --- a/ingestion/Dockerfile.ci +++ b/ingestion/Dockerfile.ci @@ -43,14 +43,30 @@ RUN dpkg --configure -a \ && rm -rf /var/lib/apt/lists/* COPY --from=mysql /usr/bin/mysqldump /usr/bin/mysqldump -RUN if [ $(uname -m) = "arm64" || $(uname -m) = "aarch64" ]; \ - then \ - wget https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip -O /oracle-instantclient.zip && \ - unzip -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ - else \ - wget https://download.oracle.com/otn_software/linux/instantclient/1917000/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip -O /oracle-instantclient.zip && \ - unzip -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ - fi +# RUN if [ $(uname -m) = "arm64" || $(uname -m) = "aarch64" ]; \ +# then \ +# wget https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip -O /oracle-instantclient.zip && \ +# unzip -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ +# else \ +# wget https://download.oracle.com/otn_software/linux/instantclient/1917000/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip -O /oracle-instantclient.zip && \ +# unzip -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ +# fi + +# local +COPY ./.files/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip +COPY ./.files/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip + +RUN if [ $(uname -m) = "arm64" ] || [ $(uname -m) = "aarch64" ]; then \ + unzip -qq -d /instantclient -j /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip; \ + else \ + unzip -qq -d /instantclient -j /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip; \ + fi + + +USER airflow +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \ + python3 -m pip install --upgrade pip +USER root ENV LD_LIBRARY_PATH=/instantclient @@ -90,7 +106,7 @@ WORKDIR /home/airflow/ingestion # Argument to provide for Ingestion Dependencies to install. Defaults to all ARG INGESTION_DEPENDENCY="all" -RUN pip install ".[${INGESTION_DEPENDENCY}]" +RUN pip install ".[${INGESTION_DEPENDENCY}]" -i https://pypi.tuna.tsinghua.edu.cn/simple # Temporary workaround for https://github.com/open-metadata/OpenMetadata/issues/9593 RUN [ $(uname -m) = "x86_64" ] \ @@ -103,8 +119,8 @@ RUN pip install "python-daemon>=3.0.0" # remove all airflow providers except for docker and cncf kubernetes RUN pip freeze | grep "apache-airflow-providers" | grep --invert-match -E "docker|http|cncf|fab" | xargs pip uninstall -y -# Uninstalling psycopg2-binary and installing psycopg2 instead -# because the psycopg2-binary generates a architecture specific error +# Uninstalling psycopg2-binary and installing psycopg2 instead +# because the psycopg2-binary generates a architecture specific error # while authenticating connection with the airflow, psycopg2 solves this error RUN pip uninstall psycopg2-binary -y RUN pip install psycopg2 mysqlclient==2.1.1 diff --git a/ingestion/operators/docker/Dockerfile b/ingestion/operators/docker/Dockerfile index d5d57088d256..192878c89a73 100644 --- a/ingestion/operators/docker/Dockerfile +++ b/ingestion/operators/docker/Dockerfile @@ -48,14 +48,30 @@ RUN echo "deb https://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main" > /e apt-get -qq autoremove -yqq --purge; \ apt-get -qq clean && rm -rf /var/lib/apt/lists/* -RUN if [ $(uname -m) = "arm64" || $(uname -m) = "aarch64" ]; \ - then \ - wget -q https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip -O /oracle-instantclient.zip && \ - unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ - else \ - wget -q https://download.oracle.com/otn_software/linux/instantclient/1917000/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip -O /oracle-instantclient.zip && \ - unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ - fi +# RUN if [ $(uname -m) = "arm64" || $(uname -m) = "aarch64" ]; \ +# then \ +# wget -q https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip -O /oracle-instantclient.zip && \ +# unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ +# else \ +# wget -q https://download.oracle.com/otn_software/linux/instantclient/1917000/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip -O /oracle-instantclient.zip && \ +# unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ +# fi + +# local +COPY ./.files/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip +COPY ./.files/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip + +RUN if [ $(uname -m) = "arm64" ] || [ $(uname -m) = "aarch64" ]; then \ + unzip -qq -d /instantclient -j /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip; \ + else \ + unzip -qq -d /instantclient -j /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip; \ + fi + + +USER airflow +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \ + python3 -m pip install --upgrade pip +USER root ENV LD_LIBRARY_PATH=/instantclient diff --git a/ingestion/operators/docker/Dockerfile.ci b/ingestion/operators/docker/Dockerfile.ci index 27752f954383..94569e1c154b 100644 --- a/ingestion/operators/docker/Dockerfile.ci +++ b/ingestion/operators/docker/Dockerfile.ci @@ -48,14 +48,30 @@ RUN echo "deb https://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main" > /e apt-get -qq autoremove -yqq --purge; \ apt-get -qq clean && rm -rf /var/lib/apt/lists/* -RUN if [ $(uname -m) = "arm64" || $(uname -m) = "aarch64" ]; \ - then \ - wget -q https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip -O /oracle-instantclient.zip && \ - unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ - else \ - wget -q https://download.oracle.com/otn_software/linux/instantclient/1917000/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip -O /oracle-instantclient.zip && \ - unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ - fi +# RUN if [ $(uname -m) = "arm64" || $(uname -m) = "aarch64" ]; \ +# then \ +# wget -q https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip -O /oracle-instantclient.zip && \ +# unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ +# else \ +# wget -q https://download.oracle.com/otn_software/linux/instantclient/1917000/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip -O /oracle-instantclient.zip && \ +# unzip -qq -d /instantclient -j /oracle-instantclient.zip && rm -f /oracle-instantclient.zip; \ +# fi + +# local +COPY ./.files/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip +COPY ./.files/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip + +RUN if [ $(uname -m) = "arm64" ] || [ $(uname -m) = "aarch64" ]; then \ + unzip -qq -d /instantclient -j /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip; \ + else \ + unzip -qq -d /instantclient -j /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip; \ + fi + + +USER airflow +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \ + python3 -m pip install --upgrade pip +USER root ENV LD_LIBRARY_PATH=/instantclient diff --git a/package.json b/package.json index 877b4bcf0b1c..d5c784ab32d7 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "url": "https://github.com/open-metadata/OpenMetadata.git" }, "devDependencies": { + "cypress": "^13.17.0", "quicktype": "20.0.27" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index ccc4d08b6723..a44718247037 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -9,6 +14,38 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@cypress/request@^3.0.6": + version "3.0.7" + resolved "https://registry.npmmirror.com/@cypress/request/-/request-3.0.7.tgz#6a74a4da98d9e5ae9121d6e2d9c14780c9b5cf1a" + integrity sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~4.0.0" + http-signature "~1.4.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "6.13.1" + safe-buffer "^5.1.2" + tough-cookie "^5.0.0" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.npmmirror.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + "@glideapps/ts-necessities@2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@glideapps/ts-necessities/-/ts-necessities-2.1.2.tgz#bfa99d70893c48d6068997d70babec0f08edc879" @@ -76,16 +113,40 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/node@*": + version "22.10.2" + resolved "https://registry.npmmirror.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== + dependencies: + undici-types "~6.20.0" + "@types/node@^16.9.2": version "16.18.108" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.108.tgz#b794e2b2a85b4c12935ea7d0f18641be68b352f9" integrity sha512-fj42LD82fSv6yN9C6Q4dzS+hujHj+pTv0IpRR3kI20fnYeS0ytBpjFO9OjmDowSPPt4lNKN46JLaKbCyP+BW2A== +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.npmmirror.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.9" + resolved "https://registry.npmmirror.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2" + integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w== + "@types/urijs@^1.19.19": version "1.19.25" resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.25.tgz#ac92b53e674c3b108decdbe88dc5f444a2f42f6a" integrity sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg== +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -105,6 +166,26 @@ acorn@^8.11.0, acorn@^8.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -124,6 +205,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -139,6 +225,48 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.0: + version "3.2.6" + resolved "https://registry.npmmirror.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.13.2" + resolved "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" + integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -149,6 +277,23 @@ base64-js@^1.3.0, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -162,6 +307,19 @@ browser-or-node@^2.1.1: resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-2.1.1.tgz#738790b3a86a8fc020193fa581273fbe65eaea0f" integrity sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg== +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.7.1: + version "5.7.1" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -170,6 +328,32 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +cachedir@^2.3.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" + integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== + +call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bound@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -179,7 +363,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.2: +chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -187,6 +371,45 @@ chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.npmmirror.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + +ci-info@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-4.1.0.tgz#92319d2fa29d2620180ea5afed31f589bc98cf83" + integrity sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-table3@~0.6.1: + version "0.6.5" + resolved "https://registry.npmmirror.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -225,6 +448,18 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + command-line-args@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" @@ -245,11 +480,26 @@ command-line-usage@^6.1.3: table-layout "^1.0.2" typical "^5.2.0" +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.npmmirror.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -262,21 +512,159 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" +cross-spawn@^7.0.0: + version "7.0.6" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cypress@^13.17.0: + version "13.17.0" + resolved "https://registry.npmmirror.com/cypress/-/cypress-13.17.0.tgz#34c3d68080c4497eace0f353bd1629587a5f600d" + integrity sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA== + dependencies: + "@cypress/request" "^3.0.6" + "@cypress/xvfb" "^1.2.4" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.7.1" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + ci-info "^4.0.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^6.2.1" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.4" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.8" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + process "^0.11.10" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.5.3" + supports-color "^8.1.1" + tmp "~0.2.3" + tree-kill "1.2.2" + untildify "^4.0.0" + yauzl "^2.10.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +dayjs@^1.10.4: + version "1.11.13" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.4: + version "4.4.0" + resolved "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + deep-extend@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +dunder-proto@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.npmmirror.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + escalade@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" @@ -292,11 +680,78 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.npmmirror.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +execa@4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + find-replace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" @@ -304,16 +759,82 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@~4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: + version "1.2.6" + resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" + integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== + dependencies: + call-bind-apply-helpers "^1.0.1" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + function-bind "^1.1.2" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.0.0" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + glob@^7.1.7: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -326,6 +847,23 @@ glob@^7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graphql@^0.11.7: version "0.11.7" resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.11.7.tgz#e5abaa9cb7b7cccb84e9f0836bf4370d268750c6" @@ -343,11 +881,42 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -ieee754@^1.2.1: +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +http-signature@~1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/http-signature/-/http-signature-1.4.0.tgz#dee5a9ba2bf49416abc544abd6d967f6a94c8c3f" + integrity sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.18.0" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -361,16 +930,59 @@ inherits@2, inherits@^2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-url@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + iterall@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.3.tgz#1cbbff96204056dde6656e2ed2e2226d0e6d72c9" @@ -381,21 +993,124 @@ js-base64@^2.4.3: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.npmmirror.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.npmmirror.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +math-intrinsics@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -403,11 +1118,21 @@ minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + moment@^2.29.4: version "2.30.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + node-fetch@^2.6.12: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -415,13 +1140,44 @@ node-fetch@^2.6.12: dependencies: whatwg-url "^5.0.0" -once@^1.3.0: +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + pako@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -442,16 +1198,61 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +qs@6.13.1: + version "6.13.1" + resolved "https://registry.npmmirror.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" + integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== + dependencies: + side-channel "^1.0.6" + quicktype-core@20.0.27: version "20.0.27" resolved "https://registry.yarnpkg.com/quicktype-core/-/quicktype-core-20.0.27.tgz#4bec92c94d86250146c64af5aa61c63f091a98c6" @@ -547,12 +1348,39 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -safe-buffer@~5.2.0: +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -562,6 +1390,106 @@ safe-stable-stringify@^2.2.0: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.5.3: + version "7.6.3" + resolved "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.6: + version "1.1.0" + resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sshpk@^1.18.0: + version "1.18.0" + resolved "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + stream-chain@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/stream-chain/-/stream-chain-2.2.5.tgz#b30967e8f14ee033c5b9a19bbe8a2cba90ba0d09" @@ -604,6 +1532,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -618,6 +1551,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + table-layout@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" @@ -628,16 +1568,55 @@ table-layout@^1.0.2: typical "^5.2.0" wordwrapjs "^4.0.0" +throttleit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" + integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + tiny-inflate@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== +tldts-core@^6.1.70: + version "6.1.70" + resolved "https://registry.npmmirror.com/tldts-core/-/tldts-core-6.1.70.tgz#a954e93237ece2e1705b438600793c86a25f8c00" + integrity sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg== + +tldts@^6.1.32: + version "6.1.70" + resolved "https://registry.npmmirror.com/tldts/-/tldts-6.1.70.tgz#b571e5645ab9dc6f289453115d52602b8a384cfe" + integrity sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA== + dependencies: + tldts-core "^6.1.70" + +tmp@~0.2.3: + version "0.2.3" + resolved "https://registry.npmmirror.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +tough-cookie@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" + integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== + dependencies: + tldts "^6.1.32" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + ts-node@^10.9.1: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" @@ -657,6 +1636,28 @@ ts-node@^10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +tslib@^2.1.0: + version "2.8.1" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + typescript@4.9.4: version "4.9.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" @@ -672,6 +1673,11 @@ typical@^5.2.0: resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.npmmirror.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + unicode-properties@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.4.1.tgz#96a9cffb7e619a0dc7368c28da27e05fc8f9be5f" @@ -688,6 +1694,16 @@ unicode-trie@^2.0.0: pako "^0.2.5" tiny-inflate "^1.0.0" +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + urijs@^1.19.1: version "1.19.11" resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" @@ -698,11 +1714,25 @@ util-deprecate@^1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -716,6 +1746,13 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -729,6 +1766,15 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -771,6 +1817,14 @@ yargs@^17.1.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From 19a9d17cbf173f5b6253ac67c66ab837cb32458b Mon Sep 17 00:00:00 2001 From: pangpang20 <676814828@qq.com> Date: Mon, 30 Dec 2024 17:10:49 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=82=E9=85=8Dgaussdb?= =?UTF-8?q?=E7=9A=84json=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../antlr4/org/openmetadata/schema/JdbcUri.g4 | 2 +- .../database/gaussdbConnection.json | 130 ++++++++++++++++++ .../metadata/alationConnection.json | 5 +- .../pipeline/airflowConnection.json | 3 + .../entity/services/databaseService.json | 13 +- .../json/schema/tests/testSuite.json | 4 +- 6 files changed, 150 insertions(+), 7 deletions(-) create mode 100644 openmetadata-spec/src/main/resources/json/schema/entity/services/connections/database/gaussdbConnection.json diff --git a/openmetadata-spec/src/main/antlr4/org/openmetadata/schema/JdbcUri.g4 b/openmetadata-spec/src/main/antlr4/org/openmetadata/schema/JdbcUri.g4 index 36f9701c6b08..eb306518a8b4 100644 --- a/openmetadata-spec/src/main/antlr4/org/openmetadata/schema/JdbcUri.g4 +++ b/openmetadata-spec/src/main/antlr4/org/openmetadata/schema/JdbcUri.g4 @@ -31,6 +31,7 @@ DATABASE_TYPE | 'vertica' | 'hive2' | 'redshift' + | 'gaussdb' ; URI_SEPARATOR @@ -96,4 +97,3 @@ AMP WS : [ \t\r\n]+ -> skip ; - diff --git a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/database/gaussdbConnection.json b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/database/gaussdbConnection.json new file mode 100644 index 000000000000..16a5062a66a0 --- /dev/null +++ b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/database/gaussdbConnection.json @@ -0,0 +1,130 @@ +{ + "$id": "https://open-metadata.org/schema/entity/services/connections/database/gaussdbConnection.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "GaussdbConnection", + "description": "Gaussdb Database Connection Config", + "type": "object", + "javaType": "org.openmetadata.schema.services.connections.database.GaussdbConnection", + "definitions": { + "gaussdbType": { + "description": "Service type.", + "type": "string", + "enum": [ + "Gaussdb" + ], + "default": "Gaussdb" + }, + "gaussdbScheme": { + "description": "SQLAlchemy driver scheme options.", + "type": "string", + "enum": [ + "postgresql+psycopg2", + "pgspider+psycopg2" + ], + "default": "postgresql+psycopg2" + } + }, + "properties": { + "type": { + "title": "Service Type", + "description": "Service Type", + "$ref": "#/definitions/gaussdbType", + "default": "Gaussdb" + }, + "scheme": { + "title": "Connection Scheme", + "description": "SQLAlchemy driver scheme options.", + "$ref": "#/definitions/gaussdbScheme", + "default": "postgresql+psycopg2" + }, + "username": { + "title": "Username", + "description": "Username to connect to Gaussdb. This user should have privileges to read all the metadata in Gaussdb.", + "type": "string" + }, + "authType": { + "title": "Auth Configuration Type", + "description": "Choose Auth Config Type.", + "oneOf": [ + { + "$ref": "./common/basicAuth.json" + } + ] + }, + "hostPort": { + "title": "Host and Port", + "description": "Host and port of the source service.", + "type": "string" + }, + "database": { + "title": "Database", + "description": "Database of the data source. This is optional parameter, if you would like to restrict the metadata reading to a single database. When left blank, OpenMetadata Ingestion attempts to scan all the databases.", + "type": "string" + }, + "ingestAllDatabases": { + "title": "Ingest All Databases", + "description": "Ingest data from all databases in Gaussdb. You can use databaseFilterPattern on top of this.", + "type": "boolean", + "default": false + }, + "sslMode": { + "$ref": "../../../../security/ssl/verifySSLConfig.json#/definitions/sslMode" + }, + "sslConfig": { + "$ref": "../../../../security/ssl/verifySSLConfig.json#/definitions/sslConfig" + }, + "classificationName": { + "title": "Classification Name", + "description": "Custom OpenMetadata Classification name for Gaussdb policy tags.", + "type": "string", + "default": "GaussdbPolicyTags" + }, + "connectionOptions": { + "title": "Connection Options", + "$ref": "../connectionBasicType.json#/definitions/connectionOptions" + }, + "connectionArguments": { + "title": "Connection Arguments", + "$ref": "../connectionBasicType.json#/definitions/connectionArguments" + }, + "supportsMetadataExtraction": { + "title": "Supports Metadata Extraction", + "$ref": "../connectionBasicType.json#/definitions/supportsMetadataExtraction" + }, + "supportsUsageExtraction": { + "$ref": "../connectionBasicType.json#/definitions/supportsUsageExtraction" + }, + "supportsLineageExtraction": { + "$ref": "../connectionBasicType.json#/definitions/supportsLineageExtraction" + }, + "supportsDBTExtraction": { + "$ref": "../connectionBasicType.json#/definitions/supportsDBTExtraction" + }, + "supportsProfiler": { + "title": "Supports Profiler", + "$ref": "../connectionBasicType.json#/definitions/supportsProfiler" + }, + "supportsDatabase": { + "title": "Supports Database", + "$ref": "../connectionBasicType.json#/definitions/supportsDatabase" + }, + "supportsQueryComment": { + "title": "Supports Query Comment", + "$ref": "../connectionBasicType.json#/definitions/supportsQueryComment" + }, + "sampleDataStorageConfig": { + "title": "Storage Config for Sample Data", + "$ref": "../connectionBasicType.json#/definitions/sampleDataStorageConfig" + }, + "supportsDataDiff": { + "title": "Supports Data Diff Extraction.", + "$ref": "../connectionBasicType.json#/definitions/supportsDataDiff" + } + }, + "additionalProperties": false, + "required": [ + "hostPort", + "username", + "database" + ] +} diff --git a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/metadata/alationConnection.json b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/metadata/alationConnection.json index 1277bcc8124d..480d93d8b3f8 100644 --- a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/metadata/alationConnection.json +++ b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/metadata/alationConnection.json @@ -41,7 +41,7 @@ }, "connection":{ "title": "Alation Database Connection", - "description": "Choose between mysql and postgres connection for alation database", + "description": "Choose between mysql , postgres and gaussdb connection for alation database", "oneOf": [ { "$ref": "../database/postgresConnection.json" @@ -49,6 +49,9 @@ { "$ref": "../database/mysqlConnection.json" }, + { + "$ref": "../database/gaussdbConnection.json" + }, { "title": "None", "type": "object", diff --git a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/pipeline/airflowConnection.json b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/pipeline/airflowConnection.json index c3756c3131ea..2461d90b4abe 100644 --- a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/pipeline/airflowConnection.json +++ b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/pipeline/airflowConnection.json @@ -47,6 +47,9 @@ }, { "$ref": "../database/sqliteConnection.json" + }, + { + "$ref": "../database/gaussdbConnection.json" } ] }, diff --git a/openmetadata-spec/src/main/resources/json/schema/entity/services/databaseService.json b/openmetadata-spec/src/main/resources/json/schema/entity/services/databaseService.json index 61f878f32d5a..5dea2ebcec2a 100644 --- a/openmetadata-spec/src/main/resources/json/schema/entity/services/databaseService.json +++ b/openmetadata-spec/src/main/resources/json/schema/entity/services/databaseService.json @@ -2,7 +2,7 @@ "$id": "https://open-metadata.org/schema/entity/services/databaseService.json", "$schema": "http://json-schema.org/draft-07/schema#", "title": "Database Service", - "description": "This schema defines the `Database Service` is a service such as MySQL, BigQuery, Redshift, Postgres, or Snowflake. Alternative terms such as Database Cluster, Database Server instance are also used for database service.", + "description": "This schema defines the `Database Service` is a service such as MySQL, BigQuery, Redshift, Postgres, Gaussdb, or Snowflake. Alternative terms such as Database Cluster, Database Server instance are also used for database service.", "type": "object", "javaType": "org.openmetadata.schema.entity.services.DatabaseService", "javaInterfaces": [ @@ -11,7 +11,7 @@ ], "definitions": { "databaseServiceType": { - "description": "Type of database service such as MySQL, BigQuery, Snowflake, Redshift, Postgres...", + "description": "Type of database service such as MySQL, BigQuery, Snowflake, Redshift, Postgres, Gaussdb...", "javaInterfaces": ["org.openmetadata.schema.EnumInterface"], "type": "string", "enum": [ @@ -21,6 +21,7 @@ "Redshift", "Snowflake", "Postgres", + "Gaussdb", "Mssql", "Oracle", "Athena", @@ -79,6 +80,9 @@ { "name": "Postgres" }, + { + "name": "Gaussdb" + }, { "name": "Mssql" }, @@ -262,6 +266,9 @@ { "$ref": "./connections/database/postgresConnection.json" }, + { + "$ref": "./connections/database/gaussdbConnection.json" + }, { "$ref": "./connections/database/prestoConnection.json" }, @@ -355,7 +362,7 @@ "type": "string" }, "serviceType": { - "description": "Type of database service such as MySQL, BigQuery, Snowflake, Redshift, Postgres...", + "description": "Type of database service such as MySQL, BigQuery, Snowflake, Redshift, Postgres, Gaussdb...", "$ref": "#/definitions/databaseServiceType" }, "description": { diff --git a/openmetadata-spec/src/main/resources/json/schema/tests/testSuite.json b/openmetadata-spec/src/main/resources/json/schema/tests/testSuite.json index 51d46d165325..8789d14b3255 100644 --- a/openmetadata-spec/src/main/resources/json/schema/tests/testSuite.json +++ b/openmetadata-spec/src/main/resources/json/schema/tests/testSuite.json @@ -80,7 +80,7 @@ "default": null }, "serviceType": { - "description": "Type of database service such as MySQL, BigQuery, Snowflake, Redshift, Postgres...", + "description": "Type of database service such as MySQL, BigQuery, Snowflake, Redshift, Postgres, Gaussdb...", "javaInterfaces": [ "org.openmetadata.schema.EnumInterface" ], @@ -162,4 +162,4 @@ "name" ], "additionalProperties": false -} \ No newline at end of file +} From 648ca32379d77c26e9c9d15e01668d3bcf269fde Mon Sep 17 00:00:00 2001 From: pangpang20 <676814828@qq.com> Date: Mon, 30 Dec 2024 17:22:19 +0800 Subject: [PATCH 3/8] update codes and docs --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index d9f42a0cb373..80a0188f3ccb 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,8 @@ buildNumber.properties catalog-services/catalog-services.iml +gitpush.sh + # local docker volume docker/development/docker-volume docker-volume From b10bc167a14705f4aa9705d56ee8da029c3ea7cf Mon Sep 17 00:00:00 2001 From: pangpang20 <676814828@qq.com> Date: Thu, 2 Jan 2025 22:47:33 +0800 Subject: [PATCH 4/8] update codes and docs --- docker/run_local_docker.sh | 30 +- .../source/database/gaussdb/__init__.py | 0 .../source/database/gaussdb/connection.py | 88 +++ .../source/database/gaussdb/converter_orm.py | 52 ++ .../source/database/gaussdb/lineage.py | 100 ++++ .../source/database/gaussdb/metadata.py | 362 ++++++++++++ .../source/database/gaussdb/metrics.py | 42 ++ .../source/database/gaussdb/models.py | 25 + .../database/gaussdb/pgspider/__init__.py | 0 .../database/gaussdb/pgspider/lineage.py | 123 ++++ .../database/gaussdb/pgspider/queries.py | 45 ++ .../source/database/gaussdb/queries.py | 311 ++++++++++ .../source/database/gaussdb/query_parser.py | 104 ++++ .../source/database/gaussdb/service_spec.py | 10 + .../source/database/gaussdb/types/money.py | 37 ++ .../source/database/gaussdb/usage.py | 82 +++ .../source/database/gaussdb/utils.py | 545 ++++++++++++++++++ .../source/pipeline/airflow/connection.py | 11 + .../src/metadata/profiler/orm/registry.py | 1 + .../src/assets/img/service-icon-gaussdb.png | Bin 0 -> 57770 bytes 20 files changed, 1953 insertions(+), 15 deletions(-) create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/__init__.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/connection.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/converter_orm.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/lineage.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/metadata.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/metrics.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/models.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/__init__.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/lineage.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/queries.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/queries.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/query_parser.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/service_spec.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/types/money.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/usage.py create mode 100644 ingestion/src/metadata/ingestion/source/database/gaussdb/utils.py create mode 100644 openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-gaussdb.png diff --git a/docker/run_local_docker.sh b/docker/run_local_docker.sh index 183b2f491e3d..792df231f5a9 100755 --- a/docker/run_local_docker.sh +++ b/docker/run_local_docker.sh @@ -45,29 +45,29 @@ debugOM="${debugOM:=false}" authorizationToken="eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg" cleanDbVolumes="${cleanDbVolumes:=true}" -echo "Running local docker using mode [$mode] database [$database] and skipping maven build [$skipMaven] with cleanDB as [$cleanDbVolumes]" +echo "$LINENO: Running local docker using mode [$mode] database [$database] and skipping maven build [$skipMaven] with cleanDB as [$cleanDbVolumes]" cd ../ -echo "Stopping any previous Local Docker Containers" +echo "$LINENO: Stopping any previous Local Docker Containers" docker compose -f docker/development/docker-compose-postgres.yml down --remove-orphans docker compose -f docker/development/docker-compose.yml down --remove-orphans if [[ $skipMaven == "false" ]]; then if [[ $mode == "no-ui" ]]; then - echo "Maven Build - Skipping Tests and UI" + echo "$LINENO: Maven Build - Skipping Tests and UI" mvn -DskipTests -DonlyBackend clean package -pl !openmetadata-ui else - echo "Maven Build - Skipping Tests" + echo "$LINENO: Maven Build - Skipping Tests" mvn -DskipTests clean package fi else - echo "Skipping Maven Build" + echo "$LINENO: Skipping Maven Build" fi RESULT=$? if [ $RESULT -ne 0 ]; then - echo "Failed to run Maven build!" + echo "$LINENO: Failed to run Maven build!" exit 1 fi @@ -85,28 +85,29 @@ fi if [[ $VIRTUAL_ENV == "" ]]; then - echo "Please Use Virtual Environment and make sure to generate Pydantic Models"; + echo "$LINENO: Please Use Virtual Environment and make sure to generate Pydantic Models"; else - echo "Generating Pydantic Models"; + echo "$LINENO: Generating Pydantic Models"; make install_dev generate fi -echo "Starting Local Docker Containers" -echo "Using ingestion dependency: ${INGESTION_DEPENDENCY:-all}" +echo "$LINENO: Starting Local Docker Containers" +echo "$LINENO: Using ingestion dependency: ${INGESTION_DEPENDENCY:-all}" +echo "$LINENO: database: ${database}" if [[ $database == "postgresql" ]]; then docker compose -f docker/development/docker-compose-postgres.yml build --build-arg INGESTION_DEPENDENCY="${INGESTION_DEPENDENCY:-all}" && docker compose -f docker/development/docker-compose-postgres.yml up -d elif [[ $database == "mysql" ]]; then docker compose -f docker/development/docker-compose.yml build --build-arg INGESTION_DEPENDENCY="${INGESTION_DEPENDENCY:-all}" && docker compose -f docker/development/docker-compose.yml up -d else - echo "Invalid database type: $database" + echo "$LINENO: Invalid database type: $database" exit 1 fi RESULT=$? if [ $RESULT -ne 0 ]; then - echo "Failed to start Docker instances!" + echo "$LINENO: Failed to start Docker instances!" exit 1 fi @@ -167,12 +168,11 @@ curl --location --request PATCH 'localhost:8080/api/v1/dags/sample_lineage' \ "is_paused": false }' -echo "✔running reindexing" +echo "$LINENO: ✔running reindexing" # Trigger ElasticSearch ReIndexing from UI curl --location --request POST 'http://localhost:8585/api/v1/apps/trigger/SearchIndexingApplication' \ --header 'Authorization: Bearer eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg' sleep 60 # Sleep for 60 seconds to make sure the elasticsearch reindexing from UI finishes tput setaf 2 -echo "✔ OpenMetadata is up and running" - +echo "$LINENO: ✔ OpenMetadata is up and running" diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/__init__.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/connection.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/connection.py new file mode 100644 index 000000000000..3654d800b042 --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/connection.py @@ -0,0 +1,88 @@ +# Copyright 2021 Collate +# 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. + +""" +Source connection handler +""" + +from typing import Optional + +from sqlalchemy.engine import Engine + +from metadata.generated.schema.entity.automations.workflow import ( + Workflow as AutomationWorkflow, +) +from metadata.generated.schema.entity.services.connections.database.common.basicAuth import ( + BasicAuth, +) +from metadata.generated.schema.entity.services.connections.database.gaussdbConnection import ( + GaussdbConnection, +) +from metadata.generated.schema.entity.services.connections.testConnectionResult import ( + TestConnectionResult, +) +from metadata.ingestion.connections.builders import ( + create_generic_db_connection, + get_connection_args_common, + get_connection_url_common, +) +from metadata.ingestion.connections.test_connections import test_connection_db_common +from metadata.ingestion.ometa.ometa_api import OpenMetadata +from metadata.ingestion.source.database.gaussdb.queries import ( + GAUSSDB_GET_DATABASE, + GAUSSDB_TEST_GET_QUERIES, + GAUSSDB_TEST_GET_TAGS, +) +from metadata.ingestion.source.database.gaussdb.utils import ( + get_gaussdb_time_column_name, +) +from metadata.utils.constants import THREE_MIN + + +def get_connection(connection: GaussdbConnection) -> Engine: + """ + Create connection + """ + + return create_generic_db_connection( + connection=connection, + get_connection_url_fn=get_connection_url_common, + get_connection_args_fn=get_connection_args_common, + ) + + +def test_connection( + metadata: OpenMetadata, + engine: Engine, + service_connection: GaussdbConnection, + automation_workflow: Optional[AutomationWorkflow] = None, + timeout_seconds: Optional[int] = THREE_MIN, +) -> TestConnectionResult: + """ + Test connection. This can be executed either as part + of a metadata workflow or during an Automation Workflow + """ + + queries = { + "GetQueries": GAUSSDB_TEST_GET_QUERIES.format( + time_column_name=get_gaussdb_time_column_name(engine=engine), + ), + "GetDatabases": GAUSSDB_GET_DATABASE, + "GetTags": GAUSSDB_TEST_GET_TAGS, + } + return test_connection_db_common( + metadata=metadata, + engine=engine, + service_connection=service_connection, + automation_workflow=automation_workflow, + queries=queries, + timeout_seconds=timeout_seconds, + ) diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/converter_orm.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/converter_orm.py new file mode 100644 index 000000000000..df369d96306e --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/converter_orm.py @@ -0,0 +1,52 @@ +# Copyright 2021 Collate +# 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. + +""" +Converter logic to transform an OpenMetadata Table Entity for Redshift +to an SQLAlchemy ORM class. +""" + +from typing import Dict, Set + +from sqlalchemy.sql.sqltypes import TypeEngine + +from metadata.generated.schema.entity.data.table import Column, DataType +from metadata.generated.schema.entity.services.databaseService import ( + DatabaseServiceType, +) +from metadata.ingestion.source.database.gaussdb.types.money import GaussdbMoney +from metadata.profiler.orm.converter.common import CommonMapTypes +from metadata.profiler.orm.converter.converter_registry import converter_registry + +_CUSTOM_TYPE_MAP = {DataType.MONEY: GaussdbMoney} +_CUSTOM_TYPE_MAP_reversed = {v: {k} for k, v in _CUSTOM_TYPE_MAP.items()} + + +class GaussdbMapTypes(CommonMapTypes): + """Gaussdb type mapper, inherits from CommonMapTypes""" + + def return_custom_type(self, col: Column, table_service_type): + return _CUSTOM_TYPE_MAP.get( + col.dataType, super().return_custom_type(col, table_service_type) + ) + + @staticmethod + def map_sqa_to_om_types() -> Dict[TypeEngine, Set[DataType]]: + """returns an ORM type""" + # pylint: disable=import-outside-toplevel + + return { + **CommonMapTypes.map_sqa_to_om_types(), + **_CUSTOM_TYPE_MAP_reversed, + } + + +converter_registry[DatabaseServiceType.Gaussdb] = GaussdbMapTypes diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/lineage.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/lineage.py new file mode 100644 index 000000000000..f1b96d17747c --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/lineage.py @@ -0,0 +1,100 @@ +# Copyright 2021 Collate +# 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. +""" +Gaussdb lineage module +""" +import traceback +from datetime import datetime +from typing import Iterable + +from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest +from metadata.generated.schema.entity.services.connections.database.gaussdbConnection import ( + GaussdbScheme, +) +from metadata.generated.schema.type.basic import DateTime +from metadata.generated.schema.type.tableQuery import TableQuery +from metadata.ingestion.api.models import Either +from metadata.ingestion.source.connections import get_connection +from metadata.ingestion.source.database.lineage_source import LineageSource +from metadata.ingestion.source.database.gaussdb.pgspider.lineage import ( + get_lineage_from_multi_tenant_table, +) +from metadata.ingestion.source.database.gaussdb.queries import GAUSSDB_SQL_STATEMENT +from metadata.ingestion.source.database.gaussdb.query_parser import ( + GaussdbQueryParserSource, +) +from metadata.utils.logger import ingestion_logger + +logger = ingestion_logger() + + +class GaussdbLineageSource(GaussdbQueryParserSource, LineageSource): + """ + Implements the necessary methods to extract + Database lineage from Gaussdb Source + """ + + sql_stmt = GAUSSDB_SQL_STATEMENT + + filters = """ + AND ( + s.query ILIKE '%%create table%%as%%select%%' + OR s.query ILIKE '%%insert%%into%%select%%' + OR s.query ILIKE '%%update%%' + OR s.query ILIKE '%%merge%%' + ) + """ + + def _iter(self, *_, **__) -> Iterable[Either[AddLineageRequest]]: + """ + Based on the query logs, prepare the lineage + and send it to the sink + """ + + yield from super()._iter() + + if self.service_connection.scheme == GaussdbScheme.pgspider_psycopg2: + lineages = get_lineage_from_multi_tenant_table( + self.metadata, + connection=self.service_connection, + service_name=self.config.serviceName, + ) + + for lineage_request in lineages or []: + yield lineage_request + + def process_table_query(self) -> Iterable[TableQuery]: + """ + Process Query + """ + try: + with get_connection(self.service_connection).connect() as conn: + rows = conn.execute(self.get_sql_statement()) + for row in rows: + row = dict(row) + try: + yield TableQuery( + dialect=self.dialect.value, + query=row["query_text"], + userName=row["usename"], + analysisDate=DateTime(datetime.now()), + aborted=self.get_aborted_status(row), + databaseName=self.get_database_name(row), + serviceName=self.config.serviceName, + databaseSchema=self.get_schema_name(row), + duration=row.get("duration"), + ) + except Exception as err: + logger.debug(traceback.format_exc()) + logger.error(str(err)) + except Exception as err: + logger.error(f"Source usage processing error - {err}") + logger.debug(traceback.format_exc()) diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/metadata.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/metadata.py new file mode 100644 index 000000000000..c135994c2b21 --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/metadata.py @@ -0,0 +1,362 @@ +# Copyright 2021 Collate +# 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. +""" +Gaussdb source module +""" +import traceback +from collections import namedtuple +from typing import Iterable, Optional, Tuple + +from sqlalchemy import String as SqlAlchemyString +from sqlalchemy import sql +from sqlalchemy.dialects.postgresql.base import PGDialect, ischema_names +from sqlalchemy.engine import Inspector + +from metadata.generated.schema.api.data.createStoredProcedure import ( + CreateStoredProcedureRequest, +) +from metadata.generated.schema.entity.data.database import Database +from metadata.generated.schema.entity.data.databaseSchema import DatabaseSchema +from metadata.generated.schema.entity.data.storedProcedure import StoredProcedureCode +from metadata.generated.schema.entity.data.table import ( + PartitionColumnDetails, + PartitionIntervalTypes, + TablePartition, + TableType, +) +from metadata.generated.schema.entity.services.connections.database.gaussdbConnection import ( + GaussdbConnection, +) +from metadata.generated.schema.entity.services.ingestionPipelines.status import ( + StackTraceError, +) +from metadata.generated.schema.metadataIngestion.workflow import ( + Source as WorkflowSource, +) +from metadata.generated.schema.type.basic import EntityName, FullyQualifiedEntityName +from metadata.ingestion.api.models import Either +from metadata.ingestion.api.steps import InvalidSourceException +from metadata.ingestion.models.ometa_classification import OMetaTagAndClassification +from metadata.ingestion.ometa.ometa_api import OpenMetadata +from metadata.ingestion.source.database.column_type_parser import create_sqlalchemy_type +from metadata.ingestion.source.database.common_db_source import ( + CommonDbSourceService, + TableNameAndType, +) +from metadata.ingestion.source.database.mssql.models import STORED_PROC_LANGUAGE_MAP +from metadata.ingestion.source.database.multi_db_source import MultiDBSource +from metadata.ingestion.source.database.gaussdb.models import GaussdbStoredProcedure +from metadata.ingestion.source.database.gaussdb.queries import ( + GAUSSDB_GET_ALL_TABLE_PG_POLICY, + GAUSSDB_GET_DB_NAMES, + GAUSSDB_GET_STORED_PROCEDURES, + GAUSSDB_GET_TABLE_NAMES, + GAUSSDB_PARTITION_DETAILS, + GAUSSDB_SCHEMA_COMMENTS, +) +from metadata.ingestion.source.database.gaussdb.utils import ( + get_column_info, + get_columns, + get_etable_owner, + get_foreign_keys, + get_json_fields_and_type, + get_table_comment, + get_table_owner, + get_view_definition, +) +from metadata.utils import fqn +from metadata.utils.filters import filter_by_database +from metadata.utils.importer import import_side_effects +from metadata.utils.logger import ingestion_logger +from metadata.utils.sqlalchemy_utils import ( + get_all_table_comments, + get_all_table_ddls, + get_all_table_owners, + get_all_view_definitions, + get_schema_descriptions, + get_table_ddl, +) +from metadata.utils.tag_utils import get_ometa_tag_and_classification + +import_side_effects( + "metadata.ingestion.source.database.gaussdb.converter_orm", + "metadata.ingestion.source.database.gaussdb.metrics", +) + +TableKey = namedtuple("TableKey", ["schema", "table_name"]) + +logger = ingestion_logger() + + +INTERVAL_TYPE_MAP = { + "list": PartitionIntervalTypes.COLUMN_VALUE, + "hash": PartitionIntervalTypes.COLUMN_VALUE, + "range": PartitionIntervalTypes.TIME_UNIT, +} + +RELKIND_MAP = { + "r": TableType.Regular, + "p": TableType.Partitioned, + "f": TableType.Foreign, +} + +GEOMETRY = create_sqlalchemy_type("GEOMETRY") +POINT = create_sqlalchemy_type("POINT") +POLYGON = create_sqlalchemy_type("POLYGON") + +ischema_names.update( + { + "geometry": GEOMETRY, + "point": POINT, + "polygon": POLYGON, + "box": create_sqlalchemy_type("BOX"), + "bpchar": SqlAlchemyString, + "circle": create_sqlalchemy_type("CIRCLE"), + "line": create_sqlalchemy_type("LINE"), + "lseg": create_sqlalchemy_type("LSEG"), + "path": create_sqlalchemy_type("PATH"), + "pg_lsn": create_sqlalchemy_type("PG_LSN"), + "pg_snapshot": create_sqlalchemy_type("PG_SNAPSHOT"), + "tsquery": create_sqlalchemy_type("TSQUERY"), + "txid_snapshot": create_sqlalchemy_type("TXID_SNAPSHOT"), + "xid": SqlAlchemyString, + "xml": create_sqlalchemy_type("XML"), + } +) + + +PGDialect.get_all_table_comments = get_all_table_comments +PGDialect.get_table_comment = get_table_comment +PGDialect._get_column_info = get_column_info # pylint: disable=protected-access +PGDialect.get_view_definition = get_view_definition +PGDialect.get_columns = get_columns +PGDialect.get_all_view_definitions = get_all_view_definitions + +PGDialect.get_all_table_owners = get_all_table_owners +PGDialect.get_table_owner = get_table_owner +PGDialect.ischema_names = ischema_names + +Inspector.get_all_table_ddls = get_all_table_ddls +Inspector.get_table_ddl = get_table_ddl +Inspector.get_table_owner = get_etable_owner +Inspector.get_json_fields_and_type = get_json_fields_and_type + +PGDialect.get_foreign_keys = get_foreign_keys + + +class GaussdbSource(CommonDbSourceService, MultiDBSource): + """ + Implements the necessary methods to extract + Database metadata from Gaussdb Source + """ + + def __init__(self, config: WorkflowSource, metadata: OpenMetadata): + super().__init__(config, metadata) + self.schema_desc_map = {} + + @classmethod + def create( + cls, config_dict, metadata: OpenMetadata, pipeline_name: Optional[str] = None + ): + config: WorkflowSource = WorkflowSource.model_validate(config_dict) + connection: GaussdbConnection = config.serviceConnection.root.config + if not isinstance(connection, GaussdbConnection): + raise InvalidSourceException( + f"Expected GaussdbConnection, but got {connection}" + ) + return cls(config, metadata) + + def get_schema_description(self, schema_name: str) -> Optional[str]: + """ + Method to fetch the schema description + """ + return self.schema_desc_map.get(schema_name) + + def set_schema_description_map(self) -> None: + self.schema_desc_map = get_schema_descriptions( + self.engine, GAUSSDB_SCHEMA_COMMENTS + ) + + def query_table_names_and_types( + self, schema_name: str + ) -> Iterable[TableNameAndType]: + """ + Overwrite the inspector implementation to handle partitioned + and foreign types + """ + result = self.connection.execute( + sql.text(GAUSSDB_GET_TABLE_NAMES), + {"schema": schema_name}, + ) + + return [ + TableNameAndType( + name=name, type_=RELKIND_MAP.get(relkind, TableType.Regular) + ) + for name, relkind in result + ] + + def get_configured_database(self) -> Optional[str]: + if not self.service_connection.ingestAllDatabases: + return self.service_connection.database + return None + + def get_database_names_raw(self) -> Iterable[str]: + yield from self._execute_database_query(GAUSSDB_GET_DB_NAMES) + + def get_database_names(self) -> Iterable[str]: + if not self.config.serviceConnection.root.config.ingestAllDatabases: + configured_db = self.config.serviceConnection.root.config.database + self.set_inspector(database_name=configured_db) + self.set_schema_description_map() + yield configured_db + else: + for new_database in self.get_database_names_raw(): + database_fqn = fqn.build( + self.metadata, + entity_type=Database, + service_name=self.context.get().database_service, + database_name=new_database, + ) + + if filter_by_database( + self.source_config.databaseFilterPattern, + ( + database_fqn + if self.source_config.useFqnForFiltering + else new_database + ), + ): + self.status.filter(database_fqn, "Database Filtered Out") + continue + + try: + self.set_inspector(database_name=new_database) + self.set_schema_description_map() + yield new_database + except Exception as exc: + logger.debug(traceback.format_exc()) + logger.error( + f"Error trying to connect to database {new_database}: {exc}" + ) + + def get_table_partition_details( + self, table_name: str, schema_name: str, inspector + ) -> Tuple[bool, TablePartition]: + result = self.engine.execute( + GAUSSDB_PARTITION_DETAILS, table_name=table_name, schema_name=schema_name + ).all() + + if result: + partition_details = TablePartition( + columns=[ + PartitionColumnDetails( + columnName=row.column_name, + intervalType=INTERVAL_TYPE_MAP.get( + row.partition_strategy, PartitionIntervalTypes.COLUMN_VALUE + ), + interval=None, + ) + for row in result + if row.column_name + ] + ) + return True, partition_details + return False, None + + def yield_tag( + self, schema_name: str + ) -> Iterable[Either[OMetaTagAndClassification]]: + """ + Fetch Tags + """ + try: + result = self.engine.execute( + GAUSSDB_GET_ALL_TABLE_PG_POLICY.format( + database_name=self.context.get().database, + schema_name=schema_name, + ) + ).all() + for res in result: + row = list(res) + fqn_elements = [name for name in row[2:] if name] + yield from get_ometa_tag_and_classification( + tag_fqn=FullyQualifiedEntityName( + fqn._build( # pylint: disable=protected-access + self.context.get().database_service, *fqn_elements + ) + ), + tags=[row[1]], + classification_name=self.service_connection.classificationName, + tag_description="Gaussdb Tag Value", + classification_description="Gaussdb Tag Name", + ) + + except Exception as exc: + yield Either( + left=StackTraceError( + name="Tags and Classification", + error=f"Skipping Policy Tag: {exc}", + stackTrace=traceback.format_exc(), + ) + ) + + def get_stored_procedures(self) -> Iterable[GaussdbStoredProcedure]: + """List stored procedures""" + if self.source_config.includeStoredProcedures: + results = self.engine.execute(GAUSSDB_GET_STORED_PROCEDURES).all() + for row in results: + try: + stored_procedure = GaussdbStoredProcedure.model_validate( + dict(row._mapping) + ) + yield stored_procedure + except Exception as exc: + logger.error() + self.status.failed( + error=StackTraceError( + name=dict(row).get("name", "UNKNOWN"), + error=f"Error parsing Stored Procedure payload: {exc}", + stackTrace=traceback.format_exc(), + ) + ) + + def yield_stored_procedure( + self, stored_procedure + ) -> Iterable[Either[CreateStoredProcedureRequest]]: + """Prepare the stored procedure payload""" + try: + stored_procedure_request = CreateStoredProcedureRequest( + name=EntityName(stored_procedure.name), + description=None, + storedProcedureCode=StoredProcedureCode( + language=STORED_PROC_LANGUAGE_MAP.get(stored_procedure.language), + code=stored_procedure.definition, + ), + databaseSchema=fqn.build( + metadata=self.metadata, + entity_type=DatabaseSchema, + service_name=self.context.get().database_service, + database_name=self.context.get().database, + schema_name=self.context.get().database_schema, + ), + ) + yield Either(right=stored_procedure_request) + self.register_record_stored_proc_request(stored_procedure_request) + + except Exception as exc: + yield Either( + left=StackTraceError( + name=stored_procedure.name, + error=f"Error yielding Stored Procedure [{stored_procedure.name}] due to [{exc}]", + stackTrace=traceback.format_exc(), + ) + ) diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/metrics.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/metrics.py new file mode 100644 index 000000000000..2fcb0b26d6f8 --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/metrics.py @@ -0,0 +1,42 @@ +from sqlalchemy.ext.compiler import compiles + +from metadata.ingestion.source.database.gaussdb.types.money import GaussdbMoney +from metadata.profiler.metrics.static.mean import AvgFn +from metadata.profiler.metrics.static.stddev import StdDevFn +from metadata.profiler.orm.functions.median import MedianFn +from metadata.profiler.orm.registry import Dialects + + +@compiles(AvgFn, Dialects.Gaussdb) +def avg(element, compiler, **kw): + """ + Cast to decimal to get around potential integer overflow error + """ + proc = compiler.process(element.clauses, **kw) + if isinstance(list(element.clauses)[0].type, GaussdbMoney): + return f"{element.name}({GaussdbMoney.compile_as_float(proc)})" + return f"{element.name}({proc})" + + +@compiles(StdDevFn, Dialects.Gaussdb) +def stddev(element, compiler, **kw): + """Returns stdv for clickhouse database and handle empty tables. + If table is empty, clickhouse returns NaN. + """ + proc = compiler.process(element.clauses, **kw) + if isinstance(list(element.clauses)[0].type, GaussdbMoney): + return f"STDDEV_POP({GaussdbMoney.compile_as_float(proc)})" + return f"STDDEV_POP({proc})" + + +@compiles(MedianFn, Dialects.Gaussdb) +def median(elements, compiler, **kwargs): # pylint: disable=unused-argument + col, _, percentile = [ + compiler.process(element, **kwargs) for element in elements.clauses + ] + if isinstance(list(elements.clauses)[0], GaussdbMoney): + return "percentile_cont(%.2f) WITHIN GROUP (ORDER BY %s ASC)" % ( + percentile, + GaussdbMoney.compile_as_float(col), + ) + return MedianFn.default_fn(elements, compiler, **kwargs) diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/models.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/models.py new file mode 100644 index 000000000000..2ec6e3caaaae --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/models.py @@ -0,0 +1,25 @@ +# Copyright 2024 Collate +# 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. +""" +Gaussdb models +""" +from typing import Optional + +from pydantic import BaseModel, Field + + +class GaussdbStoredProcedure(BaseModel): + """Gaussdb stored procedure list query results""" + + name: str = Field(alias="procedure_name") + schema: str = Field(alias="schema_name") + definition: str + language: Optional[str] = None diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/__init__.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/lineage.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/lineage.py new file mode 100644 index 000000000000..0d877b73c15a --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/lineage.py @@ -0,0 +1,123 @@ +# Copyright 2021 Collate +# Portions Copyright(c) 2023, TOSHIBA CORPORATION +# 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. +""" +PGSpider lineage module +""" +from typing import Iterable, Iterator + +from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest +from metadata.generated.schema.type.entityLineage import ( + ColumnLineage, + EntitiesEdge, + LineageDetails, +) +from metadata.generated.schema.type.entityReference import EntityReference +from metadata.ingestion.api.models import Either +from metadata.ingestion.lineage.sql_lineage import search_table_entities +from metadata.ingestion.ometa.ometa_api import OpenMetadata +from metadata.ingestion.source.connections import get_connection +from metadata.ingestion.source.database.gaussdb.pgspider.queries import ( + PGSPIDER_GET_CHILD_TABLES, + PGSPIDER_GET_MULTI_TENANT_TABLES, +) + + +def _get_multi_tenant_tables(connection) -> Iterable[any]: + """ + Get list of multi tenant tables from PGSpider + """ + sql = PGSPIDER_GET_MULTI_TENANT_TABLES + + with get_connection(connection).connect() as conn: + rows = conn.execute(sql) + return rows + + +def _get_child_tables(connection, multi_tenant_table: str) -> Iterable[any]: + """ + Get list of child foreign tables of a multi-tenant table + """ + sql = PGSPIDER_GET_CHILD_TABLES.format(multi_tenant_table=multi_tenant_table) + + with get_connection(connection).connect() as conn: + rows = conn.execute(sql) + return rows + + +# For column level lineage, find all pairs of columns which have +# the same name and create LineageDetails. +def _get_column_lineages(source_entity, target_entity): + column_lineages = [] + for source_column in source_entity.columns: + for target_column in target_entity.columns: + if source_column.name == target_column.name: + column_lineages.append( + ColumnLineage( + fromColumns=[source_column.fullyQualifiedName.root], + toColumn=target_column.fullyQualifiedName.root, + ) + ) + break + return column_lineages + + +def get_lineage_from_multi_tenant_table( + metadata: OpenMetadata, + connection: any, + service_name: str, +) -> Iterator[Either[AddLineageRequest]]: + """ + For PGSpider, firstly, get list of multi-tenant tables. + Next, get child foreign tables of each multi-tenant tables. + Get entities of source and target table to create Lineage request. + """ + for multi_tenant_table in _get_multi_tenant_tables(connection): + database = multi_tenant_table["database"] + schema = multi_tenant_table["nspname"] + target_table = multi_tenant_table["relname"] + target_entities = search_table_entities( + metadata=metadata, + service_name=service_name, + database=database, + database_schema=schema, + table=target_table, + ) + + for child_foreign_table in _get_child_tables(connection, target_table): + source_entities = search_table_entities( + metadata=metadata, + service_name=service_name, + database=database, + database_schema=schema, + table=child_foreign_table["relname"], + ) + + for target_entity in target_entities: + for source_entity in source_entities: + column_lineages = _get_column_lineages(source_entity, target_entity) + lineage_details = LineageDetails( + columnsLineage=column_lineages, + ) + yield Either( + left=None, + right=AddLineageRequest( + edge=EntitiesEdge( + fromEntity=EntityReference( + id=source_entity.id, type="table" + ), + toEntity=EntityReference( + id=target_entity.id, type="table" + ), + lineageDetails=lineage_details, + ) + ), + ) diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/queries.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/queries.py new file mode 100644 index 000000000000..59be86a6311a --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/pgspider/queries.py @@ -0,0 +1,45 @@ +# Copyright(c) 2023, TOSHIBA CORPORATION +# 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. +""" +SQL Queries used during ingestion +""" + +import textwrap + +PGSPIDER_GET_MULTI_TENANT_TABLES = textwrap.dedent( + """ + SELECT + c.relname, ns.nspname, current_database() as database + FROM + pg_class c + JOIN pg_namespace ns ON c.relnamespace = ns.oid + JOIN pg_foreign_table ft ON c.oid = ft.ftrelid + JOIN pg_foreign_server fs ON ft.ftserver = fs.oid + JOIN pg_foreign_data_wrapper fdw ON fs.srvfdw = fdw.oid + WHERE + fdw.fdwname = 'pgspider_core_fdw' + """ +) + +PGSPIDER_GET_CHILD_TABLES = textwrap.dedent( + """ + WITH srv AS + (SELECT srvname FROM pg_foreign_table ft + JOIN pg_foreign_server fs ON ft.ftserver = fs.oid GROUP BY srvname ORDER BY srvname), + regex_pattern AS + (SELECT '^' || relname || '\\_\\_' || srv.srvname || '\\_\\_[0-9]+$' regex FROM pg_class + CROSS JOIN srv where relname = '{multi_tenant_table}') + SELECT relname FROM pg_class + WHERE (relname ~ (SELECT string_agg(regex, '|') FROM regex_pattern)) + AND (relname NOT LIKE '%%\\_%%\\_seq') + ORDER BY relname; + """ +) diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/queries.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/queries.py new file mode 100644 index 000000000000..0434935ca874 --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/queries.py @@ -0,0 +1,311 @@ +# Copyright 2021 Collate +# 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. +""" +SQL Queries used during ingestion +""" + +import textwrap + +GAUSSDB_SQL_STATEMENT = textwrap.dedent( + """ + SELECT + u.usename, + d.datname database_name, + s.query query_text, + s.{time_column_name} duration + FROM + dbe_perf.statement s + JOIN pg_catalog.pg_database d ON s.db_id = d.oid + JOIN pg_catalog.pg_user u ON s.user_id = u.usesysid + WHERE + s.query NOT LIKE '/* {{"app": "OpenMetadata", %%}} */%%' AND + s.query NOT LIKE '/* {{"app": "dbt", %%}} */%%' + {filters} + LIMIT {result_limit} + """ +) + +# r = ordinary table, v = view, m = materialized view, c = composite type, f = foreign table, p = partitioned table, +GAUSSDB_GET_TABLE_NAMES = """ + SELECT c.relname, c.relkind FROM pg_class c + JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE n.nspname = :schema AND c.relkind in ('r', 'p', 'f') AND c.parttype='n' +""" +GAUSSDB_TABLE_OWNERS = """ +select schemaname, tablename, tableowner from pg_catalog.pg_tables where schemaname <> 'pg_catalog' order by schemaname,tablename; +""" +GAUSSDB_PARTITION_DETAILS = textwrap.dedent( + """ + select + ns.nspname as schema, + par.relname as table_name, + partition_strategy, + col.column_name + from + (select + parentid partrelid, + array_length(partkey, 1) partnatts, + case partstrategy + when 'l' then 'list' + when 'h' then 'hash' + when 'r' then 'range' end as partition_strategy, + unnest(partkey) column_index + from + pg_partition) pt + join + pg_class par + on + par.oid = pt.partrelid + join pg_namespace ns + on par.relnamespace=ns.oid + left join + information_schema.columns col + on + col.table_schema = ns.nspname + and col.table_name = par.relname + and col.ordinal_position = pt.column_index + where par.relname=%(table_name)s and ns.nspname=%(schema_name)s + """ +) + +GAUSSDB_GET_ALL_TABLE_PG_POLICY = """ +SELECT object_id, polname, table_catalog, table_schema, table_name +FROM information_schema.tables AS it +JOIN (SELECT pc.oid as object_id, pc.relname, pp.* + FROM pg_rlspolicy AS pp + JOIN pg_class AS pc ON pp.polrelid = pc.oid + JOIN pg_namespace as pn ON pc.relnamespace = pn.oid) AS ppr ON it.table_name = ppr.relname +WHERE it.table_schema='{schema_name}' AND it.table_catalog='{database_name}'; +""" + +GAUSSDB_SCHEMA_COMMENTS = """ + SELECT n.nspname AS schema_name, + d.description AS comment + FROM pg_catalog.pg_namespace n + LEFT JOIN pg_catalog.pg_description d ON d.objoid = n.oid AND d.objsubid = 0; +""" + +GAUSSDB_TABLE_COMMENTS = """ + SELECT n.nspname as schema, + c.relname as table_name, + pgd.description as table_comment + FROM pg_catalog.pg_class c + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace + LEFT JOIN pg_catalog.pg_description pgd ON pgd.objsubid = 0 AND pgd.objoid = c.oid + WHERE c.relkind in ('r', 'v', 'm', 'f', 'p') + AND pgd.description IS NOT NULL + AND n.nspname <> 'pg_catalog' + ORDER BY "schema", "table_name" +""" + +# GAUSSDB views definitions only contains the select query +# hence we are appending "create view . as " to select query +# to generate the column level lineage +GAUSSDB_VIEW_DEFINITIONS = """ +SELECT + n.nspname "schema", + c.relname view_name, + 'create view ' || n.nspname || '.' || c.relname || ' as ' || pg_get_viewdef(c.oid,true) view_def +FROM pg_class c +JOIN pg_namespace n ON n.oid = c.relnamespace +WHERE c.relkind IN ('v', 'm') +AND n.nspname not in ('pg_catalog','information_schema') +""" + +GAUSSDB_GET_DATABASE = """ +select datname from pg_catalog.pg_database +""" + +GAUSSDB_TEST_GET_TAGS = """ +SELECT object_id, polname, table_catalog , table_schema ,table_name +FROM information_schema.tables AS it +JOIN (SELECT pc.oid as object_id, pc.relname, pp.* + FROM pg_rlspolicy AS pp + JOIN pg_class AS pc ON pp.polrelid = pc.oid + JOIN pg_namespace as pn ON pc.relnamespace = pn.oid) AS ppr ON it.table_name = ppr.relname + LIMIT 1 +""" + +GAUSSDB_TEST_GET_QUERIES = """ + SELECT + u.usename, + d.datname database_name, + s.query query_text, + s.{time_column_name} duration + FROM + dbe_perf.statement s + JOIN pg_catalog.pg_database d ON s.db_id = d.oid + JOIN pg_catalog.pg_user u ON s.user_id = u.usesysid + LIMIT 1 + """ + + +GAUSSDB_GET_DB_NAMES = """ +select datname from pg_catalog.pg_database +""" + +GAUSSDB_COL_IDENTITY = """\ + (SELECT json_build_object( + 'always', a.attidentity = 'a', + 'start', s.last_number, + 'increment', s.increment_by, + 'minvalue', s.min_value, + 'maxvalue', s.max_value, + 'cache', s.cache_size, + 'cycle', s.cycle_flag) + FROM ADM_SEQUENCES s + JOIN PG_STATIO_ALL_SEQUENCES p on p.relname=s.sequence_name + JOIN pg_catalog.pg_class c on p.relid = c."oid" + WHERE c.relkind = 'S' + AND a.attidentity != '' + AND s.seqrelid = pg_catalog.pg_get_serial_sequence( + a.attrelid::regclass::text, a.attname + )::regclass::oid + ) as identity_options\ +""" + +GAUSSDB_SQL_COLUMNS = """ + SELECT a.attname, + pg_catalog.format_type(a.atttypid, a.atttypmod), + ( + SELECT pg_catalog.pg_get_expr(d.adbin, d.adrelid) + FROM pg_catalog.pg_attrdef d + WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum + AND a.atthasdef + ) AS DEFAULT, + a.attnotnull, + a.attrelid as table_oid, + pgd.description as comment, + {generated}, + {identity} + FROM pg_catalog.pg_attribute a + LEFT JOIN pg_catalog.pg_description pgd ON ( + pgd.objoid = a.attrelid AND pgd.objsubid = a.attnum) + WHERE a.attrelid = :table_oid + AND a.attnum > 0 AND NOT a.attisdropped + ORDER BY a.attnum + """ + +GAUSSDB_GET_SERVER_VERSION = """ +show server_version +""" + +GAUSSDB_FETCH_FK = """ + SELECT r.conname, + pg_catalog.pg_get_constraintdef(r.oid, true) as condef, + n.nspname as conschema, + d.datname AS con_db_name + FROM pg_catalog.pg_constraint r, + pg_namespace n, + pg_class c + JOIN pg_database d ON d.datname = current_database() + WHERE r.conrelid = :table AND + r.contype = 'f' AND + c.oid = confrelid AND + n.oid = c.relnamespace + ORDER BY 1 +""" + +GAUSSDB_GET_JSON_FIELDS = """ + WITH RECURSIVE json_hierarchy AS ( + SELECT + key AS path, + json_typeof(value) AS type, + value, + json_build_object() AS properties, + key AS title + FROM + {table_name} tbd, + LATERAL json_each({column_name}::json) + ), + build_hierarchy AS ( + SELECT + path, + type, + title, + CASE + WHEN type = 'object' THEN + json_build_object( + 'title', title, + 'type', 'object', + 'properties', ( + SELECT json_object_agg( + key, + json_build_object( + 'title', key, + 'type', json_typeof(value), + 'properties', ( + CASE + WHEN json_typeof(value) = 'object' THEN + ( + SELECT json_object_agg( + key, + json_build_object( + 'title', key, + 'type', json_typeof(value), + 'properties', + json_build_object() + ) + ) + FROM json_each(value::json) AS sub_key_value + ) + ELSE json_build_object() + END + ) + ) + ) + FROM json_each(value::json) AS key_value + ) + ) + WHEN type = 'array' THEN + json_build_object( + 'title', title, + 'type', 'array', + 'properties', json_build_object() + ) + ELSE + json_build_object( + 'title', title, + 'type', type + ) + END AS hierarchy + FROM + json_hierarchy + ), + aggregate_hierarchy AS ( + select + json_build_object( + 'title','{column_name}', + 'type','object', + 'properties', + json_object_agg( + path, + hierarchy + )) AS result + FROM + build_hierarchy + ) + SELECT + result + FROM + aggregate_hierarchy; +""" + +GAUSSDB_GET_STORED_PROCEDURES = """ + SELECT proname AS procedure_name, + nspname AS schema_name, + proargtypes AS argument_types, + prorettype::regtype AS return_type, + prosrc AS definition + FROM pg_proc + JOIN pg_namespace ON pg_proc.pronamespace = pg_namespace.oid + WHERE prokind = 'p'; +""" diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/query_parser.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/query_parser.py new file mode 100644 index 000000000000..dad190b80990 --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/query_parser.py @@ -0,0 +1,104 @@ +# Copyright 2021 Collate +# 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. +""" +Gaussdb Query parser module +""" +import traceback +from abc import ABC +from typing import Iterable, Optional + +from sqlalchemy.engine.base import Engine + +from metadata.generated.schema.entity.services.connections.database.gaussdbConnection import ( + GaussdbConnection, +) +from metadata.generated.schema.metadataIngestion.workflow import ( + Source as WorkflowSource, +) +from metadata.generated.schema.type.tableQuery import TableQuery +from metadata.ingestion.api.steps import InvalidSourceException +from metadata.ingestion.ometa.ometa_api import OpenMetadata +from metadata.ingestion.source.connections import get_connection +from metadata.ingestion.source.database.gaussdb.queries import GAUSSDB_GET_DATABASE +from metadata.ingestion.source.database.gaussdb.utils import ( + get_gaussdb_time_column_name, +) +from metadata.ingestion.source.database.query_parser_source import QueryParserSource +from metadata.utils.helpers import get_start_and_end +from metadata.utils.logger import ingestion_logger + +logger = ingestion_logger() + + +class GaussdbQueryParserSource(QueryParserSource, ABC): + """ + Gaussdb base for Usage and Lineage + """ + + filters: str + + def __init__(self, config: WorkflowSource, metadata: OpenMetadata): + super().__init__(config, metadata) + duration = min(self.source_config.queryLogDuration, 6) + self.start, self.end = get_start_and_end(duration) + + @classmethod + def create( + cls, config_dict, metadata: OpenMetadata, pipeline_name: Optional[str] = None + ): + config: WorkflowSource = WorkflowSource.model_validate(config_dict) + connection: GaussdbConnection = config.serviceConnection.root.config + if not isinstance(connection, GaussdbConnection): + raise InvalidSourceException( + f"Expected GaussdbConnection, but got {connection}" + ) + return cls(config, metadata) + + def get_sql_statement(self, *_) -> str: + """ + returns sql statement to fetch query logs. + We don't use any start or end times as they are not available + """ + return self.sql_stmt.format( + result_limit=self.config.sourceConfig.config.resultLimit, + filters=self.get_filters(), + time_column_name=get_gaussdb_time_column_name(engine=self.engine), + ) + + # pylint: disable=no-member + def get_table_query(self) -> Iterable[TableQuery]: + try: + if self.config.sourceConfig.config.queryLogFilePath: + yield from super().yield_table_queries_from_logs() + else: + database = self.config.serviceConnection.root.config.database + if database: + self.engine: Engine = get_connection(self.service_connection) + yield from self.process_table_query() + else: + results = self.engine.execute(GAUSSDB_GET_DATABASE) + for res in results: + row = list(res) + logger.info(f"Ingesting from database: {row[0]}") + self.config.serviceConnection.root.config.database = row[0] + self.engine = get_connection(self.service_connection) + yield from self.process_table_query() + + except Exception as err: + logger.error(f"Source usage processing error - {err}") + logger.debug(traceback.format_exc()) + + @staticmethod + def get_database_name(data: dict) -> str: + """ + Method to get database name + """ + return data.get("database_name") diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/service_spec.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/service_spec.py new file mode 100644 index 000000000000..3bea308b164a --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/service_spec.py @@ -0,0 +1,10 @@ +from metadata.ingestion.source.database.postgres.lineage import PostgresLineageSource +from metadata.ingestion.source.database.postgres.metadata import PostgresSource +from metadata.ingestion.source.database.postgres.usage import PostgresUsageSource +from metadata.utils.service_spec.default import DefaultDatabaseSpec + +ServiceSpec = DefaultDatabaseSpec( + metadata_source_class=PostgresSource, + lineage_source_class=PostgresLineageSource, + usage_source_class=PostgresUsageSource, +) diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/types/money.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/types/money.py new file mode 100644 index 000000000000..5d092f1724f9 --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/types/money.py @@ -0,0 +1,37 @@ +# Copyright 2021 Collate +# 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. + +""" +Custom sqlalchemy type for Postgres MONEY type +""" + + +from sqlalchemy.dialects.postgresql import MONEY +from sqlalchemy.sql.sqltypes import String + +from metadata.utils.logger import ingestion_logger + +logger = ingestion_logger() + + +class GaussdbMoney(MONEY): + """Wrapper for gaussdb MONEY type""" + + impl = String + cache_ok = True + + @property + def quantifiable(self): + return True + + @staticmethod + def compile_as_float(expr: str) -> str: + return f"(({expr})::numeric::float8)" diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/usage.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/usage.py new file mode 100644 index 000000000000..e596f8c3f7a6 --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/usage.py @@ -0,0 +1,82 @@ +# Copyright 2021 Collate +# 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. +""" +Gaussdb usage module +""" +import traceback +from datetime import datetime +from typing import Iterable + +from metadata.generated.schema.type.basic import DateTime +from metadata.generated.schema.type.tableQuery import TableQueries, TableQuery +from metadata.ingestion.source.connections import get_connection +from metadata.ingestion.source.database.gaussdb.queries import GAUSSDB_SQL_STATEMENT +from metadata.ingestion.source.database.gaussdb.query_parser import ( + GaussdbQueryParserSource, +) +from metadata.ingestion.source.database.usage_source import UsageSource +from metadata.utils.logger import ingestion_logger + +logger = ingestion_logger() + + +class GaussdbUsageSource(GaussdbQueryParserSource, UsageSource): + """ + Gaussdb class for Usage + """ + + sql_stmt = GAUSSDB_SQL_STATEMENT + filters = "" + + def process_table_query(self) -> Iterable[TableQueries]: + """ + Process Query + """ + query = None + try: + query = self.get_sql_statement() + with get_connection(self.service_connection).connect() as conn: + rows = conn.execute(query) + queries = [] + for row in rows: + row = dict(row) + try: + queries.append( + TableQuery( + dialect=self.dialect.value, + query=row["query_text"], + userName=row["usename"], + analysisDate=DateTime(datetime.now()), + aborted=self.get_aborted_status(row), + databaseName=self.get_database_name(row), + serviceName=self.config.serviceName, + databaseSchema=self.get_schema_name(row), + duration=row.get("duration"), + ) + ) + except Exception as err: + logger.debug(traceback.format_exc()) + logger.error(str(err)) + if queries: + yield TableQueries(queries=queries) + except Exception as err: + if query: + logger.debug( + f"###### USAGE QUERY #######\n{query}\n##########################" + ) + logger.error(f"Source usage processing error - {err}") + logger.debug(traceback.format_exc()) + + def get_filters(self) -> str: + if filter_condition := self.source_config.filterCondition: + filter_condition = filter_condition.replace("%", "%%") + return f"{self.filters} AND s.{filter_condition}" + return self.filters diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/utils.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/utils.py new file mode 100644 index 000000000000..e39c91f53736 --- /dev/null +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/utils.py @@ -0,0 +1,545 @@ +# Copyright 2021 Collate +# 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. +# pylint: disable=protected-access + +""" +Gaussdb SQLAlchemy util methods +""" +import json +import re +import traceback +from typing import Dict, Optional, Tuple + +from packaging import version +from sqlalchemy import sql, util +from sqlalchemy.dialects.postgresql.base import ENUM +from sqlalchemy.engine import reflection +from sqlalchemy.sql import sqltypes + +from metadata.generated.schema.entity.data.table import Column +from metadata.ingestion.source.database.gaussdb.queries import ( + GAUSSDB_COL_IDENTITY, + GAUSSDB_FETCH_FK, + GAUSSDB_GET_JSON_FIELDS, + GAUSSDB_GET_SERVER_VERSION, + GAUSSDB_SQL_COLUMNS, + GAUSSDB_TABLE_COMMENTS, + GAUSSDB_TABLE_OWNERS, + GAUSSDB_VIEW_DEFINITIONS, +) +from metadata.parsers.json_schema_parser import parse_json_schema +from metadata.utils.logger import utils_logger +from metadata.utils.sqlalchemy_utils import ( + get_table_comment_wrapper, + get_table_owner_wrapper, + get_view_definition_wrapper, +) + +logger = utils_logger() + +OLD_GAUSSDB_VERSION = "2.0" + + +def get_etable_owner( + self, connection, table_name=None, schema=None +): # pylint: disable=unused-argument + """Return all owners. + + :param schema: Optional, retrieve names from a non-default schema. + For special quoting, use :class:`.quoted_name`. + + """ + + with self._operation_context() as conn: + return self.dialect.get_table_owner( + connection=conn, + query=GAUSSDB_TABLE_OWNERS, + table_name=table_name, + schema=schema, + ) + + +@reflection.cache +def get_foreign_keys( + self, connection, table_name, schema=None, gaussdb_ignore_search_path=False, **kw +): + preparer = self.identifier_preparer + table_oid = self.get_table_oid( + connection, table_name, schema, info_cache=kw.get("info_cache") + ) + + FK_REGEX = re.compile( + r"FOREIGN KEY \((.*?)\) REFERENCES (?:(.*?)\.)?(.*?)\((.*?)\)" + r"[\s]?(MATCH (FULL|PARTIAL|SIMPLE)+)?" + r"[\s]?(ON UPDATE " + r"(CASCADE|RESTRICT|NO ACTION|SET NULL|SET DEFAULT)+)?" + r"[\s]?(ON DELETE " + r"(CASCADE|RESTRICT|NO ACTION|SET NULL|SET DEFAULT)+)?" + r"[\s]?(DEFERRABLE|NOT DEFERRABLE)?" + r"[\s]?(INITIALLY (DEFERRED|IMMEDIATE)+)?" + ) + + t = sql.text(GAUSSDB_FETCH_FK).columns( + conname=sqltypes.Unicode, condef=sqltypes.Unicode, con_db_name=sqltypes.Unicode + ) + c = connection.execute(t, dict(table=table_oid)) + fkeys = [] + for conname, condef, conschema, con_db_name in c.fetchall(): + m = re.search(FK_REGEX, condef).groups() + + ( + constrained_columns, + referred_schema, + referred_table, + referred_columns, + _, + match, + _, + onupdate, + _, + ondelete, + deferrable, + _, + initially, + ) = m + + if deferrable is not None: + deferrable = True if deferrable == "DEFERRABLE" else False + constrained_columns = tuple(re.split(r"\s*,\s*", constrained_columns)) + constrained_columns = [ + preparer._unquote_identifier(x) for x in constrained_columns + ] + + if gaussdb_ignore_search_path: + # when ignoring search path, we use the actual schema + # provided it isn't the "default" schema + if conschema != self.default_schema_name: + referred_schema = conschema + else: + referred_schema = schema + elif referred_schema: + # referred_schema is the schema that we regexp'ed from + # pg_get_constraintdef(). If the schema is in the search + # path, pg_get_constraintdef() will give us None. + referred_schema = preparer._unquote_identifier(referred_schema) + elif schema is not None and schema == conschema: + # If the actual schema matches the schema of the table + # we're reflecting, then we will use that. + referred_schema = schema + + referred_table = preparer._unquote_identifier(referred_table) + referred_columns = tuple(re.split(r"\s*,\s", referred_columns)) + referred_columns = [preparer._unquote_identifier(x) for x in referred_columns] + options = { + k: v + for k, v in [ + ("onupdate", onupdate), + ("ondelete", ondelete), + ("initially", initially), + ("deferrable", deferrable), + ("match", match), + ] + if v is not None and v != "NO ACTION" + } + referred_database = con_db_name if con_db_name else "" + fkey_d = { + "name": conname, + "constrained_columns": constrained_columns, + "referred_schema": referred_schema, + "referred_table": referred_table, + "referred_columns": referred_columns, + "options": options, + "referred_database": referred_database, + } + fkeys.append(fkey_d) + return fkeys + + +@reflection.cache +def get_table_owner( + self, connection, table_name, schema=None, **kw +): # pylint: disable=unused-argument + return get_table_owner_wrapper( + self, + connection=connection, + query=GAUSSDB_TABLE_OWNERS, + table_name=table_name, + schema=schema, + ) + + +@reflection.cache +def get_table_comment( + self, connection, table_name, schema=None, **kw +): # pylint: disable=unused-argument + return get_table_comment_wrapper( + self, + connection, + table_name=table_name, + schema=schema, + query=GAUSSDB_TABLE_COMMENTS, + ) + + +@reflection.cache +def get_json_fields_and_type( + self, table_name, column_name, schema=None, **kw +): # pylint: disable=unused-argument + try: + query = GAUSSDB_GET_JSON_FIELDS.format( + table_name=table_name, column_name=column_name + ) + cursor = self.engine.execute(query) + result = cursor.fetchone() + if result: + parsed_column = parse_json_schema(json.dumps(result[0]), Column) + if parsed_column: + return parsed_column[0].children + except Exception as err: + logger.warning( + f"Unable to parse the json fields for {table_name}.{column_name} - {err}" + ) + logger.debug(traceback.format_exc()) + return None + + +@reflection.cache +def get_columns( # pylint: disable=too-many-locals + self, connection, table_name, schema=None, **kw +): + """ + Overriding the dialect method to add raw_data_type in response + """ + + table_oid = self.get_table_oid( + connection, table_name, schema, info_cache=kw.get("info_cache") + ) + + generated = ( + "a.attgenerated as generated" + if self.server_version_info >= (12,) + else "NULL as generated" + ) + if self.server_version_info >= (10,): + # a.attidentity != '' is required or it will reflect also + # serial columns as identity. + identity = GAUSSDB_COL_IDENTITY + else: + identity = "NULL as identity_options" + + sql_col_query = GAUSSDB_SQL_COLUMNS.format( + generated=generated, + identity=identity, + ) + sql_col_query = ( + sql.text(sql_col_query) + .bindparams(sql.bindparam("table_oid", type_=sqltypes.Integer)) + .columns(attname=sqltypes.Unicode, default=sqltypes.Unicode) + ) + conn = connection.execute(sql_col_query, {"table_oid": table_oid}) + rows = conn.fetchall() + + # dictionary with (name, ) if default search path or (schema, name) + # as keys + domains = self._load_domains(connection) + + # dictionary with (name, ) if default search path or (schema, name) + # as keys + enums = dict( + ((rec["name"],), rec) if rec["visible"] else ((rec["schema"], rec["name"]), rec) + for rec in self._load_enums(connection, schema="*") + ) + + # format columns + columns = [] + + for ( + name, + format_type, + default_, + notnull, + table_oid, + comment, + generated, + identity, + ) in rows: + column_info = self._get_column_info( + name, + format_type, + default_, + notnull, + domains, + enums, + schema, + comment, + generated, + identity, + ) + column_info["system_data_type"] = format_type + columns.append(column_info) + return columns + + +def _get_numeric_args(charlen): + if charlen: + prec, scale = charlen.split(",") + return (int(prec), int(scale)) + return () + + +def _get_interval_args(charlen, attype, kwargs: Dict): + field_match = re.match(r"interval (.+)", attype, re.I) + if charlen: + kwargs["precision"] = int(charlen) + if field_match: + kwargs["fields"] = field_match.group(1) + attype = "interval" + return (), attype, kwargs + + +def _get_bit_var_args(charlen, kwargs): + kwargs["varying"] = True + if charlen: + return (int(charlen),), kwargs + + return (), kwargs + + +def get_column_args( + charlen: str, args: Tuple, kwargs: Dict, attype: str +) -> Tuple[Tuple, Dict]: + """ + Method to determine the args and kwargs + """ + if attype == "numeric": + args = _get_numeric_args(charlen) + elif attype == "double precision": + args = (53,) + elif attype == "integer": + args = () + elif attype in ("timestamp with time zone", "time with time zone"): + kwargs["timezone"] = True + if charlen: + kwargs["precision"] = int(charlen) + args = () + elif attype in ( + "timestamp without time zone", + "time without time zone", + "time", + ): + kwargs["timezone"] = False + if charlen: + kwargs["precision"] = int(charlen) + args = () + elif attype == "bit varying": + args, kwargs = _get_bit_var_args(charlen, kwargs) + elif attype == "geometry": + args = () + elif attype.startswith("interval"): + args, attype, kwargs = _get_interval_args(charlen, attype, kwargs) + elif charlen: + args = (int(charlen),) + + return args, kwargs, attype + + +def get_column_default(coltype, schema, default, generated): + """ + Method to determine the default of column + """ + autoincrement = False + # If a zero byte or blank string depending on driver (is also absent + # for older PG versions), then not a generated column. Otherwise, s = + # stored. (Other values might be added in the future.) + if generated not in (None, "", b"\x00"): + computed = {"sqltext": default, "persisted": generated in ("s", b"s")} + default = None + else: + computed = None + if default is not None: + match = re.search(r"""(nextval\(')([^']+)('.*$)""", default) + if match is not None: + if issubclass(coltype._type_affinity, sqltypes.Integer): + autoincrement = True + # the default is related to a Sequence + sch = schema + if "." not in match.group(2) and sch is not None: + # unconditionally quote the schema name. this could + # later be enhanced to obey quoting rules / + # "quote schema" + default = ( + match.group(1) + + (f'"{sch}"') + + "." + + match.group(2) + + match.group(3) + ) + return default, autoincrement, computed + + +def _handle_array_type(attype): + return ( + # strip '[]' from integer[], etc. + re.sub(r"\[\]$", "", attype), + attype.endswith("[]"), + ) + + +# pylint: disable=too-many-statements,too-many-branches,too-many-locals,too-many-arguments +def get_column_info( + self, + name, + format_type, + default, + notnull, + domains, + enums, + schema, + comment, + generated, + identity, +): + """ + Method to return column info + """ + + if format_type is None: + no_format_type = True + attype = format_type = "no format_type()" + is_array = False + else: + no_format_type = False + + # strip (*) from character varying(5), timestamp(5) + # with time zone, geometry(POLYGON), etc. + attype = re.sub(r"\(.*\)", "", format_type) + + # strip '[]' from integer[], etc. and check if an array + attype, is_array = _handle_array_type(attype) + + # strip quotes from case sensitive enum or domain names + enum_or_domain_key = tuple(util.quoted_token_parser(attype)) + + nullable = not notnull + + charlen = re.search(r"\(([\d,]+)\)", format_type) + if charlen: + charlen = charlen.group(1) + args = re.search(r"\((.*)\)", format_type) + if args and args.group(1): + args = tuple(re.split(r"\s*,\s*", args.group(1))) + else: + args = () + kwargs = {} + + args, kwargs, attype = get_column_args(charlen, args, kwargs, attype) + + while True: + # looping here to suit nested domains + if attype in self.ischema_names: + coltype = self.ischema_names[attype] + break + if enum_or_domain_key in enums: + enum = enums[enum_or_domain_key] + coltype = ENUM + kwargs["name"] = enum["name"] + if not enum["visible"]: + kwargs["schema"] = enum["schema"] + args = tuple(enum["labels"]) + break + if enum_or_domain_key in domains: + domain = domains[enum_or_domain_key] + attype = domain["attype"] + attype, is_array = _handle_array_type(attype) + # strip quotes from case sensitive enum or domain names + enum_or_domain_key = tuple(util.quoted_token_parser(attype)) + # A table can't override a not null on the domain, + # but can override nullable + nullable = nullable and domain["nullable"] + if domain["default"] and not default: + # It can, however, override the default + # value, but can't set it to null. + default = domain["default"] + continue + coltype = None + break + + if coltype: + coltype = coltype(*args, **kwargs) + if is_array: + coltype = self.ischema_names["_array"](coltype) + elif no_format_type: + util.warn(f"GaussdbSQL format_type() returned NULL for column '{name}'") + coltype = sqltypes.NULLTYPE + else: + util.warn(f"Did not recognize type '{attype}' of column '{name}'") + coltype = sqltypes.NULLTYPE + + default, autoincrement, computed = get_column_default( + coltype=coltype, schema=schema, default=default, generated=generated + ) + column_info = { + "name": name, + "type": coltype, + "nullable": nullable, + "default": default, + "autoincrement": autoincrement or identity is not None, + "comment": comment, + } + if computed is not None: + column_info["computed"] = computed + if identity is not None: + column_info["identity"] = identity + return column_info + + +@reflection.cache +def get_view_definition( + self, connection, table_name, schema=None, **kw +): # pylint: disable=unused-argument + return get_view_definition_wrapper( + self, + connection, + table_name=table_name, + schema=schema, + query=GAUSSDB_VIEW_DEFINITIONS, + ) + + +def get_gaussdb_version(engine) -> Optional[str]: + """ + return the gaussdb version in major.minor.patch format + """ + try: + results = engine.execute(GAUSSDB_GET_SERVER_VERSION) + for res in results: + version_string = str(res[0]) + opening_parenthesis_index = version_string.find("(") + if opening_parenthesis_index != -1: + return version_string[:opening_parenthesis_index].strip() + return version_string + except Exception as err: + logger.warning(f"Unable to fetch the gaussdb Version - {err}") + logger.debug(traceback.format_exc()) + return None + + +def get_gaussdb_time_column_name(engine) -> str: + """ + Return the correct column name for the time column based on gaussdb version + """ + time_column_name = "total_elapse_time" + gaussdb_version = get_gaussdb_version(engine) + if gaussdb_version and version.parse(gaussdb_version) < version.parse( + OLD_GAUSSDB_VERSION + ): + time_column_name = "total_elapse_time" + return time_column_name diff --git a/ingestion/src/metadata/ingestion/source/pipeline/airflow/connection.py b/ingestion/src/metadata/ingestion/source/pipeline/airflow/connection.py index 70dacd993d54..8a08da9f56cd 100644 --- a/ingestion/src/metadata/ingestion/source/pipeline/airflow/connection.py +++ b/ingestion/src/metadata/ingestion/source/pipeline/airflow/connection.py @@ -27,6 +27,9 @@ from metadata.generated.schema.entity.services.connections.database.postgresConnection import ( PostgresConnection, ) +from metadata.generated.schema.entity.services.connections.database.gaussdbConnection import ( + GaussdbConnection, +) from metadata.generated.schema.entity.services.connections.database.sqliteConnection import ( SQLiteConnection, ) @@ -81,6 +84,14 @@ def _(airflow_connection: PostgresConnection) -> Engine: return get_postgres_connection(airflow_connection) +@_get_connection.register +def _(airflow_connection: GaussdbConnection) -> Engine: + from metadata.ingestion.source.database.gaussdb.connection import ( + get_connection as get_gaussdb_connection, + ) + + return get_gaussdb_connection(airflow_connection) + @_get_connection.register def _(airflow_connection: SQLiteConnection) -> Engine: diff --git a/ingestion/src/metadata/profiler/orm/registry.py b/ingestion/src/metadata/profiler/orm/registry.py index c1e42c5cdae5..56d2e82ae65f 100644 --- a/ingestion/src/metadata/profiler/orm/registry.py +++ b/ingestion/src/metadata/profiler/orm/registry.py @@ -77,6 +77,7 @@ class PythonDialects(Enum): MySQL = "mysql" Oracle = "oracle" Postgres = "postgresql" + Gaussdb = "gaussdb" Presto = "presto" Redshift = "redshift" SingleStore = "singlestore" diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-gaussdb.png b/openmetadata-ui/src/main/resources/ui/src/assets/img/service-icon-gaussdb.png new file mode 100644 index 0000000000000000000000000000000000000000..bbca1bdbb2f4e765ac9e9b3ddbedc1aa323a595e GIT binary patch literal 57770 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 -ZvelX1Q6uXl9M{Ws&E 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 N002ovPDHLkV1mrf_+tP7 literal 0 HcmV?d00001 From a38b76bcb4eac995b4b15c2490231487c9d54500 Mon Sep 17 00:00:00 2001 From: pangpang20 <676814828@qq.com> Date: Sun, 5 Jan 2025 10:14:23 +0800 Subject: [PATCH 5/8] update codes and docs --- .../validations/table/sqlalchemy/tableDiff.py | 1 + .../src/metadata/ingestion/lineage/models.py | 5 +++ .../source/database/gaussdb/service_spec.py | 12 +++--- .../metadata/profiler/orm/functions/length.py | 1 + .../metadata/profiler/orm/functions/modulo.py | 1 + .../profiler/orm/functions/random_num.py | 1 + .../metadata/profiler/orm/functions/sum.py | 1 + .../connections/database/gaussdbConnection.md | 37 +++++++++++++++++++ 8 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 openmetadata-docs/content/v1.6.x-SNAPSHOT/main-concepts/metadata-standard/schemas/entity/services/connections/database/gaussdbConnection.md diff --git a/ingestion/src/metadata/data_quality/validations/table/sqlalchemy/tableDiff.py b/ingestion/src/metadata/data_quality/validations/table/sqlalchemy/tableDiff.py index 56614bdfd210..338e56e72afa 100644 --- a/ingestion/src/metadata/data_quality/validations/table/sqlalchemy/tableDiff.py +++ b/ingestion/src/metadata/data_quality/validations/table/sqlalchemy/tableDiff.py @@ -63,6 +63,7 @@ Dialects.Athena, Dialects.Redshift, Dialects.Postgres, + Dialects.Gaussdb, Dialects.MySQL, Dialects.MSSQL, Dialects.Oracle, diff --git a/ingestion/src/metadata/ingestion/lineage/models.py b/ingestion/src/metadata/ingestion/lineage/models.py index 6e0e4385854c..5562047f5ffd 100644 --- a/ingestion/src/metadata/ingestion/lineage/models.py +++ b/ingestion/src/metadata/ingestion/lineage/models.py @@ -55,6 +55,9 @@ from metadata.generated.schema.entity.services.connections.database.postgresConnection import ( PostgresType, ) +from metadata.generated.schema.entity.services.connections.database.gaussdbConnection import ( + GaussdbType, +) from metadata.generated.schema.entity.services.connections.database.redshiftConnection import ( RedshiftType, ) @@ -92,6 +95,7 @@ class Dialect(Enum): MYSQL = "mysql" ORACLE = "oracle" POSTGRES = "postgres" + GAUSSDB = "gaussdb" REDSHIFT = "redshift" SNOWFLAKE = "snowflake" SOQL = "soql" @@ -113,6 +117,7 @@ class Dialect(Enum): str(MySQLType.Mysql.value): Dialect.MYSQL, str(OracleType.Oracle.value): Dialect.ORACLE, str(PostgresType.Postgres.value): Dialect.POSTGRES, + str(GaussdbType.Gaussdb.value): Dialect.GAUSSDB, str(RedshiftType.Redshift.value): Dialect.REDSHIFT, str(SnowflakeType.Snowflake.value): Dialect.SNOWFLAKE, str(DeltaLakeType.DeltaLake.value): Dialect.SPARKSQL, diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/service_spec.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/service_spec.py index 3bea308b164a..663656479167 100644 --- a/ingestion/src/metadata/ingestion/source/database/gaussdb/service_spec.py +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/service_spec.py @@ -1,10 +1,10 @@ -from metadata.ingestion.source.database.postgres.lineage import PostgresLineageSource -from metadata.ingestion.source.database.postgres.metadata import PostgresSource -from metadata.ingestion.source.database.postgres.usage import PostgresUsageSource +from metadata.ingestion.source.database.gaussdb.lineage import GaussdbLineageSource +from metadata.ingestion.source.database.gaussdb.metadata import GaussdbSource +from metadata.ingestion.source.database.gaussdb.usage import GaussdbUsageSource from metadata.utils.service_spec.default import DefaultDatabaseSpec ServiceSpec = DefaultDatabaseSpec( - metadata_source_class=PostgresSource, - lineage_source_class=PostgresLineageSource, - usage_source_class=PostgresUsageSource, + metadata_source_class=GaussdbSource, + lineage_source_class=GaussdbLineageSource, + usage_source_class=GaussdbUsageSource, ) diff --git a/ingestion/src/metadata/profiler/orm/functions/length.py b/ingestion/src/metadata/profiler/orm/functions/length.py index 88aa32b3799d..08489b1df9b3 100644 --- a/ingestion/src/metadata/profiler/orm/functions/length.py +++ b/ingestion/src/metadata/profiler/orm/functions/length.py @@ -56,6 +56,7 @@ def _(element, compiler, **kw): @compiles(LenFn, Dialects.Postgres) +@compiles(LenFn, Dialects.Gaussdb) def _(element, compiler, **kw): return "LENGTH(CAST(%s AS text))" % compiler.process(element.clauses, **kw) diff --git a/ingestion/src/metadata/profiler/orm/functions/modulo.py b/ingestion/src/metadata/profiler/orm/functions/modulo.py index dcf57f84eb18..8f1ae9cd2c56 100644 --- a/ingestion/src/metadata/profiler/orm/functions/modulo.py +++ b/ingestion/src/metadata/profiler/orm/functions/modulo.py @@ -51,6 +51,7 @@ def _(element, compiler, **kw): @compiles(ModuloFn, Dialects.Redshift) @compiles(ModuloFn, Dialects.Snowflake) @compiles(ModuloFn, Dialects.Postgres) +@compiles(ModuloFn, Dialects.Gaussdb) @compiles(ModuloFn, Dialects.Athena) @compiles(ModuloFn, Dialects.MySQL) @compiles(ModuloFn, Dialects.Oracle) diff --git a/ingestion/src/metadata/profiler/orm/functions/random_num.py b/ingestion/src/metadata/profiler/orm/functions/random_num.py index 4dc9db61623f..836a5f854ccd 100644 --- a/ingestion/src/metadata/profiler/orm/functions/random_num.py +++ b/ingestion/src/metadata/profiler/orm/functions/random_num.py @@ -85,6 +85,7 @@ def _(*_, **__): @compiles(RandomNumFn, Dialects.Postgres) +@compiles(RandomNumFn, Dialects.Gaussdb) def _(*_, **__): """Postgres random logic""" return "ABS((RANDOM() * 100)::INTEGER)" diff --git a/ingestion/src/metadata/profiler/orm/functions/sum.py b/ingestion/src/metadata/profiler/orm/functions/sum.py index 74534d1956c6..329c9ac7dae2 100644 --- a/ingestion/src/metadata/profiler/orm/functions/sum.py +++ b/ingestion/src/metadata/profiler/orm/functions/sum.py @@ -50,6 +50,7 @@ def _(element, compiler, **kw): @compiles(SumFn, Dialects.BigQuery) @compiles(SumFn, Dialects.Postgres) +@compiles(SumFn, Dialects.Gaussdb) def _(element, compiler, **kw): """Handle case where column type is INTEGER but SUM returns a NUMBER""" proc = compiler.process(element.clauses, **kw) diff --git a/openmetadata-docs/content/v1.6.x-SNAPSHOT/main-concepts/metadata-standard/schemas/entity/services/connections/database/gaussdbConnection.md b/openmetadata-docs/content/v1.6.x-SNAPSHOT/main-concepts/metadata-standard/schemas/entity/services/connections/database/gaussdbConnection.md new file mode 100644 index 000000000000..992d0166de61 --- /dev/null +++ b/openmetadata-docs/content/v1.6.x-SNAPSHOT/main-concepts/metadata-standard/schemas/entity/services/connections/database/gaussdbConnection.md @@ -0,0 +1,37 @@ +--- +title: gaussdbConnection +slug: /main-concepts/metadata-standard/schemas/entity/services/connections/database/gaussdbconnection +--- + +# GaussdbConnection + +*Gaussdb Database Connection Config* + +## Properties + +- **`type`**: Service Type. Refer to *#/definitions/gaussdbType*. Default: `Gaussdb`. +- **`scheme`**: SQLAlchemy driver scheme options. Refer to *#/definitions/gaussdbScheme*. Default: `postgresql+psycopg2`. +- **`username`** *(string)*: Username to connect to Gaussdb. This user should have privileges to read all the metadata in Gaussdb. +- **`authType`**: Choose Auth Config Type. +- **`hostPort`** *(string)*: Host and port of the source service. +- **`database`** *(string)*: Database of the data source. This is optional parameter, if you would like to restrict the metadata reading to a single database. When left blank, OpenMetadata Ingestion attempts to scan all the databases. +- **`ingestAllDatabases`** *(boolean)*: Ingest data from all databases in Gaussdb. You can use databaseFilterPattern on top of this. Default: `False`. +- **`sslMode`**: SSL Mode to connect to gaussdb database. Must be one of: `['disable', 'allow', 'prefer', 'require', 'verify-ca', 'verify-full']`. Default: `disable`. +- **`sslConfig`**: Refer to *../../../../security/ssl/verifySSLConfig.json#/definitions/sslConfig*. +- **`classificationName`** *(string)*: Custom OpenMetadata Classification name for Gaussdb policy tags. Default: `GaussdbPolicyTags`. +- **`connectionOptions`**: Refer to *../connectionBasicType.json#/definitions/connectionOptions*. +- **`connectionArguments`**: Refer to *../connectionBasicType.json#/definitions/connectionArguments*. +- **`supportsMetadataExtraction`**: Refer to *../connectionBasicType.json#/definitions/supportsMetadataExtraction*. +- **`supportsUsageExtraction`**: Refer to *../connectionBasicType.json#/definitions/supportsUsageExtraction*. +- **`supportsLineageExtraction`**: Refer to *../connectionBasicType.json#/definitions/supportsLineageExtraction*. +- **`supportsDBTExtraction`**: Refer to *../connectionBasicType.json#/definitions/supportsDBTExtraction*. +- **`supportsProfiler`**: Refer to *../connectionBasicType.json#/definitions/supportsProfiler*. +- **`supportsDatabase`**: Refer to *../connectionBasicType.json#/definitions/supportsDatabase*. +- **`supportsQueryComment`**: Refer to *../connectionBasicType.json#/definitions/supportsQueryComment*. +## Definitions + +- **`gaussdbType`** *(string)*: Service type. Must be one of: `['Gaussdb']`. Default: `Gaussdb`. +- **`gaussdbScheme`** *(string)*: SQLAlchemy driver scheme options. Must be one of: `['postgresql+psycopg2', 'pgspider+psycopg2']`. Default: `postgresql+psycopg2`. + + +Documentation file automatically generated at 2023-10-27 13:55:46.343512. From 7b995d9b39eccbdfdd0d2558f5e6bda65361a769 Mon Sep 17 00:00:00 2001 From: pangpang20 <676814828@qq.com> Date: Mon, 6 Jan 2025 15:47:16 +0800 Subject: [PATCH 6/8] update codes and docs --- docker/openmetadata.yaml | 1 - docker/run_local_docker.sh | 1 + ingestion/Dockerfile.ci | 1 + .../service/jdbi3/locator/ConnectionType.java | 3 +- .../migration/utils/v110/MigrationUtil.java | 31 +++ .../resources/databases/DatasourceConfig.java | 4 + .../converter/ClassConverterFactory.java | 1 + .../GaussdbConnectionClassConverter.java | 51 ++++ .../testConnections/database/gaussdb.json | 49 ++++ .../ui/playwright/constant/service.ts | 6 + .../entity/ingestion/GaussdbIngestionClass.ts | 181 +++++++++++++ .../public/locales/en-US/Database/Gaussdb.md | 256 ++++++++++++++++++ 12 files changed, 583 insertions(+), 2 deletions(-) delete mode 120000 docker/openmetadata.yaml create mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter/GaussdbConnectionClassConverter.java create mode 100644 openmetadata-service/src/main/resources/json/data/testConnections/database/gaussdb.json create mode 100644 openmetadata-ui/src/main/resources/ui/playwright/support/entity/ingestion/GaussdbIngestionClass.ts create mode 100644 openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Gaussdb.md diff --git a/docker/openmetadata.yaml b/docker/openmetadata.yaml deleted file mode 120000 index 29e904d0310a..000000000000 --- a/docker/openmetadata.yaml +++ /dev/null @@ -1 +0,0 @@ -conf/openmetadata.yaml \ No newline at end of file diff --git a/docker/run_local_docker.sh b/docker/run_local_docker.sh index 792df231f5a9..3499df3186a7 100755 --- a/docker/run_local_docker.sh +++ b/docker/run_local_docker.sh @@ -59,6 +59,7 @@ if [[ $skipMaven == "false" ]]; then mvn -DskipTests -DonlyBackend clean package -pl !openmetadata-ui else echo "$LINENO: Maven Build - Skipping Tests" + mvn -DskipTests clean compile mvn -DskipTests clean package fi else diff --git a/ingestion/Dockerfile.ci b/ingestion/Dockerfile.ci index c14e75ce06bc..b51aa8615718 100644 --- a/ingestion/Dockerfile.ci +++ b/ingestion/Dockerfile.ci @@ -55,6 +55,7 @@ COPY --from=mysql /usr/bin/mysqldump /usr/bin/mysqldump # local COPY ./.files/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip COPY ./.files/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip +COPY ./.files/GaussDB_driver.zip /root/GaussDB_driver.zip RUN if [ $(uname -m) = "arm64" ] || [ $(uname -m) = "aarch64" ]; then \ unzip -qq -d /instantclient -j /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip; \ diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/locator/ConnectionType.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/locator/ConnectionType.java index e104921d9a42..43042da5df83 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/locator/ConnectionType.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/locator/ConnectionType.java @@ -21,7 +21,8 @@ @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum ConnectionType { MYSQL("com.mysql.cj.jdbc.Driver"), - POSTGRES("org.postgresql.Driver"); + POSTGRES("org.postgresql.Driver"), + GAUSSDB("org.postgresql.Driver"); public final String label; diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v110/MigrationUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v110/MigrationUtil.java index fd815283029a..f947a5155682 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v110/MigrationUtil.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v110/MigrationUtil.java @@ -86,15 +86,22 @@ private MigrationUtil() { "UPDATE %s SET %s = :nameHashColumnValue WHERE id = :id"; private static final String POSTGRES_ENTITY_UPDATE = "UPDATE %s SET %s = :nameHashColumnValue WHERE id = :id"; + private static final String GAUSSDB_ENTITY_UPDATE = + "UPDATE %s SET %s = :nameHashColumnValue WHERE id = :id"; + private static final String MYSQL_ENTITY_EXTENSION_TIME_SERIES_UPDATE = "UPDATE entity_extension_time_series set entityFQNHash = :entityFQNHash where entityFQN=:entityFQN"; private static final String POSTGRES_ENTITY_EXTENSION_TIME_SERIES_UPDATE = "UPDATE entity_extension_time_series set entityFQNHash = :entityFQNHash where entityFQN=:entityFQN"; + private static final String GAUSSDB_ENTITY_EXTENSION_TIME_SERIES_UPDATE = + "UPDATE entity_extension_time_series set entityFQNHash = :entityFQNHash where entityFQN=:entityFQN"; private static final String MYSQL_FIELD_RELATIONSHIP_UPDATE = "UPDATE field_relationship SET fromFQNHash = :fromFQNHash, toFQNHash = :toFQNHash where fromFQN= :fromFQN and toFQN = :toFQN"; private static final String POSTGRES_FIELD_RELATIONSHIP_UPDATE = "UPDATE field_relationship SET fromFQNHash = :fromFQNHash, toFQNHash = :toFQNHash where fromFQN= :fromFQN and toFQN = :toFQN"; + private static final String GAUSSDB_FIELD_RELATIONSHIP_UPDATE = + "UPDATE field_relationship SET fromFQNHash = :fromFQNHash, toFQNHash = :toFQNHash where fromFQN= :fromFQN and toFQN = :toFQN"; @SneakyThrows public static void updateFQNHashForEntity( @@ -116,6 +123,15 @@ public static void updateFQNHashForEntity( false, limitParam, nameHashColumn); + } else if (Boolean.TRUE.equals(DatasourceConfig.getInstance().isGaussDB())) { + readAndProcessEntity( + handle, + String.format(GAUSSDB_ENTITY_UPDATE, dao.getTableName(), nameHashColumn), + clazz, + dao, + false, + limitParam, + nameHashColumn); } else { readAndProcessEntity( handle, @@ -147,6 +163,15 @@ public static void updateFQNHashForEntityWithName( true, limitParam, nameHashColumn); + } else if(Boolean.TRUE.equals(DatasourceConfig.getInstance().isGaussDB())){ + readAndProcessEntity( + handle, + String.format(GAUSSDB_ENTITY_UPDATE, dao.getTableName(), nameHashColumn), + clazz, + dao, + true, + limitParam, + nameHashColumn); } else { readAndProcessEntity( handle, @@ -327,6 +352,9 @@ public static void dataMigrationFQNHashing( if (Boolean.TRUE.equals(DatasourceConfig.getInstance().isMySQL())) { updateFQNHashForFieldRelationship( handle, MYSQL_FIELD_RELATIONSHIP_UPDATE, collectionDAO, limitParam); + }else if(Boolean.TRUE.equals(DatasourceConfig.getInstance().isGaussDB())){ + updateFQNHashForFieldRelationship( + handle, GAUSSDB_FIELD_RELATIONSHIP_UPDATE, collectionDAO, limitParam); } else { updateFQNHashForFieldRelationship( handle, POSTGRES_FIELD_RELATIONSHIP_UPDATE, collectionDAO, limitParam); @@ -336,6 +364,9 @@ public static void dataMigrationFQNHashing( if (Boolean.TRUE.equals(DatasourceConfig.getInstance().isMySQL())) { updateFQNHashEntityExtensionTimeSeries( handle, MYSQL_ENTITY_EXTENSION_TIME_SERIES_UPDATE, collectionDAO, limitParam); + }else if(Boolean.TRUE.equals(DatasourceConfig.getInstance().isGaussDB())){ + updateFQNHashEntityExtensionTimeSeries( + handle, GAUSSDB_ENTITY_EXTENSION_TIME_SERIES_UPDATE, collectionDAO, limitParam); } else { updateFQNHashEntityExtensionTimeSeries( handle, POSTGRES_ENTITY_EXTENSION_TIME_SERIES_UPDATE, collectionDAO, limitParam); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatasourceConfig.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatasourceConfig.java index 59d6bed1d6d3..8993c6c19e96 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatasourceConfig.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatasourceConfig.java @@ -26,4 +26,8 @@ public static DatasourceConfig getInstance() { public Boolean isMySQL() { return ConnectionType.MYSQL.equals(connectionType); } + + public Boolean isGaussDB() { + return ConnectionType.GAUSSDB.equals(connectionType); + } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter/ClassConverterFactory.java b/openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter/ClassConverterFactory.java index f292215cfa39..9ef7e149acc8 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter/ClassConverterFactory.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter/ClassConverterFactory.java @@ -62,6 +62,7 @@ private ClassConverterFactory() { Map.entry(RedshiftConnection.class, new RedshiftConnectionClassConverter()), Map.entry(GreenplumConnection.class, new GreenplumConnectionClassConverter()), Map.entry(PostgresConnection.class, new PostgresConnectionClassConverter()), + Map.entry(GaussdbConnection.class, new GaussdbConnectionClassConverter()), Map.entry(SapHanaConnection.class, new SapHanaConnectionClassConverter()), Map.entry(StorageConfig.class, new StorageConfigClassConverter()), Map.entry(SupersetConnection.class, new SupersetConnectionClassConverter()), diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter/GaussdbConnectionClassConverter.java b/openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter/GaussdbConnectionClassConverter.java new file mode 100644 index 000000000000..28fa450adeff --- /dev/null +++ b/openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter/GaussdbConnectionClassConverter.java @@ -0,0 +1,51 @@ +/* + * Copyright 2021 Collate + * 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. + */ + +package org.openmetadata.service.secrets.converter; + +import java.util.List; +import org.openmetadata.schema.security.ssl.ValidateSSLClientConfig; +import org.openmetadata.schema.services.connections.database.GaussdbConnection; +import org.openmetadata.schema.services.connections.database.common.AzureConfig; +import org.openmetadata.schema.services.connections.database.common.IamAuthConfig; +import org.openmetadata.schema.services.connections.database.common.basicAuth; +import org.openmetadata.service.util.JsonUtils; + +/** + * Converter class to get an `Gaussdb` object. + */ +public class GaussdbConnectionClassConverter extends ClassConverter { + + private static final List> SSL_SOURCE_CLASS = List.of(ValidateSSLClientConfig.class); + + private static final List> CONFIG_SOURCE_CLASSES = + List.of(basicAuth.class, IamAuthConfig.class, AzureConfig.class); + + public GaussdbConnectionClassConverter() { + super(GaussdbConnection.class); + } + + @Override + public Object convert(Object object) { + GaussdbConnection gaussdbConnection = + (GaussdbConnection) JsonUtils.convertValue(object, this.clazz); + + tryToConvert(gaussdbConnection.getAuthType(), CONFIG_SOURCE_CLASSES) + .ifPresent(gaussdbConnection::setAuthType); + + tryToConvert(gaussdbConnection.getSslConfig(), SSL_SOURCE_CLASS) + .ifPresent(gaussdbConnection::setSslConfig); + + return gaussdbConnection; + } +} diff --git a/openmetadata-service/src/main/resources/json/data/testConnections/database/gaussdb.json b/openmetadata-service/src/main/resources/json/data/testConnections/database/gaussdb.json new file mode 100644 index 000000000000..f39c01682ad0 --- /dev/null +++ b/openmetadata-service/src/main/resources/json/data/testConnections/database/gaussdb.json @@ -0,0 +1,49 @@ +{ + "name": "Gaussdb", + "displayName": "Gaussdb Test Connection", + "description": "This Test Connection validates the access against the database and basic metadata extraction of schemas and tables.", + "steps": [ + { + "name": "CheckAccess", + "description": "Validate that we can properly reach the database and authenticate with the given credentials.", + "errorMessage": "Failed to connect to Gaussdb, please validate the credentials", + "mandatory": true + }, + { + "name": "GetDatabases", + "description": "List all the databases available to the user.", + "errorMessage": "Failed to fetch databases, please validate if the user has enough privilege to fetch databases.", + "mandatory": true + }, + { + "name": "GetSchemas", + "description": "List all the schemas available to the user.", + "errorMessage": "Failed to fetch schemas, please validate if the user has enough privilege to fetch schemas.", + "mandatory": true + }, + { + "name": "GetTables", + "description": "From a given schema, list the tables belonging to that schema. If no schema is specified, we'll list the tables of a random schema.", + "errorMessage": "Failed to fetch tables, please validate if the user has enough privilege to fetch tables.", + "mandatory": true + }, + { + "name": "GetViews", + "description": "From a given schema, list the views belonging to that schema. If no schema is specified, we'll list the tables of a random schema.", + "errorMessage": "Failed to fetch views, please validate if the user has enough privilege to fetch views.", + "mandatory": false + }, + { + "name": "GetTags", + "description": "Check if we can access pg_policy, pg_class & pg_namespace tables to get the policy tags attached to tables.", + "errorMessage": "Failed to fetch policy tags, please validate if the user has at least select privileges for pg_policy, pg_class & pg_namespace tables.", + "mandatory": false + }, + { + "name": "GetQueries", + "description":"Check if we can access the pg_stat_statements table to get query logs, These queries are analyzed in the usage & lineage workflow.", + "errorMessage": "Failed to fetch queries, please validate if gaussdb instance has pg_stat_statements extension installed and the user has at least select privileges for pg_stat_statements table.", + "mandatory": false + } + ] + } diff --git a/openmetadata-ui/src/main/resources/ui/playwright/constant/service.ts b/openmetadata-ui/src/main/resources/ui/playwright/constant/service.ts index 3d5bc91321c4..f842bbadf13a 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/constant/service.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/constant/service.ts @@ -88,6 +88,12 @@ export const POSTGRES = { tableName: 'order_items', }; +export const GAUSSDB = { + serviceType: 'Gaussdb', + serviceName: `pw-gaussdb-test-with-%-${uniqueID}`, + tableName: 'order_items', +}; + export const MYSQL = 'Mysql'; export const DBT = { diff --git a/openmetadata-ui/src/main/resources/ui/playwright/support/entity/ingestion/GaussdbIngestionClass.ts b/openmetadata-ui/src/main/resources/ui/playwright/support/entity/ingestion/GaussdbIngestionClass.ts new file mode 100644 index 000000000000..2c40f11c49a4 --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/playwright/support/entity/ingestion/GaussdbIngestionClass.ts @@ -0,0 +1,181 @@ +/* + * Copyright 2024 Collate. + * 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. + */ + +import { + Page, + PlaywrightTestArgs, + PlaywrightWorkerArgs, + TestType, +} from '@playwright/test'; +import { GAUSSDB } from '../../../constant/service'; +import { + getApiContext, + redirectToHomePage, + toastNotification, +} from '../../../utils/common'; +import { visitEntityPage } from '../../../utils/entity'; +import { visitServiceDetailsPage } from '../../../utils/service'; +import { + checkServiceFieldSectionHighlighting, + Services, +} from '../../../utils/serviceIngestion'; +import ServiceBaseClass from './ServiceBaseClass'; + +class gaussdbIngestionClass extends ServiceBaseClass { + name: string; + filterPattern: string; + queryLogFilePath: string; + + constructor() { + super( + Services.Database, + GAUSSDB.serviceName, + GAUSSDB.serviceType, + GAUSSDB.tableName + ); + + this.filterPattern = 'sales'; + this.queryLogFilePath = + '/home/airflow/ingestion/examples/sample_data/usage/query_log.csv'; + } + + async createService(page: Page) { + await super.createService(page); + } + + async updateService(page: Page) { + await super.updateService(page); + } + + async fillConnectionDetails(page: Page) { + const gaussdbUsername = process.env.PLAYWRIGHT_GAUSSDB_USERNAME ?? ''; + const gaussdbPassword = process.env.PLAYWRIGHT_GAUSSDB_PASSWORD ?? ''; + const gaussdbHostPort = process.env.PLAYWRIGHT_GAUSSDB_HOST_PORT ?? ''; + const gaussdbDatabase = process.env.PLAYWRIGHT_GAUSSDB_DATABASE ?? ''; + + await page.fill('#root\\/username', gaussdbUsername); + await checkServiceFieldSectionHighlighting(page, 'username'); + await page.fill('#root\\/authType\\/password', gaussdbPassword); + await checkServiceFieldSectionHighlighting(page, 'password'); + await page.fill('#root\\/hostPort', gaussdbHostPort); + await checkServiceFieldSectionHighlighting(page, 'hostPort'); + await page.fill('#root\\/database', gaussdbDatabase); + await checkServiceFieldSectionHighlighting(page, 'database'); + } + + async fillIngestionDetails(page: Page) { + await page + .locator('#root\\/schemaFilterPattern\\/includes') + .fill(this.filterPattern); + + await page.locator('#root\\/schemaFilterPattern\\/includes').press('Enter'); + } + + async runAdditionalTests( + page: Page, + test: TestType + ) { + if (process.env.PLAYWRIGHT_IS_OSS) { + await test.step('Add Usage ingestion', async () => { + const { apiContext } = await getApiContext(page); + await redirectToHomePage(page); + await visitServiceDetailsPage( + page, + { + type: this.category, + name: this.serviceName, + displayName: this.serviceName, + }, + true + ); + + await page.click('[data-testid="ingestions"]'); + await page.waitForSelector( + '[data-testid="ingestion-details-container"]' + ); + await page.click('[data-testid="add-new-ingestion-button"]'); + await page.waitForTimeout(1000); + await page.click('[data-menu-id*="usage"]'); + await page.fill('#root\\/queryLogFilePath', this.queryLogFilePath); + + await page.click('[data-testid="submit-btn"]'); + // Make sure we create ingestion with None schedule to avoid conflict between Airflow and Argo behavior + await this.scheduleIngestion(page); + + await page.click('[data-testid="view-service-button"]'); + + // Header available once page loads + await page.waitForSelector('[data-testid="data-assets-header"]'); + await page.getByTestId('loader').waitFor({ state: 'detached' }); + await page.getByTestId('ingestions').click(); + await page + .getByLabel('Ingestions') + .getByTestId('loader') + .waitFor({ state: 'detached' }); + + const response = await apiContext + .get( + `/api/v1/services/ingestionPipelines?service=${encodeURIComponent( + this.serviceName + )}&pipelineType=usage&serviceType=databaseService&limit=1` + ) + .then((res) => res.json()); + + // need manual wait to settle down the deployed pipeline, before triggering the pipeline + await page.waitForTimeout(3000); + await page.click( + `[data-row-key*="${response.data[0].name}"] [data-testid="more-actions"]` + ); + + await page.getByTestId('run-button').click(); + + await toastNotification(page, `Pipeline triggered successfully!`); + + // need manual wait to make sure we are awaiting on latest run results + await page.waitForTimeout(2000); + + await this.handleIngestionRetry('usage', page); + }); + + await test.step('Verify if usage is ingested properly', async () => { + await page.waitForSelector('[data-testid="loader"]', { + state: 'hidden', + }); + const entityResponse = page.waitForResponse( + `/api/v1/tables/name/*.order_items?**` + ); + + await visitEntityPage({ + page, + searchTerm: this.entityName, + dataTestId: `${this.serviceName}-${this.entityName}`, + }); + + await entityResponse; + + await page.getByRole('tab', { name: 'Queries' }).click(); + + await page.click('[data-testid="schema"]'); + await page.waitForSelector('[data-testid="related-tables-data"]'); + await page.waitForSelector('[data-testid="frequently-joined-columns"]'); + }); + } + } + + async deleteService(page: Page) { + await super.deleteService(page); + } +} + +// eslint-disable-next-line jest/no-export +export default gaussdbIngestionClass; diff --git a/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Gaussdb.md b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Gaussdb.md new file mode 100644 index 000000000000..c0596240bbfa --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/public/locales/en-US/Database/Gaussdb.md @@ -0,0 +1,256 @@ +# Gaussdb + +In this section, we provide guides and references to use the PostgreSQL connector. + +## Requirements + +$$note +Note that we only support officially supported Gaussdb versions. You can check the version list [here](https://support.huaweicloud.com/gaussdb/index.html/). +$$ + +### Profiler & Data Quality + +Executing the profiler Workflow or data quality tests, will require the user to have `SELECT` permission on the tables/schemas where the profiler/tests will be executed. More information on the profiler workflow setup can be found [here](https://docs.open-metadata.org/how-to-guides/data-quality-observability/profiler/workflow) and data quality tests [here](https://docs.open-metadata.org/connectors/ingestion/workflows/data-quality). + +### Usage and Lineage + +When extracting lineage and usage information from Gaussdb we base our finding on the `dbe_perf.statement` table. You can find more information about it on the official [docs](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-1432.html). + + +As a summary: +- The `dbe_perf.statement` has no time data embedded in it. + +Then, when extracting usage and lineage data, the query log duration will have no impact, only the query limit. + + +You can find further information on the Gaussdb connector in the [docs](https://docs.open-metadata.org/connectors/database/gaussdb). + +## Connection Details + +$$section +### Connection Scheme $(id="scheme") + +SQLAlchemy driver scheme options. +$$ + +$$section +### Username $(id="username") + +Username to connect to Gaussdb. This user should have privileges to read all the metadata in Gaussdb. +$$ + + +$$section +### Auth Config $(id="authType") +There are 2 types of auth configs: +- Basic Auth. +- IAM based Auth. +- Azure Based Auth. + +User can authenticate the Gaussdb Instance with auth type as `Basic Authentication` i.e. Password **or** by using `IAM based Authentication` to connect to AWS related services **or** by using `Azure Baed Authentication` to connecto to Azure releated services. +$$ + +## Basic Auth +$$section +### Password $(id="password") + +Password to connect to Gaussdb. +$$ + +## IAM Auth Config + +$$section +### AWS Access Key ID $(id="awsAccessKeyId") + +When you interact with AWS, you specify your AWS security credentials to verify who you are and whether you have permission to access the resources that you are requesting. AWS uses the security credentials to authenticate and authorize your requests ([docs](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html)). + +Access keys consist of two parts: +1. An access key ID (for example, `AKIAIOSFODNN7EXAMPLE`), +2. And a secret access key (for example, `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY`). + +You must use both the access key ID and secret access key together to authenticate your requests. + +You can find further information on how to manage your access keys [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) +$$ + +$$section +### AWS Secret Access Key $(id="awsSecretAccessKey") + +Secret access key (for example, `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY`). +$$ + +$$section +### AWS Region $(id="awsRegion") + +Each AWS Region is a separate geographic area in which AWS clusters data centers ([docs](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html)). + +As AWS can have instances in multiple regions, we need to know the region the service you want reach belongs to. + +Note that the AWS Region is the only required parameter when configuring a connection. When connecting to the services programmatically, there are different ways in which we can extract and use the rest of AWS configurations. You can find further information about configuring your credentials [here](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#configuring-credentials). +$$ + +$$section +### AWS Session Token $(id="awsSessionToken") + +If you are using temporary credentials to access your services, you will need to inform the AWS Access Key ID and AWS Secrets Access Key. Also, these will include an AWS Session Token. + +You can find more information on [Using temporary credentials with AWS resources](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html). +$$ + +$$section +### Endpoint URL $(id="endPointURL") + +To connect programmatically to an AWS service, you use an endpoint. An *endpoint* is the URL of the entry point for an AWS web service. The AWS SDKs and the AWS Command Line Interface (AWS CLI) automatically use the default endpoint for each service in an AWS Region. But you can specify an alternate endpoint for your API requests. + +Find more information on [AWS service endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html). +$$ + +$$section +### Profile Name $(id="profileName") + +A named profile is a collection of settings and credentials that you can apply to an AWS CLI command. When you specify a profile to run a command, the settings and credentials are used to run that command. Multiple named profiles can be stored in the config and credentials files. + +You can inform this field if you'd like to use a profile other than `default`. + +Find here more information about [Named profiles for the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html). +$$ + +$$section +### Assume Role ARN $(id="assumeRoleArn") + +Typically, you use `AssumeRole` within your account or for cross-account access. In this field you'll set the `ARN` (Amazon Resource Name) of the policy of the other account. + +A user who wants to access a role in a different account must also have permissions that are delegated from the account administrator. The administrator must attach a policy that allows the user to call `AssumeRole` for the `ARN` of the role in the other account. + +This is a required field if you'd like to `AssumeRole`. + +Find more information on [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html). +$$ + +$$section +### Assume Role Session Name $(id="assumeRoleSessionName") + +An identifier for the assumed role session. Use the role session name to uniquely identify a session when the same role is assumed by different principals or for different reasons. + +By default, we'll use the name `OpenMetadataSession`. + +Find more information about the [Role Session Name](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html#:~:text=An%20identifier%20for%20the%20assumed%20role%20session.). +$$ + +$$section +### Assume Role Source Identity $(id="assumeRoleSourceIdentity") + +The source identity specified by the principal that is calling the `AssumeRole` operation. You can use source identity information in AWS CloudTrail logs to determine who took actions with a role. + +Find more information about [Source Identity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html#:~:text=Required%3A%20No-,SourceIdentity,-The%20source%20identity). +$$ + +## Azure Auth Config + +$$section +### Client ID $(id="clientId") + +This is a unique identifier for the service account. To fetch this key, look for the value associated with the `client_id` key in the service account key file. +$$ + +$$section +### Client Secret $(id="clientSecret") +To get the client secret, follow these steps: + +1. Log into [Microsoft Azure](https://ms.portal.azure.com/#allservices). +2. Search for `App registrations` and select the `App registrations link`. +3. Select the `Azure AD` app you're using for this connection. +4. Under `Manage`, select `Certificates & secrets`. +5. Under `Client secrets`, select `New client secret`. +6. In the `Add a client secret` pop-up window, provide a description for your application secret. Choose when the application should expire, and select `Add`. +7. From the `Client secrets` section, copy the string in the `Value` column of the newly created application secret. + +$$ + +$$section +### Tenant ID $(id="tenantId") + +To get the tenant ID, follow these steps: + +1. Log into [Microsoft Azure](https://ms.portal.azure.com/#allservices). +2. Search for `App registrations` and select the `App registrations link`. +3. Select the `Azure AD` app you're using for Power BI. +4. From the `Overview` section, copy the `Directory (tenant) ID`. +$$ + +$$section +### Storage Account Name $(id="accountName") + +Account Name of your storage account +$$ + +$$section +### Key Vault Name $(id="vaultName") + +Key Vault Name +$$ + +$$section +### Scopes $(id="scopes") + +To let OM use the Trino Auth APIs using your Azure AD app, you'll need to add the scope +1. Log into [Microsoft Azure](https://ms.portal.azure.com/#allservices). +2. Search for `App registrations` and select the `App registrations link`. +3. Select the `Azure AD` app you're using for Trino. +4. From the `Expose an API` section, copy the `Application ID URI` +5. Make sure the URI ends with `/.default` in case it does not, you can append the same manually +$$ + +$$section +### Host and Port $(id="hostPort") + +This parameter specifies the host and port of the Gaussdb instance. This should be specified as a string in the format `hostname:port`. For example, you might set the hostPort parameter to `localhost:5432`. + +If you are running the OpenMetadata ingestion in a docker and your services are hosted on the `localhost`, then use `host.docker.internal:5432` as the value. +$$ + +$$section +### Database $(id="database") + +Initial Gaussdb database to connect to. If you want to ingest all databases, set `ingestAllDatabases` to true. +$$ + +$$section +### SSL Mode $(id="sslMode") + +SSL Mode to connect to gaussdb database. E.g, `prefer`, `verify-ca`, `allow` etc. +$$ +$$note +if you are using `IAM auth`, select either `allow` (recommended) or other option based on your use case. +$$ + +$$section +### SSL CA $(id="caCertificate") +The CA certificate used for SSL validation (`sslrootcert`). +$$ +$$note +Gaussdb only needs CA Certificate +$$ +$$section +### Classification Name $(id="classificationName") + +By default, the Gaussdb policy tags in OpenMetadata are classified under the name `GaussdbPolicyTags`. However, you can create a custom classification name of your choice for these tags. Once you have ingested Gaussdb data, the custom classification name will be visible in the Classifications list on the Tags page. +$$ + +$$section +### Ingest All Databases $(id="ingestAllDatabases") + +If ticked, the workflow will be able to ingest all database in the cluster. If not ticked, the workflow will only ingest tables from the database set above. +$$ + +$$section +### Connection Arguments $(id="connectionArguments") + +Additional connection arguments such as security or protocol configs that can be sent to service during connection. +$$ + +$$section +### Connection Options $(id="connectionOptions") + +Additional connection options to build the URL that can be sent to service during the connection. +$$ From 6de973ca2c857e706c088609789b9e38b61f7181 Mon Sep 17 00:00:00 2001 From: pangpang20 <676814828@qq.com> Date: Wed, 8 Jan 2025 12:05:14 +0800 Subject: [PATCH 7/8] update codes and docs --- docker/development/Dockerfile | 11 ++++--- docker/docker-compose-quickstart/Dockerfile | 4 ++- docker/run_local_docker.sh | 3 +- ingestion/Dockerfile | 29 ++++++++++++---- ingestion/Dockerfile.ci | 26 +++++++++++++-- ingestion/operators/docker/Dockerfile | 16 ++++++++- ingestion/operators/docker/Dockerfile.ci | 16 ++++++++- .../metadata/examples/workflows/gaussdb.yaml | 24 ++++++++++++++ .../examples/workflows/gaussdb_lineage.yaml | 18 ++++++++++ .../examples/workflows/gaussdb_usage.yaml | 33 +++++++++++++++++++ openmetadata-service/pom.xml | 4 +-- .../service/jdbi3/locator/ConnectionType.java | 3 +- .../migration/utils/v110/MigrationUtil.java | 33 +------------------ .../resources/databases/DatasourceConfig.java | 3 -- 14 files changed, 164 insertions(+), 59 deletions(-) create mode 100644 ingestion/src/metadata/examples/workflows/gaussdb.yaml create mode 100644 ingestion/src/metadata/examples/workflows/gaussdb_lineage.yaml create mode 100644 ingestion/src/metadata/examples/workflows/gaussdb_usage.yaml diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index 7f923b10a7cb..9251b124441b 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -26,13 +26,14 @@ FROM alpine:3 EXPOSE 8585 -RUN sed -i 's|http://dl-cdn.alpinelinux.org|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apk/repositories - - RUN adduser -D openmetadata && \ + echo "https://mirrors.aliyun.com/alpine/v3.18/main" > /etc/apk/repositories && \ + echo "https://mirrors.aliyun.com/alpine/v3.18/community" >> /etc/apk/repositories && \ + rm -rf /var/cache/apk/* && \ apk update && \ - apk upgrade && \ - apk add --update --no-cache bash openjdk17-jre + apk add --no-cache bash openjdk17 + + COPY --chown=openmetadata:openmetadata --from=build /opt/openmetadata /opt/openmetadata COPY --chmod=755 docker/openmetadata-start.sh / diff --git a/docker/docker-compose-quickstart/Dockerfile b/docker/docker-compose-quickstart/Dockerfile index bf11fc722813..e1756d7774fa 100644 --- a/docker/docker-compose-quickstart/Dockerfile +++ b/docker/docker-compose-quickstart/Dockerfile @@ -11,7 +11,9 @@ # Build stage FROM alpine:3 AS build -RUN sed -i 's|http://dl-cdn.alpinelinux.org|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apk/repositories + + + ARG RI_VERSION="1.6.0-SNAPSHOT" ENV RELEASE_URL="https://github.com/open-metadata/OpenMetadata/releases/download/${RI_VERSION}-release/openmetadata-${RI_VERSION}.tar.gz" diff --git a/docker/run_local_docker.sh b/docker/run_local_docker.sh index 3499df3186a7..597164d0715a 100755 --- a/docker/run_local_docker.sh +++ b/docker/run_local_docker.sh @@ -59,8 +59,7 @@ if [[ $skipMaven == "false" ]]; then mvn -DskipTests -DonlyBackend clean package -pl !openmetadata-ui else echo "$LINENO: Maven Build - Skipping Tests" - mvn -DskipTests clean compile - mvn -DskipTests clean package + mvn -U -DskipTests clean compile package fi else echo "$LINENO: Skipping Maven Build" diff --git a/ingestion/Dockerfile b/ingestion/Dockerfile index e7270c5c53ea..a5d383c21db9 100644 --- a/ingestion/Dockerfile +++ b/ingestion/Dockerfile @@ -5,8 +5,6 @@ USER root RUN curl -sS https://packages.microsoft.com/keys/microsoft.asc | apt-key add - RUN curl -sS https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list # Install Dependencies (listed in alphabetical order) - - ENV DEBIAN_FRONTEND=noninteractive RUN apt-get -qq update \ && apt-get -qq install -y \ @@ -57,6 +55,7 @@ COPY --from=mysql /usr/bin/mysqldump /usr/bin/mysqldump COPY ./.files/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip COPY ./.files/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip /root/instantclient-basic-linux.x64-19.17.0.0.0dbru.zip + RUN if [ $(uname -m) = "arm64" ] || [ $(uname -m) = "aarch64" ]; then \ unzip -qq -d /instantclient -j /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip && rm -f /root/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip; \ else \ @@ -68,7 +67,6 @@ RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && python3 -m pip install --upgrade pip USER root - ENV LD_LIBRARY_PATH=/instantclient # Install DB2 iAccess Driver @@ -96,9 +94,11 @@ ENV PIP_NO_CACHE_DIR=1 ENV PIP_QUIET=1 ARG RI_VERSION="1.6.0.0.dev0" RUN pip install --upgrade pip -RUN pip install "openmetadata-managed-apis~=${RI_VERSION}" --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.9.1/constraints-3.10.txt" -RUN pip install "openmetadata-ingestion[${INGESTION_DEPENDENCY}]~=${RI_VERSION}" -i https://pypi.tuna.tsinghua.edu.cn/simple -# RUN pip install "openmetadata-ingestion[${INGESTION_DEPENDENCY}]~=${RI_VERSION}" + +COPY ./.files/constraints-3.10.txt /opt/ +# RUN pip install "openmetadata-managed-apis~=${RI_VERSION}" --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.9.1/constraints-3.10.txt" +RUN pip install "openmetadata-managed-apis~=${RI_VERSION}" --constraint "/opt/constraints-3.10.txt" +RUN pip install "openmetadata-ingestion[${INGESTION_DEPENDENCY}]~=${RI_VERSION}" # Temporary workaround for https://github.com/open-metadata/OpenMetadata/issues/9593 RUN [ $(uname -m) = "x86_64" ] \ @@ -113,7 +113,22 @@ RUN pip freeze | grep "apache-airflow-providers" | grep --invert-match -E "docke # because the psycopg2-binary generates a architecture specific error # while authenticating connection with the airflow, psycopg2 solves this error RUN pip uninstall psycopg2-binary -y -RUN pip install psycopg2 mysqlclient==2.1.1 +# RUN pip install psycopg2 mysqlclient==2.1.1 +RUN pip install mysqlclient==2.1.1 + +COPY ./.files/GaussDB_driver.zip /home/airflow/GaussDB_driver.zip +RUN unzip -q /home/airflow/GaussDB_driver.zip -d /home/airflow/ && \ + rm -rf /home/airflow/GaussDB_driver.zip && \ + \cp /home/airflow/GaussDB_driver/Centralized/Hce2_arm_64/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz /home/airflow/ && \ + tar -zxf /home/airflow/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz -C /home/airflow/ && \ + rm -rf /home/airflow/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz && \ + rm -rf /home/airflow/GaussDB_driver && \ + \cp /home/airflow/psycopg2 $(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])') -r && \ + chmod 755 $(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])')/psycopg2 -R + +ENV PYTHONPATH="${PYTHONPATH}:$(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])')" +ENV LD_LIBRARY_PATH="/home/airflow/lib:$LD_LIBRARY_PATH" + # Make required folders for openmetadata-airflow-apis RUN mkdir -p /opt/airflow/dag_generated_configs # This is required as it's responsible to create airflow.cfg file diff --git a/ingestion/Dockerfile.ci b/ingestion/Dockerfile.ci index b51aa8615718..f3c134dcd40c 100644 --- a/ingestion/Dockerfile.ci +++ b/ingestion/Dockerfile.ci @@ -90,7 +90,11 @@ COPY --chown=airflow:0 openmetadata-airflow-apis /home/airflow/openmetadata-airf COPY --chown=airflow:0 ingestion/examples/airflow/dags /opt/airflow/dags USER airflow -ARG AIRFLOW_CONSTRAINTS_LOCATION="https://raw.githubusercontent.com/apache/airflow/constraints-2.9.1/constraints-3.10.txt" + + +COPY ./.files/constraints-3.10.txt /opt/ +ARG AIRFLOW_CONSTRAINTS_LOCATION="/opt/constraints-3.10.txt" +# ARG AIRFLOW_CONSTRAINTS_LOCATION="https://raw.githubusercontent.com/apache/airflow/constraints-2.9.1/constraints-3.10.txt" # Disable pip cache dir # https://pip.pypa.io/en/stable/topics/caching/#avoiding-caching @@ -107,7 +111,8 @@ WORKDIR /home/airflow/ingestion # Argument to provide for Ingestion Dependencies to install. Defaults to all ARG INGESTION_DEPENDENCY="all" -RUN pip install ".[${INGESTION_DEPENDENCY}]" -i https://pypi.tuna.tsinghua.edu.cn/simple +RUN pip install ".[${INGESTION_DEPENDENCY}]" +# RUN pip install ".[${INGESTION_DEPENDENCY}]" -i https://pypi.tuna.tsinghua.edu.cn/simple # Temporary workaround for https://github.com/open-metadata/OpenMetadata/issues/9593 RUN [ $(uname -m) = "x86_64" ] \ @@ -124,7 +129,22 @@ RUN pip freeze | grep "apache-airflow-providers" | grep --invert-match -E "docke # because the psycopg2-binary generates a architecture specific error # while authenticating connection with the airflow, psycopg2 solves this error RUN pip uninstall psycopg2-binary -y -RUN pip install psycopg2 mysqlclient==2.1.1 +RUN pip install mysqlclient==2.1.1 + +# install gaussdb driver +COPY ./.files/GaussDB_driver.zip /home/airflow/GaussDB_driver.zip +RUN unzip -q /home/airflow/GaussDB_driver.zip -d /home/airflow/ && \ + rm -rf /home/airflow/GaussDB_driver.zip && \ + \cp /home/airflow/GaussDB_driver/Centralized/Hce2_arm_64/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz /home/airflow/ && \ + tar -zxf /home/airflow/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz -C /home/airflow/ && \ + rm -rf /home/airflow/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz && \ + rm -rf /home/airflow/GaussDB_driver && \ + \cp /home/airflow/psycopg2 $(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])') -r && \ + chmod 755 $(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])')/psycopg2 -R + +ENV PYTHONPATH="${PYTHONPATH}:$(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])')" +ENV LD_LIBRARY_PATH="/home/airflow/lib:$LD_LIBRARY_PATH" + # Make required folders for openmetadata-airflow-apis RUN mkdir -p /opt/airflow/dag_generated_configs diff --git a/ingestion/operators/docker/Dockerfile b/ingestion/operators/docker/Dockerfile index 192878c89a73..c5d8d1ad6075 100644 --- a/ingestion/operators/docker/Dockerfile +++ b/ingestion/operators/docker/Dockerfile @@ -112,4 +112,18 @@ RUN [ $(uname -m) = "x86_64" ] \ # because the psycopg2-binary generates a architecture specific error # while authenticating connection with the airflow, psycopg2 solves this error RUN pip uninstall psycopg2-binary -y -RUN pip install psycopg2 mysqlclient==2.1.1 +RUN pip install mysqlclient==2.1.1 + +# install gaussdb driver +COPY ./.files/GaussDB_driver.zip /home/airflow/GaussDB_driver.zip +RUN unzip -q /home/airflow/GaussDB_driver.zip -d /home/airflow/ && \ + rm -rf /home/airflow/GaussDB_driver.zip && \ + \cp /home/airflow/GaussDB_driver/Centralized/Hce2_arm_64/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz /home/airflow/ && \ + tar -zxf /home/airflow/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz -C /home/airflow/ && \ + rm -rf /home/airflow/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz && \ + rm -rf /home/airflow/GaussDB_driver && \ + \cp /home/airflow/psycopg2 $(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])') -r && \ + chmod 755 $(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])')/psycopg2 -R + +ENV PYTHONPATH="${PYTHONPATH}:$(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])')" +ENV LD_LIBRARY_PATH="/home/airflow/lib:$LD_LIBRARY_PATH" diff --git a/ingestion/operators/docker/Dockerfile.ci b/ingestion/operators/docker/Dockerfile.ci index 94569e1c154b..271dd16ba332 100644 --- a/ingestion/operators/docker/Dockerfile.ci +++ b/ingestion/operators/docker/Dockerfile.ci @@ -112,4 +112,18 @@ COPY ingestion/operators/docker/*.py . # because the psycopg2-binary generates a architecture specific error # while authenticating connection with the airflow, psycopg2 solves this error RUN pip uninstall psycopg2-binary -y -RUN pip install psycopg2 mysqlclient==2.1.1 +RUN pip install mysqlclient==2.1.1 + +# install gaussdb driver +COPY ./.files/GaussDB_driver.zip /home/airflow/GaussDB_driver.zip +RUN unzip -q /home/airflow/GaussDB_driver.zip -d /home/airflow/ && \ + rm -rf /home/airflow/GaussDB_driver.zip && \ + \cp /home/airflow/GaussDB_driver/Centralized/Hce2_arm_64/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz /home/airflow/ && \ + tar -zxf /home/airflow/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz -C /home/airflow/ && \ + rm -rf /home/airflow/GaussDB-Kernel_505.2.0_Hce_64bit_Python.tar.gz && \ + rm -rf /home/airflow/GaussDB_driver && \ + \cp /home/airflow/psycopg2 $(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])') -r && \ + chmod 755 $(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])')/psycopg2 -R + +ENV PYTHONPATH="${PYTHONPATH}:$(/home/airflow/.local/bin/python3 -c 'import site; print(site.getsitepackages()[0])')" +ENV LD_LIBRARY_PATH="/home/airflow/lib:$LD_LIBRARY_PATH" diff --git a/ingestion/src/metadata/examples/workflows/gaussdb.yaml b/ingestion/src/metadata/examples/workflows/gaussdb.yaml new file mode 100644 index 000000000000..0e5dd7f384af --- /dev/null +++ b/ingestion/src/metadata/examples/workflows/gaussdb.yaml @@ -0,0 +1,24 @@ +source: + type: gaussdb + serviceName: local_gaussdb + serviceConnection: + config: + type: Gaussdb + username: openmetadata_user + authType: + password: openmetadata_password + hostPort: localhost:8000 + database: pagila + sourceConfig: + config: + type: DatabaseMetadata +sink: + type: metadata-rest + config: {} +workflowConfig: +# loggerLevel: INFO # DEBUG, INFO, WARN or ERROR + openMetadataServerConfig: + hostPort: http://localhost:8585/api + authProvider: openmetadata + securityConfig: + jwtToken: "eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg" diff --git a/ingestion/src/metadata/examples/workflows/gaussdb_lineage.yaml b/ingestion/src/metadata/examples/workflows/gaussdb_lineage.yaml new file mode 100644 index 000000000000..7e40b245678d --- /dev/null +++ b/ingestion/src/metadata/examples/workflows/gaussdb_lineage.yaml @@ -0,0 +1,18 @@ +source: + type: gaussdb-lineage + serviceName: local_gaussdb + sourceConfig: + config: + type: DatabaseLineage + queryLogDuration: 1 + resultLimit: 10000 +sink: + type: metadata-rest + config: {} +workflowConfig: +# loggerLevel: INFO # DEBUG, INFO, WARN or ERROR + openMetadataServerConfig: + hostPort: http://localhost:8585/api + authProvider: openmetadata + securityConfig: + jwtToken: "eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg" diff --git a/ingestion/src/metadata/examples/workflows/gaussdb_usage.yaml b/ingestion/src/metadata/examples/workflows/gaussdb_usage.yaml new file mode 100644 index 000000000000..2f67ffefed8f --- /dev/null +++ b/ingestion/src/metadata/examples/workflows/gaussdb_usage.yaml @@ -0,0 +1,33 @@ +source: + type: gaussdb-usage + serviceName: local_gaussdb + serviceConnection: + config: + type: Gaussdb + username: username + authType: + password: password + hostPort: localhost:8000 + database: database_name + sourceConfig: + config: + type: DatabaseUsage + queryLogDuration: 1 +processor: + type: query-parser + config: {} +stage: + type: table-usage + config: + filename: /tmp/gaussdb_usage +bulkSink: + type: metadata-usage + config: + filename: /tmp/gaussdb_usage +workflowConfig: +# loggerLevel: INFO # DEBUG, INFO, WARN or ERROR + openMetadataServerConfig: + hostPort: http://localhost:8585/api + authProvider: openmetadata + securityConfig: + jwtToken: eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg diff --git a/openmetadata-service/pom.xml b/openmetadata-service/pom.xml index 3f24e4d61269..763c91fcea34 100644 --- a/openmetadata-service/pom.xml +++ b/openmetadata-service/pom.xml @@ -54,7 +54,7 @@ pac4j-core ${pac4j.version} - + org.slf4j slf4j-api @@ -469,7 +469,7 @@ json 20240303 - + com.networknt json-schema-validator diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/locator/ConnectionType.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/locator/ConnectionType.java index 43042da5df83..e104921d9a42 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/locator/ConnectionType.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/locator/ConnectionType.java @@ -21,8 +21,7 @@ @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum ConnectionType { MYSQL("com.mysql.cj.jdbc.Driver"), - POSTGRES("org.postgresql.Driver"), - GAUSSDB("org.postgresql.Driver"); + POSTGRES("org.postgresql.Driver"); public final String label; diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v110/MigrationUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v110/MigrationUtil.java index f947a5155682..611e364a6a95 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v110/MigrationUtil.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v110/MigrationUtil.java @@ -86,22 +86,15 @@ private MigrationUtil() { "UPDATE %s SET %s = :nameHashColumnValue WHERE id = :id"; private static final String POSTGRES_ENTITY_UPDATE = "UPDATE %s SET %s = :nameHashColumnValue WHERE id = :id"; - private static final String GAUSSDB_ENTITY_UPDATE = - "UPDATE %s SET %s = :nameHashColumnValue WHERE id = :id"; - private static final String MYSQL_ENTITY_EXTENSION_TIME_SERIES_UPDATE = "UPDATE entity_extension_time_series set entityFQNHash = :entityFQNHash where entityFQN=:entityFQN"; private static final String POSTGRES_ENTITY_EXTENSION_TIME_SERIES_UPDATE = "UPDATE entity_extension_time_series set entityFQNHash = :entityFQNHash where entityFQN=:entityFQN"; - private static final String GAUSSDB_ENTITY_EXTENSION_TIME_SERIES_UPDATE = - "UPDATE entity_extension_time_series set entityFQNHash = :entityFQNHash where entityFQN=:entityFQN"; private static final String MYSQL_FIELD_RELATIONSHIP_UPDATE = "UPDATE field_relationship SET fromFQNHash = :fromFQNHash, toFQNHash = :toFQNHash where fromFQN= :fromFQN and toFQN = :toFQN"; private static final String POSTGRES_FIELD_RELATIONSHIP_UPDATE = "UPDATE field_relationship SET fromFQNHash = :fromFQNHash, toFQNHash = :toFQNHash where fromFQN= :fromFQN and toFQN = :toFQN"; - private static final String GAUSSDB_FIELD_RELATIONSHIP_UPDATE = - "UPDATE field_relationship SET fromFQNHash = :fromFQNHash, toFQNHash = :toFQNHash where fromFQN= :fromFQN and toFQN = :toFQN"; @SneakyThrows public static void updateFQNHashForEntity( @@ -123,16 +116,7 @@ public static void updateFQNHashForEntity( false, limitParam, nameHashColumn); - } else if (Boolean.TRUE.equals(DatasourceConfig.getInstance().isGaussDB())) { - readAndProcessEntity( - handle, - String.format(GAUSSDB_ENTITY_UPDATE, dao.getTableName(), nameHashColumn), - clazz, - dao, - false, - limitParam, - nameHashColumn); - } else { + } else { readAndProcessEntity( handle, String.format(POSTGRES_ENTITY_UPDATE, dao.getTableName(), nameHashColumn), @@ -163,15 +147,6 @@ public static void updateFQNHashForEntityWithName( true, limitParam, nameHashColumn); - } else if(Boolean.TRUE.equals(DatasourceConfig.getInstance().isGaussDB())){ - readAndProcessEntity( - handle, - String.format(GAUSSDB_ENTITY_UPDATE, dao.getTableName(), nameHashColumn), - clazz, - dao, - true, - limitParam, - nameHashColumn); } else { readAndProcessEntity( handle, @@ -352,9 +327,6 @@ public static void dataMigrationFQNHashing( if (Boolean.TRUE.equals(DatasourceConfig.getInstance().isMySQL())) { updateFQNHashForFieldRelationship( handle, MYSQL_FIELD_RELATIONSHIP_UPDATE, collectionDAO, limitParam); - }else if(Boolean.TRUE.equals(DatasourceConfig.getInstance().isGaussDB())){ - updateFQNHashForFieldRelationship( - handle, GAUSSDB_FIELD_RELATIONSHIP_UPDATE, collectionDAO, limitParam); } else { updateFQNHashForFieldRelationship( handle, POSTGRES_FIELD_RELATIONSHIP_UPDATE, collectionDAO, limitParam); @@ -364,9 +336,6 @@ public static void dataMigrationFQNHashing( if (Boolean.TRUE.equals(DatasourceConfig.getInstance().isMySQL())) { updateFQNHashEntityExtensionTimeSeries( handle, MYSQL_ENTITY_EXTENSION_TIME_SERIES_UPDATE, collectionDAO, limitParam); - }else if(Boolean.TRUE.equals(DatasourceConfig.getInstance().isGaussDB())){ - updateFQNHashEntityExtensionTimeSeries( - handle, GAUSSDB_ENTITY_EXTENSION_TIME_SERIES_UPDATE, collectionDAO, limitParam); } else { updateFQNHashEntityExtensionTimeSeries( handle, POSTGRES_ENTITY_EXTENSION_TIME_SERIES_UPDATE, collectionDAO, limitParam); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatasourceConfig.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatasourceConfig.java index 8993c6c19e96..b3fe4d043ed0 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatasourceConfig.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatasourceConfig.java @@ -27,7 +27,4 @@ public Boolean isMySQL() { return ConnectionType.MYSQL.equals(connectionType); } - public Boolean isGaussDB() { - return ConnectionType.GAUSSDB.equals(connectionType); - } } From 6df72ee4b3f661bb058c60239d9feed9c643cbca Mon Sep 17 00:00:00 2001 From: pangpang20 <676814828@qq.com> Date: Tue, 14 Jan 2025 16:37:04 +0800 Subject: [PATCH 8/8] update codes and docs --- docker/run_local_docker.sh | 36 +- ingestion/pyproject.toml | 9 +- .../ingestion/connections/test_connections.py | 1 + .../source/database/gaussdb/metadata.py | 8 + .../source/database/gaussdb/queries.py | 22 +- .../source/database/gaussdb/utils.py | 65 +- ingestion/src/metadata/utils/logger.py | 4 +- .../content/v1.6.x-SNAPSHOT/menu.md | 20 +- .../testConnections/database/gaussdb.json | 8 +- .../database/gaussdbConnection.json | 2 +- .../ui/src/constants/Services.constant.ts | 2 + .../ui/src/utils/DatabaseServiceUtils.ts | 6 + package-lock.json | 3255 +++++++++++++++++ yarn.lock | 616 ++-- 14 files changed, 3663 insertions(+), 391 deletions(-) create mode 100644 package-lock.json diff --git a/docker/run_local_docker.sh b/docker/run_local_docker.sh index 597164d0715a..83d507bfed60 100755 --- a/docker/run_local_docker.sh +++ b/docker/run_local_docker.sh @@ -45,29 +45,33 @@ debugOM="${debugOM:=false}" authorizationToken="eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg" cleanDbVolumes="${cleanDbVolumes:=true}" -echo "$LINENO: Running local docker using mode [$mode] database [$database] and skipping maven build [$skipMaven] with cleanDB as [$cleanDbVolumes]" +log() { + echo "$(date '+%Y-%m-%d %H:%M:%S') $*" +} + +log "$LINENO: Running local docker using mode [$mode] database [$database] and skipping maven build [$skipMaven] with cleanDB as [$cleanDbVolumes]" cd ../ -echo "$LINENO: Stopping any previous Local Docker Containers" +log "$LINENO: Stopping any previous Local Docker Containers" docker compose -f docker/development/docker-compose-postgres.yml down --remove-orphans docker compose -f docker/development/docker-compose.yml down --remove-orphans if [[ $skipMaven == "false" ]]; then if [[ $mode == "no-ui" ]]; then - echo "$LINENO: Maven Build - Skipping Tests and UI" + log "$LINENO: Maven Build - Skipping Tests and UI" mvn -DskipTests -DonlyBackend clean package -pl !openmetadata-ui else - echo "$LINENO: Maven Build - Skipping Tests" - mvn -U -DskipTests clean compile package + log "$LINENO: Maven Build - Skipping Tests" + mvn -U -DskipTests clean package -X fi else - echo "$LINENO: Skipping Maven Build" + log "$LINENO: Skipping Maven Build" fi RESULT=$? if [ $RESULT -ne 0 ]; then - echo "$LINENO: Failed to run Maven build!" + log "$LINENO: Failed to run Maven build!" exit 1 fi @@ -85,29 +89,29 @@ fi if [[ $VIRTUAL_ENV == "" ]]; then - echo "$LINENO: Please Use Virtual Environment and make sure to generate Pydantic Models"; + log "$LINENO: Please Use Virtual Environment and make sure to generate Pydantic Models"; else - echo "$LINENO: Generating Pydantic Models"; + log "$LINENO: Generating Pydantic Models"; make install_dev generate fi -echo "$LINENO: Starting Local Docker Containers" -echo "$LINENO: Using ingestion dependency: ${INGESTION_DEPENDENCY:-all}" -echo "$LINENO: database: ${database}" +log "$LINENO: Starting Local Docker Containers" +log "$LINENO: Using ingestion dependency: ${INGESTION_DEPENDENCY:-all}" +log "$LINENO: database: ${database}" if [[ $database == "postgresql" ]]; then docker compose -f docker/development/docker-compose-postgres.yml build --build-arg INGESTION_DEPENDENCY="${INGESTION_DEPENDENCY:-all}" && docker compose -f docker/development/docker-compose-postgres.yml up -d elif [[ $database == "mysql" ]]; then docker compose -f docker/development/docker-compose.yml build --build-arg INGESTION_DEPENDENCY="${INGESTION_DEPENDENCY:-all}" && docker compose -f docker/development/docker-compose.yml up -d else - echo "$LINENO: Invalid database type: $database" + log "$LINENO: Invalid database type: $database" exit 1 fi RESULT=$? if [ $RESULT -ne 0 ]; then - echo "$LINENO: Failed to start Docker instances!" + log "$LINENO: Failed to start Docker instances!" exit 1 fi @@ -168,11 +172,11 @@ curl --location --request PATCH 'localhost:8080/api/v1/dags/sample_lineage' \ "is_paused": false }' -echo "$LINENO: ✔running reindexing" +log "$LINENO: ✔running reindexing" # Trigger ElasticSearch ReIndexing from UI curl --location --request POST 'http://localhost:8585/api/v1/apps/trigger/SearchIndexingApplication' \ --header 'Authorization: Bearer eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg' sleep 60 # Sleep for 60 seconds to make sure the elasticsearch reindexing from UI finishes tput setaf 2 -echo "$LINENO: ✔ OpenMetadata is up and running" +log "$LINENO: ✔ OpenMetadata is up and running" diff --git a/ingestion/pyproject.toml b/ingestion/pyproject.toml index a0b6ab739ece..f0d464027651 100644 --- a/ingestion/pyproject.toml +++ b/ingestion/pyproject.toml @@ -118,7 +118,7 @@ ignore-paths = [ ".*/src/metadata/ingestion/source/.*/service_spec.py", "ingestion/src/metadata/profiler/metrics", "ingestion/src/metadata/profiler/source/databricks", - + # metadata ingestion sources "ingestion/src/metadata/ingestion/source/api/rest/connection.py", "ingestion/src/metadata/ingestion/source/api/rest/metadata.py", @@ -176,6 +176,13 @@ ignore-paths = [ "ingestion/src/metadata/ingestion/source/database/postgres/metrics.py", "ingestion/src/metadata/ingestion/source/database/postgres/types/money.py", "ingestion/src/metadata/ingestion/source/database/postgres/utils.py", + "ingestion/src/metadata/ingestion/source/database/gaussdb/connection.py", + "ingestion/src/metadata/ingestion/source/database/gaussdb/converter_orm.py", + "ingestion/src/metadata/ingestion/source/database/gaussdb/lineage.py", + "ingestion/src/metadata/ingestion/source/database/gaussdb/metadata.py", + "ingestion/src/metadata/ingestion/source/database/gaussdb/metrics.py", + "ingestion/src/metadata/ingestion/source/database/gaussdb/types/money.py", + "ingestion/src/metadata/ingestion/source/database/gaussdb/utils.py", "ingestion/src/metadata/ingestion/source/database/redshift/incremental_table_processor.py", "ingestion/src/metadata/ingestion/source/database/redshift/lineage.py", "ingestion/src/metadata/ingestion/source/database/redshift/models.py", diff --git a/ingestion/src/metadata/ingestion/connections/test_connections.py b/ingestion/src/metadata/ingestion/connections/test_connections.py index c71b04a89d4e..f5a6e9bbbcdc 100644 --- a/ingestion/src/metadata/ingestion/connections/test_connections.py +++ b/ingestion/src/metadata/ingestion/connections/test_connections.py @@ -44,6 +44,7 @@ from metadata.utils.logger import cli_logger from metadata.utils.timeout import timeout + logger = cli_logger() diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/metadata.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/metadata.py index c135994c2b21..cba8d89b3d0d 100644 --- a/ingestion/src/metadata/ingestion/source/database/gaussdb/metadata.py +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/metadata.py @@ -65,12 +65,16 @@ from metadata.ingestion.source.database.gaussdb.utils import ( get_column_info, get_columns, + get_column_args, + get_column_default, get_etable_owner, get_foreign_keys, get_json_fields_and_type, get_table_comment, get_table_owner, get_view_definition, + get_gaussdb_version, + get_gaussdb_time_column_name ) from metadata.utils import fqn from metadata.utils.filters import filter_by_database @@ -143,6 +147,10 @@ PGDialect.get_all_table_owners = get_all_table_owners PGDialect.get_table_owner = get_table_owner PGDialect.ischema_names = ischema_names +PGDialect._get_server_version_info = get_gaussdb_version +PGDialect._get_time_column_name = get_gaussdb_time_column_name +PGDialect.get_column_args = get_column_args +PGDialect.get_column_default = get_column_default Inspector.get_all_table_ddls = get_all_table_ddls Inspector.get_table_ddl = get_table_ddl diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/queries.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/queries.py index 0434935ca874..01f6e135c043 100644 --- a/ingestion/src/metadata/ingestion/source/database/gaussdb/queries.py +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/queries.py @@ -152,26 +152,6 @@ select datname from pg_catalog.pg_database """ -GAUSSDB_COL_IDENTITY = """\ - (SELECT json_build_object( - 'always', a.attidentity = 'a', - 'start', s.last_number, - 'increment', s.increment_by, - 'minvalue', s.min_value, - 'maxvalue', s.max_value, - 'cache', s.cache_size, - 'cycle', s.cycle_flag) - FROM ADM_SEQUENCES s - JOIN PG_STATIO_ALL_SEQUENCES p on p.relname=s.sequence_name - JOIN pg_catalog.pg_class c on p.relid = c."oid" - WHERE c.relkind = 'S' - AND a.attidentity != '' - AND s.seqrelid = pg_catalog.pg_get_serial_sequence( - a.attrelid::regclass::text, a.attname - )::regclass::oid - ) as identity_options\ -""" - GAUSSDB_SQL_COLUMNS = """ SELECT a.attname, pg_catalog.format_type(a.atttypid, a.atttypmod), @@ -195,7 +175,7 @@ """ GAUSSDB_GET_SERVER_VERSION = """ -show server_version +select version() """ GAUSSDB_FETCH_FK = """ diff --git a/ingestion/src/metadata/ingestion/source/database/gaussdb/utils.py b/ingestion/src/metadata/ingestion/source/database/gaussdb/utils.py index e39c91f53736..2c290e130d15 100644 --- a/ingestion/src/metadata/ingestion/source/database/gaussdb/utils.py +++ b/ingestion/src/metadata/ingestion/source/database/gaussdb/utils.py @@ -26,7 +26,6 @@ from metadata.generated.schema.entity.data.table import Column from metadata.ingestion.source.database.gaussdb.queries import ( - GAUSSDB_COL_IDENTITY, GAUSSDB_FETCH_FK, GAUSSDB_GET_JSON_FIELDS, GAUSSDB_GET_SERVER_VERSION, @@ -222,18 +221,10 @@ def get_columns( # pylint: disable=too-many-locals table_oid = self.get_table_oid( connection, table_name, schema, info_cache=kw.get("info_cache") ) - generated = ( - "a.attgenerated as generated" - if self.server_version_info >= (12,) - else "NULL as generated" + "NULL as generated" ) - if self.server_version_info >= (10,): - # a.attidentity != '' is required or it will reflect also - # serial columns as identity. - identity = GAUSSDB_COL_IDENTITY - else: - identity = "NULL as identity_options" + identity = "NULL as identity_options" sql_col_query = GAUSSDB_SQL_COLUMNS.format( generated=generated, @@ -514,32 +505,46 @@ def get_view_definition( ) -def get_gaussdb_version(engine) -> Optional[str]: + +import re +from typing import Optional + +def get_gaussdb_version(self,engine) -> Optional[str]: """ - return the gaussdb version in major.minor.patch format + Return the GaussDB version in major.minor.patch format. """ - try: - results = engine.execute(GAUSSDB_GET_SERVER_VERSION) - for res in results: - version_string = str(res[0]) - opening_parenthesis_index = version_string.find("(") - if opening_parenthesis_index != -1: - return version_string[:opening_parenthesis_index].strip() - return version_string - except Exception as err: - logger.warning(f"Unable to fetch the gaussdb Version - {err}") - logger.debug(traceback.format_exc()) - return None + result = engine.execute(GAUSSDB_GET_SERVER_VERSION) + result_string = result.scalar() + if not result_string: + raise ValueError("Query result is empty or None.") + logger.debug(f"Query result: {result_string}") + match = re.match( + r".*(?:PostgreSQL|EnterpriseDB|GaussDB Kernel) " + r"(\d+)\.?(\d+)?(?:\.(\d+))?(?:\.\d+)?(?:devel|beta)?", + result_string, + ) + if not match: + logger.error(f"Could not match the version string: {result_string}") + raise AssertionError( + "Could not determine version from string '%s'" % result_string + ) + + logger.debug(f"Match groups: {match.groups()}") + + version_tuple = tuple([int(x) for x in match.group(1, 2, 3) if x is not None]) + logger.debug(f"Parsed version tuple: {version_tuple}") + + return version_tuple + + +# def get_gaussdb_version_wrapper(connection): + # return get_gaussdb_version(None,connection) + def get_gaussdb_time_column_name(engine) -> str: """ Return the correct column name for the time column based on gaussdb version """ time_column_name = "total_elapse_time" - gaussdb_version = get_gaussdb_version(engine) - if gaussdb_version and version.parse(gaussdb_version) < version.parse( - OLD_GAUSSDB_VERSION - ): - time_column_name = "total_elapse_time" return time_column_name diff --git a/ingestion/src/metadata/utils/logger.py b/ingestion/src/metadata/utils/logger.py index 0af8cb36dea4..4293a11040f4 100644 --- a/ingestion/src/metadata/utils/logger.py +++ b/ingestion/src/metadata/utils/logger.py @@ -167,7 +167,7 @@ def query_runner_logger(): return logging.getLogger(Loggers.QUERY_RUNNER.value) -def set_loggers_level(level: Union[int, str] = logging.INFO): +def set_loggers_level(level: Union[int, str] = logging.DEBUG): """ Set all loggers levels :param level: logging level @@ -179,7 +179,7 @@ def log_ansi_encoded_string( color: Optional[ANSI] = None, bold: bool = False, message: str = "", - level=logging.INFO, + level=logging.DEBUG, ): utils_logger().log( level=level, diff --git a/openmetadata-docs/content/v1.6.x-SNAPSHOT/menu.md b/openmetadata-docs/content/v1.6.x-SNAPSHOT/menu.md index 700fe6538718..f0f052885ba0 100644 --- a/openmetadata-docs/content/v1.6.x-SNAPSHOT/menu.md +++ b/openmetadata-docs/content/v1.6.x-SNAPSHOT/menu.md @@ -11,9 +11,9 @@ site_menu: url: /quick-start/local-kubernetes-deployment - category: Quickstart / Try the OpenMetadata Sandbox url: /quick-start/sandbox - - category: Quickstart / Getting Started + - category: Quickstart / Getting Started url: /quick-start/getting-started - - category: Quickstart / Getting Started / Day 1 + - category: Quickstart / Getting Started / Day 1 url: /quick-start/getting-started/day-1 - category: Quickstart / Getting Started / Day 1 / Database Service Setup url: /quick-start/getting-started/day-1/database-service-setup @@ -354,6 +354,12 @@ site_menu: url: /connectors/database/postgres/yaml - category: Connectors / Database / Postgres / Troubleshooting url: /connectors/database/postgres/troubleshooting + - category: Connectors / Database / Gaussdb + url: /connectors/database/gaussdb + - category: Connectors / Database / Gaussdb / Run Externally + url: /connectors/database/gaussdb/yaml + - category: Connectors / Database / Gaussdb / Troubleshooting + url: /connectors/database/gaussdb/troubleshooting - category: Connectors / Database / Presto url: /connectors/database/presto - category: Connectors / Database / Presto / Run Externally @@ -733,8 +739,8 @@ site_menu: url: /how-to-guides/admin-guide/how-to-add-custom-logo - category: How-to Guides / Admin Guide / Reindexing Search url: /how-to-guides/admin-guide/Reindexing-Search - - category: How-to Guides / Admin Guide / Persona and Landing Page Customization - url: /how-to-guides/admin-guide/persona-landing-page-customization + - category: How-to Guides / Admin Guide / Persona and Landing Page Customization + url: /how-to-guides/admin-guide/persona-landing-page-customization - category: How-to Guides / Admin Guide / Persona and Landing Page Customization / How to Customize a Landing Page url: /how-to-guides/admin-guide/persona-landing-page-customization/customizable-landing-page - category: How-to Guides / Admin Guide / Persona and Landing Page Customization / How to Define Personas @@ -821,11 +827,11 @@ site_menu: url: /how-to-guides/data-quality-observability/quality/test - category: How-to Guides / Data Quality and Observability / Data Quality / Configure Data Quality url: /how-to-guides/data-quality-observability/quality/configure - - category: How-to Guides / Data Quality Observability / Data Quality / Adding Test Cases + - category: How-to Guides / Data Quality Observability / Data Quality / Adding Test Cases url: /how-to-guides/data-quality-observability/quality/adding-test-cases - - category: How-to Guides / Data Quality Observability / Data Quality / Adding Test Suites + - category: How-to Guides / Data Quality Observability / Data Quality / Adding Test Suites url: /how-to-guides/data-quality-observability/quality/adding-test-suites - - category: How-to Guides / Data Quality Observability / Data Quality / Test Cases From YAML Config + - category: How-to Guides / Data Quality Observability / Data Quality / Test Cases From YAML Config url: /how-to-guides/data-quality-observability/quality/test-cases-from-yaml-config - category: How-to Guides / Data Quality Observability / Data Quality / How to Visualize Test Results url: /how-to-guides/data-quality-observability/quality/visualize diff --git a/openmetadata-service/src/main/resources/json/data/testConnections/database/gaussdb.json b/openmetadata-service/src/main/resources/json/data/testConnections/database/gaussdb.json index f39c01682ad0..9f174e1a1ee0 100644 --- a/openmetadata-service/src/main/resources/json/data/testConnections/database/gaussdb.json +++ b/openmetadata-service/src/main/resources/json/data/testConnections/database/gaussdb.json @@ -35,14 +35,14 @@ }, { "name": "GetTags", - "description": "Check if we can access pg_policy, pg_class & pg_namespace tables to get the policy tags attached to tables.", - "errorMessage": "Failed to fetch policy tags, please validate if the user has at least select privileges for pg_policy, pg_class & pg_namespace tables.", + "description": "Check if we can access pg_rlspolicy, pg_class & pg_namespace tables to get the policy tags attached to tables.", + "errorMessage": "Failed to fetch policy tags, please validate if the user has at least select privileges for pg_rlspolicy, pg_class & pg_namespace tables.", "mandatory": false }, { "name": "GetQueries", - "description":"Check if we can access the pg_stat_statements table to get query logs, These queries are analyzed in the usage & lineage workflow.", - "errorMessage": "Failed to fetch queries, please validate if gaussdb instance has pg_stat_statements extension installed and the user has at least select privileges for pg_stat_statements table.", + "description":"Check if we can access the dbe_perf.statement table to get query logs, These queries are analyzed in the usage & lineage workflow.", + "errorMessage": "Failed to fetch queries, please validate if gaussdb instance has dbe_perf.statement extension installed and the user has at least select privileges for dbe_perf.statement table.", "mandatory": false } ] diff --git a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/database/gaussdbConnection.json b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/database/gaussdbConnection.json index 16a5062a66a0..a126967d8942 100644 --- a/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/database/gaussdbConnection.json +++ b/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/database/gaussdbConnection.json @@ -1,5 +1,5 @@ { - "$id": "https://open-metadata.org/schema/entity/services/connections/database/gaussdbConnection.json", + "$id": "https://github.com/pangpang20/OpenMetadata/blob/gaussdb-dev/openmetadata-spec/src/main/resources/json/schema/entity/services/connections/database/gaussdbConnection.json", "$schema": "http://json-schema.org/draft-07/schema#", "title": "GaussdbConnection", "description": "Gaussdb Database Connection Config", diff --git a/openmetadata-ui/src/main/resources/ui/src/constants/Services.constant.ts b/openmetadata-ui/src/main/resources/ui/src/constants/Services.constant.ts index b2847371b105..87018a9f0345 100644 --- a/openmetadata-ui/src/main/resources/ui/src/constants/Services.constant.ts +++ b/openmetadata-ui/src/main/resources/ui/src/constants/Services.constant.ts @@ -39,6 +39,7 @@ import dynamodb from '../assets/img/service-icon-dynamodb.png'; import exasol from '../assets/img/service-icon-exasol.png'; import fivetran from '../assets/img/service-icon-fivetran.png'; import flink from '../assets/img/service-icon-flink.png'; +import gaussdb from '../assets/img/service-icon-gaussdb.png'; import gcs from '../assets/img/service-icon-gcs.png'; import glue from '../assets/img/service-icon-glue.png'; import greenplum from '../assets/img/service-icon-greenplum.png'; @@ -164,6 +165,7 @@ export const UNITYCATALOG = databrick; export const IBMDB2 = ibmdb2; export const DORIS = doris; export const DRUID = druid; +export const GAUSSDB = gaussdb; export const DYNAMODB = dynamodb; export const SIGMA = sigma; export const SINGLESTORE = singlestore; diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/DatabaseServiceUtils.ts b/openmetadata-ui/src/main/resources/ui/src/utils/DatabaseServiceUtils.ts index 912818d909ad..b45943ce3c9e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/DatabaseServiceUtils.ts +++ b/openmetadata-ui/src/main/resources/ui/src/utils/DatabaseServiceUtils.ts @@ -30,6 +30,7 @@ import dorisConnection from '../jsons/connectionSchemas/connections/database/dor import druidConnection from '../jsons/connectionSchemas/connections/database/druidConnection.json'; import dynamoDBConnection from '../jsons/connectionSchemas/connections/database/dynamoDBConnection.json'; import exasolConnection from '../jsons/connectionSchemas/connections/database/exasolConnection.json'; +import gaussdbConnection from '../jsons/connectionSchemas/connections/database/gaussdbConnection.json'; import glueConnection from '../jsons/connectionSchemas/connections/database/glueConnection.json'; import greenplumConnection from '../jsons/connectionSchemas/connections/database/greenplumConnection.json'; import hiveConnection from '../jsons/connectionSchemas/connections/database/hiveConnection.json'; @@ -167,6 +168,11 @@ export const getDatabaseConfig = (type: DatabaseServiceType) => { break; } + case DatabaseServiceType.Gaussdb: { + schema = gaussdbConnection; + + break; + } case DatabaseServiceType.Presto: { schema = prestoConnection; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000000..9e81e0127c5c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3255 @@ +{ + "name": "open-metadata", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "open-metadata", + "version": "0.1.0", + "hasInstallScript": true, + "devDependencies": { + "cypress": "^13.17.0", + "quicktype": "20.0.27" + }, + "engines": { + "node": ">=10.0.0", + "yarn": "^1.22.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cypress/request": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@cypress/request/-/request-3.0.7.tgz", + "integrity": "sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~4.0.0", + "http-signature": "~1.4.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.13.1", + "safe-buffer": "^5.1.2", + "tough-cookie": "^5.0.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@glideapps/ts-necessities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.3.2.tgz", + "integrity": "sha512-tOXo3SrEeLu+4X2q6O2iNPXdGI1qoXEz/KrbkElTsWiWb69tFH4GzWz2K++0nBD6O3qO2Ft1C4L4ZvUfE2QDlQ==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mark.probst/typescript-json-schema": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@mark.probst/typescript-json-schema/-/typescript-json-schema-0.55.0.tgz", + "integrity": "sha512-jI48mSnRgFQxXiE/UTUCVCpX8lK3wCFKLF1Ss2aEreboKNuLQGt3e0/YFqWVHe/WENxOaqiJvwOz+L/SrN2+qQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/node": "^16.9.2", + "glob": "^7.1.7", + "path-equal": "^1.1.2", + "safe-stable-stringify": "^2.2.0", + "ts-node": "^10.9.1", + "typescript": "4.9.4", + "yargs": "^17.1.1" + }, + "bin": { + "typescript-json-schema": "bin/typescript-json-schema" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "16.18.108", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.108.tgz", + "integrity": "sha512-fj42LD82fSv6yN9C6Q4dzS+hujHj+pTv0IpRR3kI20fnYeS0ytBpjFO9OjmDowSPPt4lNKN46JLaKbCyP+BW2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.9", + "resolved": "https://registry.npmmirror.com/@types/sizzle/-/sizzle-2.3.9.tgz", + "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/urijs": { + "version": "1.19.25", + "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.25.tgz", + "integrity": "sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl/node_modules/@types/node": { + "version": "22.10.2", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browser-or-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", + "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0" + }, + "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, + "license": "MIT", + "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/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmmirror.com/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ci-info": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/collection-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz", + "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==", + "dev": true, + "license": "Apache-2.0" + }, + "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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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-args/node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/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, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/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, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/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, + "license": "MIT" + }, + "node_modules/command-line-usage/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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/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, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cypress": { + "version": "13.17.0", + "resolved": "https://registry.npmmirror.com/cypress/-/cypress-13.17.0.tgz", + "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@cypress/request": "^3.0.6", + "@cypress/xvfb": "^1.2.4", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.7.1", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "ci-info": "^4.0.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "process": "^0.11.10", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.5.3", + "supports-color": "^8.1.1", + "tmp": "~0.2.3", + "tree-kill": "1.2.2", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" + } + }, + "node_modules/cypress/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmmirror.com/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "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, + "license": "ISC", + "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/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphql": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", + "integrity": "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "iterall": "1.1.3" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-signature": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.18.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "license": "ISC", + "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, + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/iterall": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", + "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "> 0.8" + } + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmmirror.com/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "license": "MIT", + "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/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "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/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/path-equal": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/path-equal/-/path-equal-1.2.5.tgz", + "integrity": "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==", + "dev": true, + "license": "MIT" + }, + "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "license": "MIT" + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quicktype": { + "version": "20.0.27", + "resolved": "https://registry.npmjs.org/quicktype/-/quicktype-20.0.27.tgz", + "integrity": "sha512-1a+15T/pNxPTA5wkr7FArqifuk3aRU2P2qE2sbUYYlb0PUQ7wSYxD39khoR7X304DOGmMLAHiX0tduuqxQRVcQ==", + "dev": true, + "license": "Apache-2.0", + "workspaces": [ + "./packages/quicktype-core", + "./packages/quicktype-graphql-input", + "./packages/quicktype-typescript-input" + ], + "dependencies": { + "@glideapps/ts-necessities": "^2.1.2", + "chalk": "^4.1.2", + "command-line-args": "^5.2.1", + "command-line-usage": "^6.1.3", + "cross-fetch": "^3.1.5", + "graphql": "^0.11.7", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "quicktype-core": "20.0.27", + "quicktype-graphql-input": "20.0.27", + "quicktype-typescript-input": "20.0.27", + "readable-stream": "^4.3.0", + "stream-json": "1.7.5", + "string-to-stream": "^3.0.1", + "typescript": "4.9.4" + }, + "bin": { + "quicktype": "dist/index.js" + }, + "engines": { + "node": ">=18.13.0" + } + }, + "node_modules/quicktype-core": { + "version": "20.0.27", + "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-20.0.27.tgz", + "integrity": "sha512-1lTJ7t2Zx8ivO0KLPo4Fta/GniFgclXi46O3wyA60IFHoFjyDdVRNs/PYFwtwnqCIziI6ZXgdwRNQYNEZOSjJg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@glideapps/ts-necessities": "2.1.2", + "@types/urijs": "^1.19.19", + "browser-or-node": "^2.1.1", + "collection-utils": "^1.0.1", + "cross-fetch": "^3.1.5", + "is-url": "^1.2.4", + "js-base64": "^2.4.3", + "lodash": "^4.17.21", + "pako": "^1.0.6", + "pluralize": "^8.0.0", + "readable-stream": "4.3.0", + "unicode-properties": "^1.4.1", + "urijs": "^1.19.1", + "wordwrap": "^1.0.0", + "yaml": "^2.2.1" + } + }, + "node_modules/quicktype-core/node_modules/@glideapps/ts-necessities": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.2.tgz", + "integrity": "sha512-tLjfhinr6doUBcWi7BWnkT2zT6G5UhiZftsiIH6xVvykeXE+FU7Wr0MyqwmqideWlDD5rG+VjVLptLviGo04CA==", + "dev": true, + "license": "MIT" + }, + "node_modules/quicktype-core/node_modules/readable-stream": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", + "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/quicktype-graphql-input": { + "version": "20.0.27", + "resolved": "https://registry.npmjs.org/quicktype-graphql-input/-/quicktype-graphql-input-20.0.27.tgz", + "integrity": "sha512-G3vIIH7pSDk9AuoTSLylLvYQhhrxha1xHdOpELk7ww0C3WU1GChYHhB0bW+1dLl8pi8nLU+XmL/hfgNA+2gSRA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "collection-utils": "^1.0.1", + "graphql": "^0.11.7", + "quicktype-core": "20.0.27" + } + }, + "node_modules/quicktype-typescript-input": { + "version": "20.0.27", + "resolved": "https://registry.npmjs.org/quicktype-typescript-input/-/quicktype-typescript-input-20.0.27.tgz", + "integrity": "sha512-XmJphPzB6fWE7kJP2vTMsjEsnnGk7dRJAkpLqMLo5mE33ubhwQ3o2hOpBb2J/qcMrsPdKlMfCDVR2ZmVDoy98w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@mark.probst/typescript-json-schema": "0.55.0", + "quicktype-core": "20.0.27", + "typescript": "4.9.4" + } + }, + "node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.7.5.tgz", + "integrity": "sha512-NSkoVduGakxZ8a+pTPUlcGEeAGQpWL9rKJhOFCV+J/QtdQUEU5vtBgVg6eJXn8JB8RZvpbJWZGvXkhz70MLWoA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-to-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-3.0.1.tgz", + "integrity": "sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/string-to-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/throttleit": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/throttleit/-/throttleit-1.0.1.tgz", + "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tldts": { + "version": "6.1.70", + "resolved": "https://registry.npmmirror.com/tldts/-/tldts-6.1.70.tgz", + "integrity": "sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.70" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.70", + "resolved": "https://registry.npmmirror.com/tldts-core/-/tldts-core-6.1.70.tgz", + "integrity": "sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tough-cookie": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true, + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true, + "license": "MIT" + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "license": "MIT", + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/yarn.lock b/yarn.lock index a44718247037..87f0798c4470 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,19 +4,19 @@ "@colors/colors@1.5.0": version "1.5.0" - resolved "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + resolved "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@cypress/request@^3.0.6": version "3.0.7" - resolved "https://registry.npmmirror.com/@cypress/request/-/request-3.0.7.tgz#6a74a4da98d9e5ae9121d6e2d9c14780c9b5cf1a" + resolved "https://registry.npmmirror.com/@cypress/request/-/request-3.0.7.tgz" integrity sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg== dependencies: aws-sign2 "~0.7.0" @@ -40,35 +40,35 @@ "@cypress/xvfb@^1.2.4": version "1.2.4" - resolved "https://registry.npmmirror.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + resolved "https://registry.npmmirror.com/@cypress/xvfb/-/xvfb-1.2.4.tgz" integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== dependencies: debug "^3.1.0" lodash.once "^4.1.1" -"@glideapps/ts-necessities@2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@glideapps/ts-necessities/-/ts-necessities-2.1.2.tgz#bfa99d70893c48d6068997d70babec0f08edc879" - integrity sha512-tLjfhinr6doUBcWi7BWnkT2zT6G5UhiZftsiIH6xVvykeXE+FU7Wr0MyqwmqideWlDD5rG+VjVLptLviGo04CA== - "@glideapps/ts-necessities@^2.1.2": version "2.3.2" - resolved "https://registry.yarnpkg.com/@glideapps/ts-necessities/-/ts-necessities-2.3.2.tgz#3e7a07f41c8c07527757631f25599a7b67d39d8c" + resolved "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.3.2.tgz" integrity sha512-tOXo3SrEeLu+4X2q6O2iNPXdGI1qoXEz/KrbkElTsWiWb69tFH4GzWz2K++0nBD6O3qO2Ft1C4L4ZvUfE2QDlQ== +"@glideapps/ts-necessities@2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.2.tgz" + integrity sha512-tLjfhinr6doUBcWi7BWnkT2zT6G5UhiZftsiIH6xVvykeXE+FU7Wr0MyqwmqideWlDD5rG+VjVLptLviGo04CA== + "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -76,7 +76,7 @@ "@mark.probst/typescript-json-schema@0.55.0": version "0.55.0" - resolved "https://registry.yarnpkg.com/@mark.probst/typescript-json-schema/-/typescript-json-schema-0.55.0.tgz#a82c0cb8b3c9ba1a14faf2ea3fa95f26c1a6a57d" + resolved "https://registry.npmjs.org/@mark.probst/typescript-json-schema/-/typescript-json-schema-0.55.0.tgz" integrity sha512-jI48mSnRgFQxXiE/UTUCVCpX8lK3wCFKLF1Ss2aEreboKNuLQGt3e0/YFqWVHe/WENxOaqiJvwOz+L/SrN2+qQ== dependencies: "@types/json-schema" "^7.0.9" @@ -90,85 +90,78 @@ "@tsconfig/node10@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/json-schema@^7.0.9": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@*": - version "22.10.2" - resolved "https://registry.npmmirror.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" - integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== - dependencies: - undici-types "~6.20.0" - -"@types/node@^16.9.2": +"@types/node@*", "@types/node@^16.9.2": version "16.18.108" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.108.tgz#b794e2b2a85b4c12935ea7d0f18641be68b352f9" + resolved "https://registry.npmjs.org/@types/node/-/node-16.18.108.tgz" integrity sha512-fj42LD82fSv6yN9C6Q4dzS+hujHj+pTv0IpRR3kI20fnYeS0ytBpjFO9OjmDowSPPt4lNKN46JLaKbCyP+BW2A== "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" - resolved "https://registry.npmmirror.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + resolved "https://registry.npmmirror.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz" integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== "@types/sizzle@^2.3.2": version "2.3.9" - resolved "https://registry.npmmirror.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2" + resolved "https://registry.npmmirror.com/@types/sizzle/-/sizzle-2.3.9.tgz" integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w== "@types/urijs@^1.19.19": version "1.19.25" - resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.25.tgz#ac92b53e674c3b108decdbe88dc5f444a2f42f6a" + resolved "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.25.tgz" integrity sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg== "@types/yauzl@^2.9.1": version "2.10.3" - resolved "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + resolved "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz" integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== dependencies: "@types/node" "*" abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" acorn-walk@^8.1.1: version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" acorn@^8.11.0, acorn@^8.4.1: version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -176,127 +169,132 @@ aggregate-error@^3.0.0: ansi-colors@^4.1.1: version "4.1.3" - resolved "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" arch@^2.2.0: version "2.2.0" - resolved "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + resolved "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-back@^4.0.1, array-back@^4.0.2: +array-back@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== asn1@~0.2.3: version "0.2.6" - resolved "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async@^3.2.0: version "3.2.6" - resolved "https://registry.npmmirror.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + resolved "https://registry.npmmirror.com/async/-/async-3.2.6.tgz" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: version "1.13.2" - resolved "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" + resolved "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz" integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" blob-util@^2.0.2: version "2.0.2" - resolved "https://registry.npmmirror.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + resolved "https://registry.npmmirror.com/blob-util/-/blob-util-2.0.2.tgz" integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== bluebird@^3.7.2: version "3.7.2" - resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -304,17 +302,17 @@ brace-expansion@^1.1.7: browser-or-node@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-2.1.1.tgz#738790b3a86a8fc020193fa581273fbe65eaea0f" + resolved "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz" integrity sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg== buffer-crc32@~0.2.3: version "0.2.13" - resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer@^5.7.1: version "5.7.1" - resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -322,7 +320,7 @@ buffer@^5.7.1: buffer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -330,12 +328,12 @@ buffer@^6.0.3: cachedir@^2.3.0: version "2.4.0" - resolved "https://registry.npmmirror.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" + resolved "https://registry.npmmirror.com/cachedir/-/cachedir-2.4.0.tgz" integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== call-bind-apply-helpers@^1.0.1: version "1.0.1" - resolved "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + resolved "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz" integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: es-errors "^1.3.0" @@ -343,7 +341,7 @@ call-bind-apply-helpers@^1.0.1: call-bound@^1.0.2: version "1.0.3" - resolved "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + resolved "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.3.tgz" integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== dependencies: call-bind-apply-helpers "^1.0.1" @@ -351,12 +349,12 @@ call-bound@^1.0.2: caseless@~0.12.0: version "0.12.0" - resolved "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -365,7 +363,7 @@ chalk@^2.4.2: chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -373,29 +371,29 @@ chalk@^4.1.0, chalk@^4.1.2: check-more-types@^2.24.0: version "2.24.0" - resolved "https://registry.npmmirror.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + resolved "https://registry.npmmirror.com/check-more-types/-/check-more-types-2.24.0.tgz" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== ci-info@^4.0.0: version "4.1.0" - resolved "https://registry.npmmirror.com/ci-info/-/ci-info-4.1.0.tgz#92319d2fa29d2620180ea5afed31f589bc98cf83" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-4.1.0.tgz" integrity sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A== clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-table3@~0.6.1: version "0.6.5" - resolved "https://registry.npmmirror.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + resolved "https://registry.npmmirror.com/cli-table3/-/cli-table3-0.6.5.tgz" integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== dependencies: string-width "^4.2.0" @@ -404,7 +402,7 @@ cli-table3@~0.6.1: cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -412,7 +410,7 @@ cli-truncate@^2.1.0: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + 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" @@ -421,48 +419,48 @@ cliui@^8.0.1: collection-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/collection-utils/-/collection-utils-1.0.1.tgz#31d14336488674f27aefc0a7c5eccacf6df78044" + resolved "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz" integrity sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + 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" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colorette@^2.0.16: version "2.0.20" - resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-line-args@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== dependencies: array-back "^3.1.0" @@ -472,7 +470,7 @@ command-line-args@^5.2.1: command-line-usage@^6.1.3: version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: array-back "^4.0.2" @@ -482,39 +480,39 @@ command-line-usage@^6.1.3: commander@^6.2.1: version "6.2.1" - resolved "https://registry.npmmirror.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + resolved "https://registry.npmmirror.com/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== common-tags@^1.8.0: version "1.8.2" - resolved "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + resolved "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-fetch@^3.1.5: version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz" integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== dependencies: node-fetch "^2.6.12" cross-spawn@^7.0.0: version "7.0.6" - resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -523,7 +521,7 @@ cross-spawn@^7.0.0: cypress@^13.17.0: version "13.17.0" - resolved "https://registry.npmmirror.com/cypress/-/cypress-13.17.0.tgz#34c3d68080c4497eace0f353bd1629587a5f600d" + resolved "https://registry.npmmirror.com/cypress/-/cypress-13.17.0.tgz" integrity sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA== dependencies: "@cypress/request" "^3.0.6" @@ -572,48 +570,48 @@ cypress@^13.17.0: dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" dayjs@^1.10.4: version "1.11.13" - resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== debug@^3.1.0: version "3.2.7" - resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4.1.1, debug@^4.3.4: version "4.4.0" - resolved "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + resolved "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" deep-extend@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dunder-proto@^1.0.0: version "1.0.1" - resolved "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -622,7 +620,7 @@ dunder-proto@^1.0.0: ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" @@ -630,19 +628,19 @@ ecc-jsbn@~0.1.1: emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enquirer@^2.3.6: +enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": version "2.4.1" - resolved "https://registry.npmmirror.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + resolved "https://registry.npmmirror.com/enquirer/-/enquirer-2.4.1.tgz" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" @@ -650,49 +648,49 @@ enquirer@^2.3.6: es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + resolved "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz" integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: es-errors "^1.3.0" escalade@^3.1.1: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter2@6.4.7: version "6.4.7" - resolved "https://registry.npmmirror.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + resolved "https://registry.npmmirror.com/eventemitter2/-/eventemitter2-6.4.7.tgz" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== events@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== execa@4.1.0: version "4.1.0" - resolved "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + resolved "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== dependencies: cross-spawn "^7.0.0" @@ -707,19 +705,19 @@ execa@4.1.0: executable@^4.1.1: version "4.1.1" - resolved "https://registry.npmmirror.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + resolved "https://registry.npmmirror.com/executable/-/executable-4.1.1.tgz" integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== dependencies: pify "^2.2.0" extend@~3.0.2: version "3.0.2" - resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extract-zip@2.0.1: version "2.0.1" - resolved "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + resolved "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== dependencies: debug "^4.1.1" @@ -728,45 +726,45 @@ extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - extsprintf@^1.2.0: version "1.4.1" - resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + fd-slicer@~1.1.0: version "1.1.0" - resolved "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + resolved "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz" integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: pend "~1.2.0" figures@^3.2.0: version "3.2.0" - resolved "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + resolved "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" find-replace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + 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" forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@~4.0.0: version "4.0.1" - resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz" integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== dependencies: asynckit "^0.4.0" @@ -775,7 +773,7 @@ form-data@~4.0.0: fs-extra@^9.1.0: version "9.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -785,22 +783,22 @@ fs-extra@^9.1.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: version "1.2.6" - resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" + resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz" integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== dependencies: call-bind-apply-helpers "^1.0.1" @@ -816,28 +814,28 @@ get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" - resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" getos@^3.2.1: version "3.2.1" - resolved "https://registry.npmmirror.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + resolved "https://registry.npmmirror.com/getos/-/getos-3.2.1.tgz" integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== dependencies: async "^3.2.0" getpass@^0.1.1: version "0.1.7" - resolved "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" glob@^7.1.7: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -849,53 +847,53 @@ glob@^7.1.7: global-dirs@^3.0.0: version "3.0.1" - resolved "https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + resolved "https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.1.tgz" integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== dependencies: ini "2.0.0" gopd@^1.2.0: version "1.2.0" - resolved "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" - resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphql@^0.11.7: version "0.11.7" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.11.7.tgz#e5abaa9cb7b7cccb84e9f0836bf4370d268750c6" + resolved "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz" integrity sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw== dependencies: iterall "1.1.3" has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== hasown@^2.0.2: version "2.0.2" - resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" http-signature@~1.4.0: version "1.4.0" - resolved "https://registry.npmmirror.com/http-signature/-/http-signature-1.4.0.tgz#dee5a9ba2bf49416abc544abd6d967f6a94c8c3f" + resolved "https://registry.npmmirror.com/http-signature/-/http-signature-1.4.0.tgz" integrity sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg== dependencies: assert-plus "^1.0.0" @@ -904,45 +902,45 @@ http-signature@~1.4.0: human-signals@^1.1.1: version "1.1.1" - resolved "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + resolved "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@^2.0.3, inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + resolved "https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-installed-globally@~0.4.0: version "0.4.0" - resolved "https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + resolved "https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz" integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: global-dirs "^3.0.0" @@ -950,67 +948,67 @@ is-installed-globally@~0.4.0: is-path-inside@^3.0.2: version "3.0.3" - resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-url@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isstream@~0.1.2: version "0.1.2" - resolved "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== iterall@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.3.tgz#1cbbff96204056dde6656e2ed2e2226d0e6d72c9" + resolved "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz" integrity sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ== js-base64@^2.4.3: version "2.6.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== json-schema@0.4.0: version "0.4.0" - resolved "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + resolved "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -1019,7 +1017,7 @@ jsonfile@^6.0.1: jsprim@^2.0.2: version "2.0.2" - resolved "https://registry.npmmirror.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + resolved "https://registry.npmmirror.com/jsprim/-/jsprim-2.0.2.tgz" integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== dependencies: assert-plus "1.0.0" @@ -1029,12 +1027,12 @@ jsprim@^2.0.2: lazy-ass@^1.6.0: version "1.6.0" - resolved "https://registry.npmmirror.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + resolved "https://registry.npmmirror.com/lazy-ass/-/lazy-ass-1.6.0.tgz" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== listr2@^3.8.3: version "3.14.0" - resolved "https://registry.npmmirror.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + resolved "https://registry.npmmirror.com/listr2/-/listr2-3.14.0.tgz" integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" @@ -1048,22 +1046,22 @@ listr2@^3.8.3: lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.once@^4.1.1: version "4.1.1" - resolved "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + resolved "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.0.0: version "4.1.0" - resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -1071,7 +1069,7 @@ log-symbols@^4.0.0: log-update@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + resolved "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -1081,166 +1079,166 @@ log-update@^4.0.0: make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== math-intrinsics@^1.0.0: version "1.1.0" - resolved "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.35" - resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.8: version "1.2.8" - resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== moment@^2.29.4: version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== node-fetch@^2.6.12: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" npm-run-path@^4.0.0: version "4.0.1" - resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" object-inspect@^1.13.3: version "1.13.3" - resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.3.tgz" integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^5.1.0: version "5.1.2" - resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" ospath@^1.2.2: version "1.2.2" - resolved "https://registry.npmmirror.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + resolved "https://registry.npmmirror.com/ospath/-/ospath-1.2.2.tgz" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== p-map@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" pako@^0.2.5: version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + resolved "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= pako@^1.0.6: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== path-equal@^1.1.2: version "1.2.5" - resolved "https://registry.yarnpkg.com/path-equal/-/path-equal-1.2.5.tgz#9fcbdd5e5daee448e96f43f3bac06c666b5e982a" + resolved "https://registry.npmjs.org/path-equal/-/path-equal-1.2.5.tgz" integrity sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== pend@~1.2.0: version "1.2.0" - resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== pify@^2.2.0: version "2.3.0" - resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== pretty-bytes@^5.6.0: version "5.6.0" - resolved "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + resolved "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== proxy-from-env@1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz" integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== pump@^3.0.0: version "3.0.2" - resolved "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + resolved "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz" integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" @@ -1248,14 +1246,14 @@ pump@^3.0.0: qs@6.13.1: version "6.13.1" - resolved "https://registry.npmmirror.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" + resolved "https://registry.npmmirror.com/qs/-/qs-6.13.1.tgz" integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== dependencies: side-channel "^1.0.6" quicktype-core@20.0.27: version "20.0.27" - resolved "https://registry.yarnpkg.com/quicktype-core/-/quicktype-core-20.0.27.tgz#4bec92c94d86250146c64af5aa61c63f091a98c6" + resolved "https://registry.npmjs.org/quicktype-core/-/quicktype-core-20.0.27.tgz" integrity sha512-1lTJ7t2Zx8ivO0KLPo4Fta/GniFgclXi46O3wyA60IFHoFjyDdVRNs/PYFwtwnqCIziI6ZXgdwRNQYNEZOSjJg== dependencies: "@glideapps/ts-necessities" "2.1.2" @@ -1276,7 +1274,7 @@ quicktype-core@20.0.27: quicktype-graphql-input@20.0.27: version "20.0.27" - resolved "https://registry.yarnpkg.com/quicktype-graphql-input/-/quicktype-graphql-input-20.0.27.tgz#182867650c862f0a1d13901c5745a28ae6b8595d" + resolved "https://registry.npmjs.org/quicktype-graphql-input/-/quicktype-graphql-input-20.0.27.tgz" integrity sha512-G3vIIH7pSDk9AuoTSLylLvYQhhrxha1xHdOpELk7ww0C3WU1GChYHhB0bW+1dLl8pi8nLU+XmL/hfgNA+2gSRA== dependencies: collection-utils "^1.0.1" @@ -1285,7 +1283,7 @@ quicktype-graphql-input@20.0.27: quicktype-typescript-input@20.0.27: version "20.0.27" - resolved "https://registry.yarnpkg.com/quicktype-typescript-input/-/quicktype-typescript-input-20.0.27.tgz#89fd0b538373f618d99fa825e23039c159ede48f" + resolved "https://registry.npmjs.org/quicktype-typescript-input/-/quicktype-typescript-input-20.0.27.tgz" integrity sha512-XmJphPzB6fWE7kJP2vTMsjEsnnGk7dRJAkpLqMLo5mE33ubhwQ3o2hOpBb2J/qcMrsPdKlMfCDVR2ZmVDoy98w== dependencies: "@mark.probst/typescript-json-schema" "0.55.0" @@ -1294,7 +1292,7 @@ quicktype-typescript-input@20.0.27: quicktype@20.0.27: version "20.0.27" - resolved "https://registry.yarnpkg.com/quicktype/-/quicktype-20.0.27.tgz#4ceba352cac03733f8c9a37edfca8b5f07929200" + resolved "https://registry.npmjs.org/quicktype/-/quicktype-20.0.27.tgz" integrity sha512-1a+15T/pNxPTA5wkr7FArqifuk3aRU2P2qE2sbUYYlb0PUQ7wSYxD39khoR7X304DOGmMLAHiX0tduuqxQRVcQ== dependencies: "@glideapps/ts-necessities" "^2.1.2" @@ -1313,19 +1311,9 @@ quicktype@20.0.27: string-to-stream "^3.0.1" typescript "4.9.4" -readable-stream@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.3.0.tgz#0914d0c72db03b316c9733bb3461d64a3cc50cba" - integrity sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - readable-stream@^3.4.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -1334,7 +1322,7 @@ readable-stream@^3.4.0: readable-stream@^4.3.0: version "4.5.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz" integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== dependencies: abort-controller "^3.0.0" @@ -1343,26 +1331,36 @@ readable-stream@^4.3.0: process "^0.11.10" string_decoder "^1.3.0" +readable-stream@4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz" + integrity sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + reduce-flatten@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== request-progress@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + resolved "https://registry.npmmirror.com/request-progress/-/request-progress-3.0.0.tgz" integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== dependencies: throttleit "^1.0.0" require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -1370,51 +1368,51 @@ restore-cursor@^3.1.0: rfdc@^1.3.0: version "1.4.1" - resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rxjs@^7.5.1: version "7.8.1" - resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-stable-stringify@^2.2.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz" integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== semver@^7.5.3: version "7.6.3" - resolved "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + resolved "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel-list@^1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + resolved "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz" integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: es-errors "^1.3.0" @@ -1422,7 +1420,7 @@ side-channel-list@^1.0.0: side-channel-map@^1.0.1: version "1.0.1" - resolved "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + resolved "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" @@ -1432,7 +1430,7 @@ side-channel-map@^1.0.1: side-channel-weakmap@^1.0.2: version "1.0.2" - resolved "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + resolved "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" @@ -1443,7 +1441,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.0.6: version "1.1.0" - resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" @@ -1454,12 +1452,12 @@ side-channel@^1.0.6: signal-exit@^3.0.2: version "3.0.7" - resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -1468,7 +1466,7 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -1477,7 +1475,7 @@ slice-ansi@^4.0.0: sshpk@^1.18.0: version "1.18.0" - resolved "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + resolved "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz" integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" @@ -1492,75 +1490,75 @@ sshpk@^1.18.0: stream-chain@^2.2.5: version "2.2.5" - resolved "https://registry.yarnpkg.com/stream-chain/-/stream-chain-2.2.5.tgz#b30967e8f14ee033c5b9a19bbe8a2cba90ba0d09" + resolved "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz" integrity sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA== stream-json@1.7.5: version "1.7.5" - resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.7.5.tgz#2ff0563011f22cea4f6a28dbfc0344a53c761fe4" + resolved "https://registry.npmjs.org/stream-json/-/stream-json-1.7.5.tgz" integrity sha512-NSkoVduGakxZ8a+pTPUlcGEeAGQpWL9rKJhOFCV+J/QtdQUEU5vtBgVg6eJXn8JB8RZvpbJWZGvXkhz70MLWoA== dependencies: stream-chain "^2.2.5" +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string-to-stream@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/string-to-stream/-/string-to-stream-3.0.1.tgz#480e6fb4d5476d31cb2221f75307a5dcb6638a42" + resolved "https://registry.npmjs.org/string-to-stream/-/string-to-stream-3.0.1.tgz" integrity sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg== dependencies: readable-stream "^3.4.0" string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" -string_decoder@^1.1.1, string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + 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" supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" table-layout@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== dependencies: array-back "^4.0.1" @@ -1570,56 +1568,56 @@ table-layout@^1.0.2: throttleit@^1.0.0: version "1.0.1" - resolved "https://registry.npmmirror.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" + resolved "https://registry.npmmirror.com/throttleit/-/throttleit-1.0.1.tgz" integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== through@^2.3.8: version "2.3.8" - resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tiny-inflate@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" + resolved "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz" integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== tldts-core@^6.1.70: version "6.1.70" - resolved "https://registry.npmmirror.com/tldts-core/-/tldts-core-6.1.70.tgz#a954e93237ece2e1705b438600793c86a25f8c00" + resolved "https://registry.npmmirror.com/tldts-core/-/tldts-core-6.1.70.tgz" integrity sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg== tldts@^6.1.32: version "6.1.70" - resolved "https://registry.npmmirror.com/tldts/-/tldts-6.1.70.tgz#b571e5645ab9dc6f289453115d52602b8a384cfe" + resolved "https://registry.npmmirror.com/tldts/-/tldts-6.1.70.tgz" integrity sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA== dependencies: tldts-core "^6.1.70" tmp@~0.2.3: version "0.2.3" - resolved "https://registry.npmmirror.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + resolved "https://registry.npmmirror.com/tmp/-/tmp-0.2.3.tgz" integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== tough-cookie@^5.0.0: version "5.0.0" - resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" + resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-5.0.0.tgz" integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== dependencies: tldts "^6.1.32" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= tree-kill@1.2.2: version "1.2.2" - resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== ts-node@^10.9.1: version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -1638,49 +1636,49 @@ ts-node@^10.9.1: tslib@^2.1.0: version "2.8.1" - resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@4.9.4: +typescript@>=2.7, typescript@4.9.4: version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== typical@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== typical@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== undici-types@~6.20.0: version "6.20.0" - resolved "https://registry.npmmirror.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + resolved "https://registry.npmmirror.com/undici-types/-/undici-types-6.20.0.tgz" integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== unicode-properties@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.4.1.tgz#96a9cffb7e619a0dc7368c28da27e05fc8f9be5f" + resolved "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz" integrity sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg== dependencies: base64-js "^1.3.0" @@ -1688,7 +1686,7 @@ unicode-properties@^1.4.1: unicode-trie@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" + resolved "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz" integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== dependencies: pako "^0.2.5" @@ -1696,37 +1694,37 @@ unicode-trie@^2.0.0: universalify@^2.0.0: version "2.0.1" - resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== untildify@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + resolved "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== urijs@^1.19.1: version "1.19.11" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" + resolved "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz" integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== verror@1.10.0: version "1.10.0" - resolved "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" @@ -1735,12 +1733,12 @@ verror@1.10.0: webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= dependencies: tr46 "~0.0.3" @@ -1748,19 +1746,19 @@ whatwg-url@^5.0.0: which@^2.0.1: version "2.0.2" - resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wordwrap@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wordwrapjs@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== dependencies: reduce-flatten "^2.0.0" @@ -1768,7 +1766,7 @@ wordwrapjs@^4.0.0: wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -1777,7 +1775,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + 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" @@ -1786,27 +1784,27 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yaml@^2.2.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz" integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.1.1: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -1819,7 +1817,7 @@ yargs@^17.1.1: yauzl@^2.10.0: version "2.10.0" - resolved "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + resolved "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" @@ -1827,5 +1825,5 @@ yauzl@^2.10.0: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==