diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 57343215..965099c7 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -8,9 +8,16 @@ on: jobs: build: + name: Build with Exasol ${{ matrix.exasol_db_version }} runs-on: ubuntu-20.04 # UDFs fail with "VM error: Internal error: VM crashed" on ubuntu-latest + strategy: + fail-fast: false + matrix: + exasol_db_version: ["7.1.23", "8.23.0"] + env: + DEFAULT_EXASOL_DB_VERSION: "7.1.23" concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.exasol_db_version }} cancel-in-progress: true steps: - name: Checkout the repository @@ -25,16 +32,16 @@ jobs: 17 11 cache: "maven" - - name: Set up Node 16 + - name: Set up Node 18 uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 cache: "npm" cache-dependency-path: extension/package-lock.json - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19 + go-version: "1.20" - name: Cache Go modules uses: actions/cache@v3 with: @@ -60,7 +67,8 @@ jobs: run: | JAVA_HOME=$JAVA_HOME_11_X64 mvn --batch-mode clean verify \ -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn \ - -DtrimStackTrace=false + -DtrimStackTrace=false \ + -Dcom.exasol.dockerdb.image=${{ matrix.exasol_db_version }} env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} @@ -77,7 +85,7 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} - name: Sonar analysis - if: ${{ env.SONAR_TOKEN != null }} + if: ${{ env.SONAR_TOKEN != null && matrix.exasol_db_version == env.DEFAULT_EXASOL_DB_VERSION }} run: | JAVA_HOME=$JAVA_HOME_17_X64 mvn --batch-mode org.sonarsource.scanner.maven:sonar-maven-plugin:sonar \ -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn \ diff --git a/.github/workflows/dependencies_check.yml b/.github/workflows/dependencies_check.yml index 3059964b..4b6eadf6 100644 --- a/.github/workflows/dependencies_check.yml +++ b/.github/workflows/dependencies_check.yml @@ -1,12 +1,15 @@ -name: Dependencies Check +name: Report Security Issues for Repository on: + workflow_dispatch: schedule: - cron: "0 2 * * *" jobs: - build: + report_security_issues: runs-on: ubuntu-latest + permissions: + issues: write steps: - uses: actions/checkout@v4 @@ -16,5 +19,17 @@ jobs: distribution: "temurin" java-version: 11 cache: "maven" - - name: Checking dependencies for vulnerabilities - run: mvn --batch-mode org.sonatype.ossindex.maven:ossindex-maven-plugin:audit -f pom.xml + + - name: Generate ossindex report + run: | + mvn org.sonatype.ossindex.maven:ossindex-maven-plugin:audit \ + org.sonatype.ossindex.maven:ossindex-maven-plugin:audit-aggregate \ + -Dossindex.reportFile=$(pwd)/ossindex-report.json \ + -Dossindex.fail=false + + - name: Report Security Issues + uses: exasol/python-toolbox/.github/actions/security-issues@main + with: + format: "maven" + command: "cat ossindex-report.json" + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release_droid_prepare_original_checksum.yml b/.github/workflows/release_droid_prepare_original_checksum.yml index c0acd253..e59b37b1 100644 --- a/.github/workflows/release_droid_prepare_original_checksum.yml +++ b/.github/workflows/release_droid_prepare_original_checksum.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19 + go-version: "1.20" - name: Enable testcontainer reuse run: echo 'testcontainers.reuse.enable=true' > "$HOME/.testcontainers.properties" - name: Create test_config.properties diff --git a/dependencies.md b/dependencies.md index 56081f79..b4212f24 100644 --- a/dependencies.md +++ b/dependencies.md @@ -87,7 +87,7 @@ [10]: https://junit.org/junit5/ [11]: https://www.eclipse.org/legal/epl-v20.html [12]: https://github.com/mockito/mockito -[13]: https://github.com/mockito/mockito/blob/main/LICENSE +[13]: https://opensource.org/licenses/MIT [14]: https://java.testcontainers.org [15]: http://opensource.org/licenses/MIT [16]: https://github.com/exasol/test-db-builder-java/ @@ -138,4 +138,4 @@ [61]: http://zlika.github.io/reproducible-build-maven-plugin [62]: https://maven.apache.org/plugins/maven-clean-plugin/ [63]: https://www.mojohaus.org/exec-maven-plugin -[64]: https://registry.npmjs.org/@exasol/extension-manager-interface/-/extension-manager-interface-0.3.0.tgz +[64]: https://registry.npmjs.org/@exasol/extension-manager-interface/-/extension-manager-interface-0.4.0.tgz diff --git a/doc/changes/changelog.md b/doc/changes/changelog.md index dc8afa83..4aa33a9d 100644 --- a/doc/changes/changelog.md +++ b/doc/changes/changelog.md @@ -1,5 +1,6 @@ # Changes +* [2.8.3](changes_2.8.3.md) * [2.8.2](changes_2.8.2.md) * [2.8.1](changes_2.8.1.md) * [2.8.0](changes_2.8.0.md) diff --git a/doc/changes/changes_2.8.3.md b/doc/changes/changes_2.8.3.md new file mode 100644 index 00000000..f19bd6ec --- /dev/null +++ b/doc/changes/changes_2.8.3.md @@ -0,0 +1,54 @@ +# S3 Document Files Virtual Schema 2.8.3, released 2023-11-08 + +Code name: Refactoring of Extension + +## Summary + +This release moves common extension code to `extension-manager-interface` to simplify the extension. We added the following optional parameters to the extension, so you can also use them with Extension Manager: + +* `MAX_PARALLEL_UDFS`: Maximum number of UDFs that are executed in parallel +* `DEBUG_ADDRESS`: Network address and port to which to send debug output +* `LOG_LEVEL`: Log level for debug output + +## Refactoring + +* #137: Moved common extension code to `extension-manager-interface` + +## Dependency Updates + +### Virtual Schema for Document Data in Files on AWS S3 + +#### Compile Dependency Updates + +* Updated `software.amazon.awssdk:s3:2.21.6` to `2.21.16` + +#### Test Dependency Updates + +* Updated `com.amazonaws:aws-java-sdk-s3:1.12.572` to `1.12.582` +* Updated `com.exasol:extension-manager-integration-test-java:0.5.3` to `0.5.5` +* Updated `com.exasol:hamcrest-resultset-matcher:1.6.1` to `1.6.2` +* Updated `nl.jqno.equalsverifier:equalsverifier:3.15.2` to `3.15.3` +* Updated `org.junit.jupiter:junit-jupiter-engine:5.10.0` to `5.10.1` +* Updated `org.junit.jupiter:junit-jupiter-params:5.10.0` to `5.10.1` +* Updated `org.mockito:mockito-core:5.6.0` to `5.7.0` + +#### Plugin Dependency Updates + +* Updated `com.exasol:project-keeper-maven-plugin:2.9.14` to `2.9.15` +* Updated `org.apache.maven.plugins:maven-clean-plugin:3.3.1` to `3.3.2` + +### Extension + +#### Compile Dependency Updates + +* Updated `@exasol/extension-manager-interface:0.3.0` to `0.4.0` + +#### Development Dependency Updates + +* Updated `eslint:^8.46.0` to `^8.53.0` +* Updated `@typescript-eslint/parser:^6.3.0` to `^6.9.1` +* Updated `@types/jest:^29.5.3` to `^29.5.7` +* Updated `typescript:^5.1.6` to `^5.2.2` +* Updated `@typescript-eslint/eslint-plugin:^6.3.0` to `^6.9.1` +* Updated `jest:29.6.2` to `29.7.0` +* Updated `esbuild:^0.19.0` to `^0.19.5` diff --git a/doc/hands_on/hands_on.md b/doc/hands_on/hands_on.md index 7abbd525..370554e6 100644 --- a/doc/hands_on/hands_on.md +++ b/doc/hands_on/hands_on.md @@ -62,7 +62,7 @@ For the document Virtual Schemas, and by that also the S3 Virtual Schema, this i To install the Virtual Schema adapter, download its latest jar from the [releases](https://github.com/exasol/s3-document-files-virtual-schema/releases) and upload to BucketFS: ``` shell script -curl -I -X PUT -T document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar http://w:writepw@:2580/default/ +curl -I -X PUT -T document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar http://w:writepw@:2580/default/ ``` (If you have never used BucketFS, you can check out [its documentation](https://docs.exasol.com/database_concepts/bucketfs/bucketfs.htm)) @@ -75,7 +75,7 @@ CREATE SCHEMA ADAPTER; --/ CREATE OR REPLACE JAVA ADAPTER SCRIPT ADAPTER.S3_FILES_ADAPTER AS %scriptclass com.exasol.adapter.RequestDispatcher; - %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar; + %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar; / --/ @@ -85,7 +85,7 @@ CREATE OR REPLACE JAVA SET SCRIPT ADAPTER.IMPORT_FROM_S3_DOCUMENT_FILES( CONNECTION_NAME VARCHAR(500)) EMITS(...) AS %scriptclass com.exasol.adapter.document.UdfEntryPoint; - %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar; + %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar; / ``` diff --git a/doc/hands_on/hands_on_parquet.md b/doc/hands_on/hands_on_parquet.md index 4552e66a..abe22de4 100644 --- a/doc/hands_on/hands_on_parquet.md +++ b/doc/hands_on/hands_on_parquet.md @@ -47,7 +47,7 @@ For the document Virtual Schemas, and by that also the S3 Virtual Schema, this i To install the Virtual Schema adapter, download its latest jar from the [releases](https://github.com/exasol/s3-document-files-virtual-schema/releases) and upload to BucketFS: ``` shell script -curl -I -X PUT -T document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar http://w:writepw@:2580/default/ +curl -I -X PUT -T document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar http://w:writepw@:2580/default/ ``` (If you have never used BucketFS, you can check out [its documentation](https://docs.exasol.com/database_concepts/bucketfs/bucketfs.htm)) @@ -59,7 +59,7 @@ CREATE SCHEMA ADAPTER; CREATE OR REPLACE JAVA ADAPTER SCRIPT ADAPTER.S3_FILES_ADAPTER AS %scriptclass com.exasol.adapter.RequestDispatcher; - %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar; + %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar; / CREATE OR REPLACE JAVA SET SCRIPT ADAPTER.IMPORT_FROM_S3_DOCUMENT_FILES( @@ -68,7 +68,7 @@ CREATE OR REPLACE JAVA SET SCRIPT ADAPTER.IMPORT_FROM_S3_DOCUMENT_FILES( CONNECTION_NAME VARCHAR(500)) EMITS(...) AS %scriptclass com.exasol.adapter.document.UdfEntryPoint; - %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar; + %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar; / ``` diff --git a/doc/user_guide/user_guide.md b/doc/user_guide/user_guide.md index cae92261..d1617d85 100644 --- a/doc/user_guide/user_guide.md +++ b/doc/user_guide/user_guide.md @@ -17,7 +17,7 @@ Next create the Adapter Script: ```sql CREATE OR REPLACE JAVA ADAPTER SCRIPT ADAPTER.S3_FILES_ADAPTER AS %scriptclass com.exasol.adapter.RequestDispatcher; - %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar; + %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar; / ``` @@ -30,7 +30,7 @@ CREATE OR REPLACE JAVA SET SCRIPT ADAPTER.IMPORT_FROM_S3_DOCUMENT_FILES( CONNECTION_NAME VARCHAR(500)) EMITS(...) AS %scriptclass com.exasol.adapter.document.UdfEntryPoint; - %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar; + %jar /buckets/bfsdefault/default/document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar; / ``` @@ -77,7 +77,7 @@ In the definitions you have to define the `source` property. For S3, you define This Virtual Schema adapter automatically detects the type of the document file by the file extension. You can find a list of supported file types and their extensions in the [user guide of the common repository for all file Virtual Schemas](https://github.com/exasol/virtual-schema-common-document-files/blob/main/doc/user_guide/user_guide.md). -### Mapping multiple files +### Mapping Multiple Files For some file type (for example JSON) each source file contains only a single document. That means, that you have one file for each row in the mapped table. To define mappings for such types, you can use the GLOB syntax. That means, you can use `*` and `?` as wildcards, where `*` matches multiple characters and `?` a single one. @@ -126,7 +126,7 @@ In DbVisualizer use exactly this command: --/ CREATE OR REPLACE JAVA ADAPTER SCRIPT ADAPTER.S3_FILES_ADAPTER AS %scriptclass com.exasol.adapter.RequestDispatcher; - %jar /buckets/bfsdefault/default/vs/document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar; + %jar /buckets/bfsdefault/default/vs/document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar; / ``` diff --git a/extension/package-lock.json b/extension/package-lock.json index 34e7408d..e3e7cc91 100644 --- a/extension/package-lock.json +++ b/extension/package-lock.json @@ -9,18 +9,18 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@exasol/extension-manager-interface": "0.3.0" + "@exasol/extension-manager-interface": "0.4.0" }, "devDependencies": { - "@types/jest": "^29.5.3", - "@typescript-eslint/eslint-plugin": "^6.3.0", - "@typescript-eslint/parser": "^6.3.0", - "esbuild": "^0.19.0", - "eslint": "^8.46.0", - "jest": "29.6.2", + "@types/jest": "^29.5.7", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", + "esbuild": "^0.19.5", + "eslint": "^8.53.0", + "jest": "29.7.0", "ts-jest": "^29.1.1", "ts-node": "^10.9.1", - "typescript": "^5.1.6" + "typescript": "^5.2.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -46,47 +46,119 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -96,12 +168,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -112,12 +178,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -127,22 +193,19 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -155,68 +218,68 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { @@ -229,78 +292,78 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -379,9 +442,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -568,33 +631,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -612,13 +675,13 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -654,9 +717,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.0.tgz", - "integrity": "sha512-GAkjUyHgWTYuex3evPd5V7uV/XS4LMKr1PWHRPW1xNyy/Jx08x3uTrDFRefBYLKT/KpaWM8/YMQcwbp5a3yIDA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", "cpu": [ "arm" ], @@ -670,9 +733,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.0.tgz", - "integrity": "sha512-AzsozJnB+RNaDncBCs3Ys5g3kqhPFUueItfEaCpp89JH2naFNX2mYDIvUgPYMqqjm8hiFoo+jklb3QHZyR3ubw==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", "cpu": [ "arm64" ], @@ -686,9 +749,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.0.tgz", - "integrity": "sha512-SUG8/qiVhljBDpdkHQ9DvOWbp7hFFIP0OzxOTptbmVsgBgzY6JWowmMd6yJuOhapfxmj/DrvwKmjRLvVSIAKZg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", "cpu": [ "x64" ], @@ -702,9 +765,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.0.tgz", - "integrity": "sha512-HkxZ8k3Jvcw0FORPNTavA8BMgQjLOB6AajT+iXmil7BwY3gU1hWvJJAyWyEogCmA4LdbGvKF8vEykdmJ4xNJJQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", "cpu": [ "arm64" ], @@ -718,9 +781,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.0.tgz", - "integrity": "sha512-9IRWJjqpWFHM9a5Qs3r3bK834NCFuDY5ZaLrmTjqE+10B6w65UMQzeZjh794JcxpHolsAHqwsN/33crUXNCM2Q==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", "cpu": [ "x64" ], @@ -734,9 +797,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.0.tgz", - "integrity": "sha512-s7i2WcXcK0V1PJHVBe7NsGddsL62a9Vhpz2U7zapPrwKoFuxPP9jybwX8SXnropR/AOj3ppt2ern4ItblU6UQQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", "cpu": [ "arm64" ], @@ -750,9 +813,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.0.tgz", - "integrity": "sha512-NMdBSSdgwHCqCsucU5k1xflIIRU0qi1QZnM6+vdGy5fvxm1c8rKh50VzsWsIVTFUG3l91AtRxVwoz3Lcvy3I5w==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", "cpu": [ "x64" ], @@ -766,9 +829,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.0.tgz", - "integrity": "sha512-2F1+lH7ZBcCcgxiSs8EXQV0PPJJdTNiNcXxDb61vzxTRJJkXX1I/ye9mAhfHyScXzHaEibEXg1Jq9SW586zz7w==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", "cpu": [ "arm" ], @@ -782,9 +845,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.0.tgz", - "integrity": "sha512-I4zvE2srSZxRPapFnNqj+NL3sDJ1wkvEZqt903OZUlBBgigrQMvzUowvP/TTTu2OGYe1oweg5MFilfyrElIFag==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", "cpu": [ "arm64" ], @@ -798,9 +861,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.0.tgz", - "integrity": "sha512-dz2Q7+P92r1Evc8kEN+cQnB3qqPjmCrOZ+EdBTn8lEc1yN8WDgaDORQQiX+mxaijbH8npXBT9GxUqE52Gt6Y+g==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", "cpu": [ "ia32" ], @@ -814,9 +877,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.0.tgz", - "integrity": "sha512-IcVJovJVflih4oFahhUw+N7YgNbuMSVFNr38awb0LNzfaiIfdqIh518nOfYaNQU3aVfiJnOIRVJDSAP4k35WxA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", "cpu": [ "loong64" ], @@ -830,9 +893,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.0.tgz", - "integrity": "sha512-bZGRAGySMquWsKw0gIdsClwfvgbsSq/7oq5KVu1H1r9Il+WzOcfkV1hguntIuBjRVL8agI95i4AukjdAV2YpUw==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", "cpu": [ "mips64el" ], @@ -846,9 +909,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.0.tgz", - "integrity": "sha512-3LC6H5/gCDorxoRBUdpLV/m7UthYSdar0XcCu+ypycQxMS08MabZ06y1D1yZlDzL/BvOYliRNRWVG/YJJvQdbg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", "cpu": [ "ppc64" ], @@ -862,9 +925,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.0.tgz", - "integrity": "sha512-jfvdKjWk+Cp2sgLtEEdSHXO7qckrw2B2eFBaoRdmfhThqZs29GMMg7q/LsQpybA7BxCLLEs4di5ucsWzZC5XPA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", "cpu": [ "riscv64" ], @@ -878,9 +941,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.0.tgz", - "integrity": "sha512-ofcucfNLkoXmcnJaw9ugdEOf40AWKGt09WBFCkpor+vFJVvmk/8OPjl/qRtks2Z7BuZbG3ztJuK1zS9z5Cgx9A==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", "cpu": [ "s390x" ], @@ -894,9 +957,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.0.tgz", - "integrity": "sha512-Fpf7zNDBti3xrQKQKLdXT0hTyOxgFdRJIMtNy8x1az9ATR9/GJ1brYbB/GLWoXhKiHsoWs+2DLkFVNNMTCLEwA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", "cpu": [ "x64" ], @@ -910,9 +973,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.0.tgz", - "integrity": "sha512-AMQAp/5oENgDOvVhvOlbhVe1pWii7oFAMRHlmTjSEMcpjTpIHtFXhv9uAFgUERHm3eYtNvS9Vf+gT55cwuI6Aw==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", "cpu": [ "x64" ], @@ -926,9 +989,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.0.tgz", - "integrity": "sha512-fDztEve1QUs3h/Dw2AUmBlWGkNQbhDoD05ppm5jKvzQv+HVuV13so7m5RYeiSMIC2XQy7PAjZh+afkxAnCRZxA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", "cpu": [ "x64" ], @@ -942,9 +1005,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.0.tgz", - "integrity": "sha512-bKZzJ2/rvUjDzA5Ddyva2tMk89WzNJEibZEaq+wY6SiqPlwgFbqyQLimouxLHiHh1itb5P3SNCIF1bc2bw5H9w==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", "cpu": [ "x64" ], @@ -958,9 +1021,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.0.tgz", - "integrity": "sha512-NQJ+4jmnA79saI+sE+QzcEls19uZkoEmdxo7r//PDOjIpX8pmoWtTnWg6XcbnO7o4fieyAwb5U2LvgWynF4diA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", "cpu": [ "arm64" ], @@ -974,9 +1037,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.0.tgz", - "integrity": "sha512-uyxiZAnsfu9diHm9/rIH2soecF/HWLXYUhJKW4q1+/LLmNQ+55lRjvSUDhUmsgJtSUscRJB/3S4RNiTb9o9mCg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", "cpu": [ "ia32" ], @@ -990,9 +1053,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.0.tgz", - "integrity": "sha512-jl+NXUjK2StMgqnZnqgNjZuerFG8zQqWXMBZdMMv4W/aO1ZKQaYWZBxTrtWKphkCBVEMh0wMVfGgOd2BjOZqUQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", "cpu": [ "x64" ], @@ -1021,18 +1084,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1053,26 +1116,26 @@ } }, "node_modules/@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@exasol/extension-manager-interface": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@exasol/extension-manager-interface/-/extension-manager-interface-0.3.0.tgz", - "integrity": "sha512-RQ88IEy2Twm0WHofO74/LQkfP0n5vHxKeMGzBieCiuVxCl3hRNfpWgfy/dpMKdf57QJHxeokYjfIcANMiNjABA==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@exasol/extension-manager-interface/-/extension-manager-interface-0.4.0.tgz", + "integrity": "sha512-EFldVsmR93PurlWFT3zVFrkBw1c+ahnhrL4jaek1XTi+zWdLHsY0ffjkqWrwWBnQvAuH/POU3KwM7/Yf/NurGA==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -1094,9 +1157,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -1208,16 +1271,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", - "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1225,37 +1288,37 @@ } }, "node_modules/@jest/core": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", - "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", - "@jest/reporters": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-resolve-dependencies": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "jest-watcher": "^29.6.2", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1272,88 +1335,88 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", - "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.2" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.2", - "jest-snapshot": "^29.6.2" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", - "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", - "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", - "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/types": "^29.6.1", - "jest-mock": "^29.6.2" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", - "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", @@ -1362,13 +1425,13 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1387,9 +1450,9 @@ } }, "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -1399,9 +1462,9 @@ } }, "node_modules/@jest/source-map": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", - "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", @@ -1413,13 +1476,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", - "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1428,14 +1491,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", - "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.2", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1443,22 +1506,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", - "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1469,12 +1532,12 @@ } }, "node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1500,9 +1563,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1524,21 +1587,15 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1617,15 +1674,15 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "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 }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -1636,18 +1693,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -1655,51 +1712,51 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", + "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", + "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "29.5.3", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", - "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1707,60 +1764,62 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "version": "17.0.29", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", + "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", + "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.3.0.tgz", - "integrity": "sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", + "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/type-utils": "6.3.0", - "@typescript-eslint/utils": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/type-utils": "6.9.1", + "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", - "natural-compare-lite": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -1782,15 +1841,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", - "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", + "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4" }, "engines": { @@ -1810,13 +1869,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", - "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", + "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0" + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1827,13 +1886,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.3.0.tgz", - "integrity": "sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", + "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/utils": "6.3.0", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/utils": "6.9.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1854,9 +1913,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", - "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", + "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1867,13 +1926,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", - "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", + "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1894,17 +1953,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", - "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", + "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", "semver": "^7.5.4" }, "engines": { @@ -1919,12 +1978,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", - "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", + "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/types": "6.9.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1935,10 +1994,16 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1957,9 +2022,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -2067,15 +2132,15 @@ } }, "node_modules/babel-jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", - "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.2", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -2103,10 +2168,35 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -2142,12 +2232,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -2186,9 +2276,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -2198,13 +2288,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2259,9 +2353,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001478", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz", - "integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==", + "version": "1.0.30001559", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", + "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", "dev": true, "funding": [ { @@ -2304,9 +2398,9 @@ } }, "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -2384,6 +2478,27 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -2469,9 +2584,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2502,9 +2617,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.363", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.363.tgz", - "integrity": "sha512-ReX5qgmSU7ybhzMuMdlJAdYnRhT90UB3k9M05O5nF5WH3wR5wgdJjXw0uDeFyKNhmglmQiOxkAbzrP0hMKM59g==", + "version": "1.4.575", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.575.tgz", + "integrity": "sha512-kY2BGyvgAHiX899oF6xLXSIf99bAvvdPhDoJwG77nxCSyWYuRH6e9a9a3gpXBvCs6lj4dQZJkfnW2hdKWHEISg==", "dev": true }, "node_modules/emittery": { @@ -2535,9 +2650,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.0.tgz", - "integrity": "sha512-i7i8TP4vuG55bKeLyqqk5sTPu1ZjPH3wkcLvAj/0X/222iWFo3AJUYRKjbOoY6BWFMH3teizxHEdV9Su5ESl0w==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", "dev": true, "hasInstallScript": true, "bin": { @@ -2547,28 +2662,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.0", - "@esbuild/android-arm64": "0.19.0", - "@esbuild/android-x64": "0.19.0", - "@esbuild/darwin-arm64": "0.19.0", - "@esbuild/darwin-x64": "0.19.0", - "@esbuild/freebsd-arm64": "0.19.0", - "@esbuild/freebsd-x64": "0.19.0", - "@esbuild/linux-arm": "0.19.0", - "@esbuild/linux-arm64": "0.19.0", - "@esbuild/linux-ia32": "0.19.0", - "@esbuild/linux-loong64": "0.19.0", - "@esbuild/linux-mips64el": "0.19.0", - "@esbuild/linux-ppc64": "0.19.0", - "@esbuild/linux-riscv64": "0.19.0", - "@esbuild/linux-s390x": "0.19.0", - "@esbuild/linux-x64": "0.19.0", - "@esbuild/netbsd-x64": "0.19.0", - "@esbuild/openbsd-x64": "0.19.0", - "@esbuild/sunos-x64": "0.19.0", - "@esbuild/win32-arm64": "0.19.0", - "@esbuild/win32-ia32": "0.19.0", - "@esbuild/win32-x64": "0.19.0" + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" } }, "node_modules/escalade": { @@ -2593,18 +2708,19 @@ } }, "node_modules/eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2612,7 +2728,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -2663,9 +2779,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2779,17 +2895,16 @@ } }, "node_modules/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.2", - "@types/node": "*", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2900,22 +3015,23 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/fs.realpath": { @@ -2925,9 +3041,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -2939,10 +3055,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -3016,9 +3135,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3062,18 +3181,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3083,6 +3190,18 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -3174,12 +3293,12 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3270,28 +3389,19 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/istanbul-lib-report": { @@ -3336,15 +3446,15 @@ } }, "node_modules/jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", - "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.2" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -3362,12 +3472,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -3375,28 +3486,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", - "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.2", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -3406,22 +3517,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", - "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -3440,31 +3550,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", - "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.2", - "@jest/types": "^29.6.1", - "babel-jest": "^29.6.2", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.2", - "jest-environment-node": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3485,24 +3595,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", - "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -3512,62 +3622,62 @@ } }, "node_modules/jest-each": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", - "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.6.2", - "pretty-format": "^29.6.2" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", - "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", - "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3579,46 +3689,46 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", - "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", - "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", - "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3627,14 +3737,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", - "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.2" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3658,26 +3768,26 @@ } }, "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", - "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3687,43 +3797,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", - "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.6.2" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", - "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", - "@jest/environment": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-leak-detector": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-resolve": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-util": "^29.6.2", - "jest-watcher": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3732,31 +3842,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", - "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/globals": "^29.6.2", - "@jest/source-map": "^29.6.0", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3765,9 +3875,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", - "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -3775,20 +3885,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.2", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -3796,12 +3906,12 @@ } }, "node_modules/jest-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", - "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -3813,17 +3923,17 @@ } }, "node_modules/jest-validate": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", - "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.2" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3842,18 +3952,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", - "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.2", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -3861,13 +3971,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", - "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.2", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -3920,6 +4030,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3950,6 +4066,15 @@ "node": ">=6" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -4114,12 +4239,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4127,9 +4246,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-path": { @@ -4324,9 +4443,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" @@ -4406,12 +4525,12 @@ } }, "node_modules/pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -4445,18 +4564,18 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "dev": true, "funding": [ { @@ -4505,9 +4624,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -4870,9 +4989,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, "engines": { "node": ">=16.13.0" @@ -5001,9 +5120,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5013,10 +5132,16 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -5026,6 +5151,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -5033,7 +5162,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -5055,25 +5184,19 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", diff --git a/extension/package.json b/extension/package.json index 4b3b2484..d698be69 100644 --- a/extension/package.json +++ b/extension/package.json @@ -14,17 +14,17 @@ "test-watch": "jest --watch" }, "dependencies": { - "@exasol/extension-manager-interface": "0.3.0" + "@exasol/extension-manager-interface": "0.4.0" }, "devDependencies": { - "@types/jest": "^29.5.3", - "@typescript-eslint/eslint-plugin": "^6.3.0", - "@typescript-eslint/parser": "^6.3.0", - "esbuild": "^0.19.0", - "eslint": "^8.46.0", - "jest": "29.6.2", + "@types/jest": "^29.5.7", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", + "esbuild": "^0.19.5", + "eslint": "^8.53.0", + "jest": "29.7.0", "ts-jest": "^29.1.1", "ts-node": "^10.9.1", - "typescript": "^5.1.6" + "typescript": "^5.2.2" } -} \ No newline at end of file +} diff --git a/extension/src/adapterScript.test.ts b/extension/src/adapterScript.test.ts deleted file mode 100644 index 49ff0ec6..00000000 --- a/extension/src/adapterScript.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { AdapterScript } from './adapterScript'; -import { script } from './test-utils'; - - -describe("AdapterScript", () => { - describe("properties", () => { - it("name", () => { - expect(new AdapterScript(script({ name: "script" })).name).toBe("script") - }) - it("schema", () => { - expect(new AdapterScript(script({ schema: "schema" })).schema).toBe("schema") - }) - it("text", () => { - expect(new AdapterScript(script({ text: "text" })).text).toBe("text") - }) - it("qualifiedName", () => { - expect(new AdapterScript(script({ schema: "schema", name: "name" })).qualifiedName).toBe("schema.name") - }) - }) - describe("methods", () => { - describe("getVersion()", () => { - const tests: { name: string; scriptText: string, expected: string | undefined }[] = [ - { name: "found", scriptText: "CREATE ... %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text", expected: "1.2.3" }, - { name: "found with LF", scriptText: "CREATE ...\n %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text", expected: "1.2.3" }, - { name: "found with LFCR", scriptText: "CREATE ...\n\r %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text", expected: "1.2.3" }, - { name: "with CRLF", scriptText: "CREATE ...\r\n %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text", expected: "1.2.3" }, - { name: "not found in root dir", scriptText: "CREATE ... %jar /document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text", expected: undefined }, - { name: "not found invalid %jar", scriptText: "CREATE ... %invalid /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text", expected: undefined }, - { name: "not found missing %jar", scriptText: "CREATE ... /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text", expected: undefined }, - { name: "not found missing trailing semicolon", scriptText: "CREATE ...\r\n %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar", expected: undefined }, - { name: "not found invalid vs-common-document-files version", scriptText: "CREATE ... %jar /path/to/document-files-virtual-schema-dist-a.b.c-s3-1.2.3.jar;", expected: undefined }, - { name: "not found invalid version", scriptText: "CREATE ... %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-a.b.c.jar;", expected: undefined }, - { name: "not found invalid filename", scriptText: "CREATE ... %jar /path/to/invalid-file-name-dist-0.0.0-s3-1.2.3.jar;", expected: undefined }, - ] - tests.forEach(test => it(test.name, () => { - expect(new AdapterScript(script({ text: test.scriptText })).getVersion()).toBe(test.expected) - })) - }) - describe("isValidAdapterScript()", () => { - const tests: { name: string; type: string | undefined, expected: boolean }[] = [ - { name: "missing type", type: undefined, expected: false }, - { name: "unknown type", type: "unknown", expected: false }, - { name: "wrong case", type: "adapter", expected: false }, - { name: "correct type", type: "ADAPTER", expected: true }, - ] - tests.forEach(test => it(test.name, () => { - expect(new AdapterScript(script({ type: test.type })).isValidAdapterScript()).toBe(test.expected) - })) - }) - describe("isValidImportScript()", () => { - const tests: { name: string; type: string | undefined, inputType: string | undefined, resultType: string | undefined, expected: boolean }[] = [ - { name: "correct type", type: "UDF", inputType: "SET", resultType: "EMITS", expected: true }, - { name: "wrong result type", type: "UDF", inputType: "SET", resultType: "wrong", expected: false }, - { name: "missing result type", type: "UDF", inputType: "SET", resultType: undefined, expected: false }, - { name: "wrong input type", type: "UDF", inputType: "wrong", resultType: "EMITS", expected: false }, - { name: "missing input type", type: "UDF", inputType: undefined, resultType: "EMITS", expected: false }, - { name: "wrong type", type: "wrong", inputType: "SET", resultType: "EMITS", expected: false }, - { name: "missing type", type: undefined, inputType: "SET", resultType: "EMITS", expected: false }, - ] - tests.forEach(test => it(test.name, () => { - expect(new AdapterScript(script({ type: test.type, inputType: test.inputType, resultType: test.resultType })).isValidImportScript()).toBe(test.expected) - })) - }) - }) -}) \ No newline at end of file diff --git a/extension/src/adapterScript.ts b/extension/src/adapterScript.ts deleted file mode 100644 index 67aa6397..00000000 --- a/extension/src/adapterScript.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { ExaScriptsRow } from "@exasol/extension-manager-interface"; - -export class AdapterScript { - #script: ExaScriptsRow - constructor(script: ExaScriptsRow) { - this.#script = script - } - isValidAdapterScript() { - return isValidAdapterScript(this.#script) - } - isValidImportScript() { - return isValidImportScript(this.#script) - } - getVersion() { - return extractVersion(this.#script.text) - } - get name() { - return this.#script.name - } - get qualifiedName() { - return `${this.#script.schema}.${this.#script.name}` - } - get schema() { - return this.#script.schema - } - get text() { - return this.#script.text - } -} - - -const adapterScriptFileNamePattern = /.*%jar\s+[\w-/]+\/([^/]+.jar)\s*;.*/ -const jarNameVersionPattern = /document-files-virtual-schema-dist-[\d.]+-s3-(\d+\.\d+\.\d+).jar/ - -function extractVersion(adapterScriptText: string): string | undefined { - const jarNameMatch = adapterScriptFileNamePattern.exec(adapterScriptText) - if (!jarNameMatch) { - console.warn(`WARN: Could not find jar filename in adapter script "${adapterScriptText}"`) - return undefined - } - const jarFileName = jarNameMatch[1]; - const versionMatch = jarNameVersionPattern.exec(jarFileName) - if (!versionMatch) { - console.warn(`WARN: Could not find version in jar file name "${jarFileName}"`) - return undefined - } - return versionMatch[1] -} - -function isValidAdapterScript(script: ExaScriptsRow): script is ExaScriptsRow { - if (script.type !== "ADAPTER") { - console.warn(`Invalid type for adapter script: ${script.type}`) - return false; - } - return true; -} - -function isValidImportScript(script: ExaScriptsRow): script is ExaScriptsRow { - if (script.type !== "UDF") { - console.log(`Invalid type for importer script: ${script.type}`) - return false; - } - if (script.inputType !== "SET") { - console.log(`Invalid input type for importer script: ${script.inputType ? script.inputType : ''}`) - return false; - } - if (script.resultType !== "EMITS") { - console.log(`Invalid result type for importer script: ${script.resultType ? script.resultType : ''}`) - return false; - } - return true; -} diff --git a/extension/src/addInstance.ts b/extension/src/addInstance.ts deleted file mode 100644 index cb470468..00000000 --- a/extension/src/addInstance.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Context, Instance, ParameterValues } from "@exasol/extension-manager-interface"; -import { Parameter } from "@exasol/extension-manager-interface/dist/parameters"; -import { ADAPTER_SCRIPT_NAME, EXTENSION_NAME, ExtensionInfo, convertSchemaNameToInstanceId, getConnectionName } from "./common"; -import { ScopedParameter, getAllParameterDefinitions } from "./parameterDefinitions"; - - -export function addInstance(context: Context, extensionInfo: ExtensionInfo, versionToInstall: string, paramValues: ParameterValues): Instance { - if (extensionInfo.version !== versionToInstall) { - throw new Error(`Version '${versionToInstall}' not supported, can only use ${extensionInfo.version}.`) - } - - const allParams = getAllParameterDefinitions(); - const virtualSchemaName = getParameterValue(paramValues, allParams.virtualSchemaName); - const mapping = getParameterValue(paramValues, allParams.mapping); - const connectionName = getConnectionName(virtualSchemaName); - context.sqlClient.execute(createConnectionStatement(connectionName, paramValues)); - context.sqlClient.execute(createVirtualSchemaStatement(virtualSchemaName, context.extensionSchemaName, connectionName, mapping)); - - const comment = `Created by Extension Manager for ${EXTENSION_NAME} ${escapeSingleQuotes(virtualSchemaName)}`; - context.sqlClient.execute(`COMMENT ON CONNECTION "${connectionName}" IS '${comment}'`); - context.sqlClient.execute(`COMMENT ON SCHEMA "${virtualSchemaName}" IS '${comment}'`); - return { id: convertSchemaNameToInstanceId(virtualSchemaName), name: virtualSchemaName } -} - -function getParameterValue(paramValues: ParameterValues, definition: Parameter): string { - for (const value of paramValues.values) { - if (value.name === definition.id) { - return value.value - } - } - throw new Error(`Missing parameter "${definition.id}"`) -} - -function createConnectionStatement(connectionName: string, paramValues: ParameterValues): string { - let jsonArgs = JSON.stringify(convertConnectionParameters(paramValues)) - jsonArgs = escapeSingleQuotes(jsonArgs) - return `CREATE OR REPLACE CONNECTION "${connectionName}" TO '' USER '' IDENTIFIED BY '${jsonArgs}'`; -} - -function createVirtualSchemaStatement(name: string, adapterSchema: string, connectionName: string, mapping: string): string { - const escapedMapping = escapeSingleQuotes(mapping) - const escapedConnectionName = escapeSingleQuotes(connectionName) - return `CREATE VIRTUAL SCHEMA "${name}" USING "${adapterSchema}"."${ADAPTER_SCRIPT_NAME}" WITH CONNECTION_NAME = '${escapedConnectionName}' MAPPING = '${escapedMapping}';` -} - -function escapeSingleQuotes(value: string): string { - return value.replace(/'/g, "''") -} - -function findParam(id: string): ScopedParameter | undefined { - return getAllParameterDefinitions()[id] -} - -function convertConnectionParameters(paramValues: ParameterValues) { - const result: { [key: string]: string | boolean } = {} - for (const paramValue of paramValues.values) { - const param = findParam(paramValue.name); - if (param && param.scope == "connection") { - result[param.id] = convertParamValue(paramValue.value, param) - } - } - return result -} - -function convertParamValue(value: string, definition: Parameter): string | boolean { - switch (definition.type) { - case "string": - case "select": - return value; - case "boolean": - return value === 'true'; - default: - throw Error("Unsupported parameter type"); - } -} diff --git a/extension/src/common.ts b/extension/src/common.ts index ebfe5ccd..ceb074a7 100644 --- a/extension/src/common.ts +++ b/extension/src/common.ts @@ -2,19 +2,3 @@ export const ADAPTER_SCRIPT_NAME = "S3_FILES_ADAPTER"; export const IMPORT_SCRIPT_NAME = "IMPORT_FROM_S3_DOCUMENT_FILES"; export const EXTENSION_NAME = "S3 Virtual Schema"; - -export interface ExtensionInfo { - version: string; - fileName: string; -} - -export function getConnectionName(virtualSchemaName: string): string { - return `${virtualSchemaName}_CONNECTION`; -} - -function identity(arg: string): string { - return arg; -} - -export const convertInstanceIdToSchemaName = identity -export const convertSchemaNameToInstanceId = identity diff --git a/extension/src/deleteInstance.ts b/extension/src/deleteInstance.ts deleted file mode 100644 index bf9fbadc..00000000 --- a/extension/src/deleteInstance.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Context, NotFoundError } from "@exasol/extension-manager-interface"; -import { convertInstanceIdToSchemaName, ExtensionInfo, getConnectionName } from "./common"; - -export function deleteInstance(context: Context, extension: ExtensionInfo, version: string, instanceId: string): void { - if (extension.version !== version) { - throw new NotFoundError(`Version '${version}' not supported, can only use '${extension.version}'.`) - } - const schemaName = convertInstanceIdToSchemaName(instanceId); - context.sqlClient.execute(dropVirtualSchemaStatement(schemaName)); - context.sqlClient.execute(dropConnectionStatement(getConnectionName(schemaName))); -} - -function dropVirtualSchemaStatement(schemaName: string): string { - return `DROP VIRTUAL SCHEMA IF EXISTS "${schemaName}" CASCADE`; -} - -function dropConnectionStatement(connectionName: string): string { - return `DROP CONNECTION IF EXISTS "${connectionName}"`; -} \ No newline at end of file diff --git a/extension/src/extension.test.ts b/extension/src/extension.test.ts index 99c542bf..4ec6f6f5 100644 --- a/extension/src/extension.test.ts +++ b/extension/src/extension.test.ts @@ -4,7 +4,7 @@ import { describe, expect, it } from '@jest/globals'; import { EXTENSION_NAME } from './common'; import { createExtension } from "./extension"; import { CONFIG } from './extension-config'; -import { adapterScript, createMockContext, getInstalledExtension, importScript } from './test-utils'; +import { adapterScript, createMockContext, getInstalledExtension, importScript, script } from './test-utils'; describe("S3 VS Extension", () => { @@ -54,26 +54,20 @@ describe("S3 VS Extension", () => { }) describe("returns expected installations", () => { - function installation({ name = "schema.S3_FILES_ADAPTER", version = "(unknown)" }: Partial): Installation { + function installation({ name = "S3 Virtual Schema", version = "(unknown)" }: Partial): Installation { return { name, version } } const tests: { name: string; scripts: ExaScriptsRow[], expected?: Installation }[] = [ - { name: "all values match", scripts: [adapterScript({}), importScript({})], expected: installation({}) }, - { name: "adapter has wrong type", scripts: [adapterScript({ type: "wrong" }), importScript({})], expected: undefined }, + { name: "all values match", scripts: [adapterScript({}), importScript({})], expected: installation({ version: "1.2.3" }) }, { name: "adapter has wrong name", scripts: [adapterScript({ name: "wrong" }), importScript({})], expected: undefined }, { name: "adapter missing", scripts: [importScript({})], expected: undefined }, - { name: "importer has wrong type", scripts: [adapterScript({}), importScript({ type: "wrong" })], expected: undefined }, - { name: "importer has wrong input type", scripts: [adapterScript({}), importScript({ inputType: "wrong" })], expected: undefined }, - { name: "importer has wrong result type", scripts: [adapterScript({}), importScript({ resultType: "wrong" })], expected: undefined }, { name: "importer has wrong name", scripts: [adapterScript({}), importScript({ name: "wrong" })], expected: undefined }, { name: "importer missing", scripts: [adapterScript({})], expected: undefined }, { name: "adapter and importer missing", scripts: [], expected: undefined }, { name: "version found in filename", scripts: [adapterScript({ text: "CREATE ... %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text" }), importScript({})], expected: installation({ version: "1.2.3" }) }, { name: "script contains LF", scripts: [adapterScript({ text: "CREATE ...\n %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text" }), importScript({})], expected: installation({ version: "1.2.3" }) }, { name: "script contains CRLF", scripts: [adapterScript({ text: "CREATE ...\r\n %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar; more text" }), importScript({})], expected: installation({ version: "1.2.3" }) }, - { name: "version not found in filename", scripts: [adapterScript({ text: "CREATE ... %jar /path/to/invalid-file-name-dist-0.0.0-s3-1.2.3.jar;" }), importScript({})], expected: installation({ version: "(unknown)" }) }, - { name: "filename not found in script", scripts: [adapterScript({ text: "CREATE ... %wrong /path/to/document-files-virtual-schema-dist-0.0.0-s3-1.2.3.jar;" }), importScript({})], expected: installation({ version: "(unknown)" }) }, ] tests.forEach(test => { it(test.name, () => { @@ -97,12 +91,11 @@ describe("S3 VS Extension", () => { }) it("returns expected parameters", () => { const actual = createExtension().getInstanceParameters(createMockContext(), CONFIG.version) - expect(actual).toHaveLength(10) + expect(actual).toHaveLength(13) expect(actual[0]).toStrictEqual({ - id: "virtualSchemaName", name: "Name of the new virtual schema", required: true, type: "string", scope: "general", - }) - expect(actual[1]).toStrictEqual({ - id: "awsAccessKeyId", name: "AWS Access Key Id", required: true, type: "string", scope: "connection", + id: "base-vs.virtual-schema-name", name: "Virtual Schema name", required: true, type: "string", + description: "Name for the new virtual schema", + placeholder: "MY_VIRTUAL_SCHEMA", regex: "[a-zA-Z_]+" }) }) }) @@ -119,13 +112,13 @@ describe("S3 VS Extension", () => { expect(adapterScript).toContain(`%jar /bucketfs/${CONFIG.fileName};`) expect(setScript).toContain(`CREATE OR REPLACE JAVA SET SCRIPT "ext-schema"."IMPORT_FROM_S3_DOCUMENT_FILES"`) expect(setScript).toContain(`%jar /bucketfs/${CONFIG.fileName};`) - const expectedComment = `Created by Extension Manager for ${EXTENSION_NAME} extension ${CONFIG.version}` - expect(executeCalls[2]).toEqual([`COMMENT ON SCRIPT "ext-schema"."IMPORT_FROM_S3_DOCUMENT_FILES" IS '${expectedComment}'`]) - expect(executeCalls[3]).toEqual([`COMMENT ON SCRIPT "ext-schema"."S3_FILES_ADAPTER" IS '${expectedComment}'`]) + const expectedComment = `Created by Extension Manager for ${EXTENSION_NAME} ${CONFIG.version}` + expect(executeCalls[2]).toEqual([`COMMENT ON SCRIPT "ext-schema"."S3_FILES_ADAPTER" IS '${expectedComment}'`]) + expect(executeCalls[3]).toEqual([`COMMENT ON SCRIPT "ext-schema"."IMPORT_FROM_S3_DOCUMENT_FILES" IS '${expectedComment}'`]) }) it("fails for wrong version", () => { expect(() => { createExtension().install(createMockContext(), "wrongVersion") }) - .toThrow(`Installing version 'wrongVersion' not supported, try '${CONFIG.version}'.`) + .toThrow(`Version 'wrongVersion' not supported, can only use '${CONFIG.version}'.`) }) }) @@ -155,16 +148,13 @@ describe("S3 VS Extension", () => { }) it("fails for wrong version", () => { expect(() => { createExtension().uninstall(createMockContext(), "wrongVersion") }) - .toThrow(`Uninstalling version 'wrongVersion' not supported, try '${CONFIG.version}'.`) + .toThrow(`Version 'wrongVersion' not supported, can only use '${CONFIG.version}'.`) }) }) describe("addInstance()", () => { describe("connection parameters converted", () => { type TestCase = { name: string, paramValues: ParameterValue[], expected: string } - function booleanMapped(value: string, expected: string): TestCase { - return { name: `boolean parameter '${value}' mapped to ${expected}`, paramValues: [{ name: "useSsl", value: value }], expected: `{"useSsl":${expected}}` }; - } const tests: TestCase[] = [ { name: "no parameters", paramValues: [], expected: '{}' }, { name: "unknown parameter", paramValues: [{ name: "unknown", value: "ignore" }], expected: '{}' }, @@ -172,58 +162,52 @@ describe("S3 VS Extension", () => { { name: "parameter with double quote", paramValues: [{ name: "awsAccessKeyId", value: 'abc"123""xyz' }], expected: `{"awsAccessKeyId":"abc\\"123\\"\\"xyz"}` }, { name: "multiple parameters", paramValues: [{ name: "awsAccessKeyId", value: 'id' }, { name: "awsSecretAccessKey", value: "key" }], expected: `{"awsAccessKeyId":"id","awsSecretAccessKey":"key"}` }, { name: "mixed parameters", paramValues: [{ name: "awsAccessKeyId", value: 'id' }, { name: "unknown", value: "ignored" }], expected: `{"awsAccessKeyId":"id"}` }, - booleanMapped("true", "true"), - booleanMapped("TRUE", "false"), - booleanMapped("false", "false"), - booleanMapped("FALSE", "false"), - booleanMapped("invalid", "false"), + { name: "boolean", paramValues: [{ name: "useSsl", value: "true" }], expected: `{"useSsl":"true"}` }, + { name: "ignores invalid boolean", paramValues: [{ name: "useSsl", value: "invalid" }], expected: `{"useSsl":"invalid"}` }, ]; for (const test of tests) { it(test.name, () => { const context = createMockContext(); - const parameters = test.paramValues.concat([{ name: "virtualSchemaName", value: "NEW_S3_VS" }, { name: "mapping", value: "my mapping" }]) + const parameters = test.paramValues.concat([{ name: "base-vs.virtual-schema-name", value: "NEW_S3_VS" }, { name: "MAPPING", value: "my mapping" }]) const instance = createExtension().addInstance(context, CONFIG.version, { values: parameters }); expect(instance.name).toEqual("NEW_S3_VS") - expect(context.mocks.sqlExecute.mock.calls[0]).toEqual([`CREATE OR REPLACE CONNECTION "NEW_S3_VS_CONNECTION" TO '' USER '' IDENTIFIED BY '${test.expected}'`]) + expect(context.mocks.sqlExecute.mock.calls[0]).toEqual([`CREATE OR REPLACE CONNECTION "NEW_S3_VS_CONNECTION" TO '' IDENTIFIED BY '${test.expected}'`]) }) } }) it("executes expected statements", () => { const context = createMockContext(); - const parameters = [{ name: "virtualSchemaName", value: "NEW_S3_VS" }, { name: "mapping", value: "my mapping" }, { name: "awsAccessKeyId", value: "id" }] + const parameters = [{ name: "base-vs.virtual-schema-name", value: "NEW_S3_VS" }, { name: "MAPPING", value: "my mapping" }, { name: "awsAccessKeyId", value: "id" }] const instance = createExtension().addInstance(context, CONFIG.version, { values: parameters }); expect(instance.name).toBe("NEW_S3_VS") const calls = context.mocks.sqlExecute.mock.calls expect(calls.length).toBe(4) - expect(calls[0]).toEqual([`CREATE OR REPLACE CONNECTION "NEW_S3_VS_CONNECTION" TO '' USER '' IDENTIFIED BY '{"awsAccessKeyId":"id"}'`]) - expect(calls[1]).toEqual([`CREATE VIRTUAL SCHEMA "NEW_S3_VS" USING "ext-schema"."S3_FILES_ADAPTER" WITH CONNECTION_NAME = 'NEW_S3_VS_CONNECTION' MAPPING = 'my mapping';`]) - const comment = `Created by Extension Manager for S3 Virtual Schema NEW_S3_VS` + expect(calls[0]).toEqual([`CREATE OR REPLACE CONNECTION "NEW_S3_VS_CONNECTION" TO '' IDENTIFIED BY '{"awsAccessKeyId":"id"}'`]) + expect(calls[1]).toEqual([`CREATE VIRTUAL SCHEMA "NEW_S3_VS" USING "ext-schema"."S3_FILES_ADAPTER" WITH CONNECTION_NAME = 'NEW_S3_VS_CONNECTION' MAPPING = 'my mapping'`]) + const comment = `Created by Extension Manager for S3 Virtual Schema v${CONFIG.version} NEW_S3_VS` expect(calls[2]).toEqual([`COMMENT ON CONNECTION "NEW_S3_VS_CONNECTION" IS '${comment}'`]) expect(calls[3]).toEqual([`COMMENT ON SCHEMA "NEW_S3_VS" IS '${comment}'`]) }) + it("returns id and name", () => { const context = createMockContext(); - const parameters = [{ name: "virtualSchemaName", value: "NEW_S3_VS" }, { name: "mapping", value: "my mapping" }, { name: "awsAccessKeyId", value: "id" }] + const parameters = [{ name: "base-vs.virtual-schema-name", value: "NEW_S3_VS" }, { name: "MAPPING", value: "my mapping" }, { name: "awsAccessKeyId", value: "id" }] const instance = createExtension().addInstance(context, CONFIG.version, { values: parameters }); expect(instance).toStrictEqual({ id: "NEW_S3_VS", name: "NEW_S3_VS" }) }) it("escapes single quotes", () => { const context = createMockContext(); - const parameters = [{ name: "virtualSchemaName", value: "vs'name" }, { name: "mapping", value: "mapping'with''quotes" }, { name: "awsAccessKeyId", value: "access'key" }] + const parameters = [{ name: "base-vs.virtual-schema-name", value: "vs'name" }, { name: "MAPPING", value: "mapping'with''quotes" }, { name: "awsAccessKeyId", value: "access'key" }] const instance = createExtension().addInstance(context, CONFIG.version, { values: parameters }); expect(instance).toStrictEqual({ id: "vs'name", name: "vs'name", }) const calls = context.mocks.sqlExecute.mock.calls - expect(calls[0]).toEqual([`CREATE OR REPLACE CONNECTION "vs'name_CONNECTION" TO '' USER '' IDENTIFIED BY '{"awsAccessKeyId":"access''key"}'`]) - expect(calls[1]).toEqual([`CREATE VIRTUAL SCHEMA "vs'name" USING "ext-schema"."S3_FILES_ADAPTER" WITH CONNECTION_NAME = 'vs''name_CONNECTION' MAPPING = 'mapping''with''''quotes';`]) - const comment = `Created by Extension Manager for ${EXTENSION_NAME} vs''name` - expect(calls[2]).toEqual([`COMMENT ON CONNECTION "vs'name_CONNECTION" IS '${comment}'`]) - expect(calls[3]).toEqual([`COMMENT ON SCHEMA "vs'name" IS '${comment}'`]) + expect(calls[1]).toEqual([`CREATE VIRTUAL SCHEMA "vs'name" USING "ext-schema"."S3_FILES_ADAPTER" WITH CONNECTION_NAME = 'vs''name_CONNECTION' MAPPING = 'mapping''with''''quotes'`]) }) it("fails for wrong version", () => { expect(() => { createExtension().addInstance(createMockContext(), "wrongVersion", { values: [] }) }) - .toThrow(`Version 'wrongVersion' not supported, can only use ${CONFIG.version}.`) + .toThrow(`Version 'wrongVersion' not supported, can only use '${CONFIG.version}'.`) }) }) @@ -231,7 +215,7 @@ describe("S3 VS Extension", () => { function findInstances(rows: Row[]): Instance[] { const context = createMockContext(); context.mocks.sqlQuery.mockReturnValue({ columns: [], rows }); - return createExtension().findInstances(context, "version") + return createExtension().findInstances(context, CONFIG.version) } it("returns empty list for empty metadata", () => { expect(findInstances([])).toEqual([]) @@ -247,10 +231,10 @@ describe("S3 VS Extension", () => { it("filters by schema and script name", () => { const context = createMockContext(); context.mocks.sqlQuery.mockReturnValue({ columns: [], rows: [] }); - createExtension().findInstances(context, "version") + createExtension().findInstances(context, CONFIG.version) const queryCalls = context.mocks.sqlQuery.mock.calls expect(queryCalls.length).toEqual(1) - expect(queryCalls[0]).toEqual(["SELECT SCHEMA_NAME FROM SYS.EXA_ALL_VIRTUAL_SCHEMAS WHERE ADAPTER_SCRIPT = ?||'.'||? ORDER BY SCHEMA_NAME", "ext-schema", "S3_FILES_ADAPTER"]) + expect(queryCalls[0]).toEqual(["SELECT SCHEMA_NAME FROM SYS.EXA_ALL_VIRTUAL_SCHEMAS WHERE ADAPTER_SCRIPT_SCHEMA = ? AND ADAPTER_SCRIPT_NAME = ? ORDER BY SCHEMA_NAME", "ext-schema", "S3_FILES_ADAPTER"]) }) }) @@ -269,6 +253,42 @@ describe("S3 VS Extension", () => { }) }) + describe("upgrade()", () => { + function scriptWithVersion(name: string, version: string): ExaScriptsRow { + return script({ name, text: `CREATE ... %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-${version}.jar;` }) + } + it("preconditions fail", () => { + const context = createMockContext() + context.mocks.simulateScripts(null, null) + expect(() => createExtension().upgrade(context)) + .toThrow("Not all required scripts are installed: Validation failed: Script 'S3_FILES_ADAPTER' is missing, Script 'IMPORT_FROM_S3_DOCUMENT_FILES' is missing") + }) + describe("success", () => { + it("returns versions", () => { + const context = createMockContext() + context.mocks.simulateScripts(scriptWithVersion("S3_FILES_ADAPTER", "1.2.3"), scriptWithVersion("IMPORT_FROM_S3_DOCUMENT_FILES", "1.2.3")) + expect(createExtension().upgrade(context)).toStrictEqual({ previousVersion: "1.2.3", newVersion: CONFIG.version, }) + }) + it("executes CREATE SCRIPT statements", () => { + const context = createMockContext() + context.mocks.simulateScripts(scriptWithVersion("S3_FILES_ADAPTER", "1.2.3"), scriptWithVersion("IMPORT_FROM_S3_DOCUMENT_FILES", "1.2.3")) + createExtension().upgrade(context) + + const executeCalls = context.mocks.sqlExecute.mock.calls + expect(executeCalls.length).toBe(4) + const adapterScript = executeCalls[0][0] + const importScript = executeCalls[1][0] + expect(adapterScript).toContain(`CREATE OR REPLACE JAVA ADAPTER SCRIPT "ext-schema"."S3_FILES_ADAPTER" AS`) + expect(adapterScript).toContain(`%jar /bucketfs/${CONFIG.fileName};`) + expect(importScript).toContain(`CREATE OR REPLACE JAVA SET SCRIPT "ext-schema"."IMPORT_FROM_S3_DOCUMENT_FILES"`) + expect(importScript).toContain(`%jar /bucketfs/${CONFIG.fileName};`) + const expectedComment = `Created by Extension Manager for S3 Virtual Schema ${CONFIG.version}` + expect(executeCalls[2]).toEqual([`COMMENT ON SCRIPT "ext-schema"."S3_FILES_ADAPTER" IS '${expectedComment}'`]) + expect(executeCalls[3]).toEqual([`COMMENT ON SCRIPT "ext-schema"."IMPORT_FROM_S3_DOCUMENT_FILES" IS '${expectedComment}'`]) + }) + }) + }) + describe("readInstanceParameterValues()", () => { it("is not supported", () => { expect(() => { createExtension().readInstanceParameterValues(createMockContext(), "version", "instId") }) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index b1f5700d..d5091565 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -1,70 +1,92 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { - Context, ExaMetadata, ExasolExtension, - Installation, - Instance, NotFoundError, Parameter, ParameterValues, + Parameter, + SelectOption, registerExtension } from "@exasol/extension-manager-interface"; -import { addInstance } from "./addInstance"; -import { EXTENSION_NAME, ExtensionInfo } from "./common"; -import { deleteInstance } from "./deleteInstance"; +import { ScriptDefinition, jarFileVersionExtractor } from "@exasol/extension-manager-interface/dist/base"; +import { convertVirtualSchemaBaseExtension, createJsonConnectionDefinition, createVirtualSchemaBuilder } from "@exasol/extension-manager-interface/dist/base-vs"; +import { ADAPTER_SCRIPT_NAME, EXTENSION_NAME, IMPORT_SCRIPT_NAME } from "./common"; import { CONFIG } from "./extension-config"; -import { findInstallations } from "./findInstallations"; -import { findInstances } from "./findInstances"; -import { installExtension } from "./installExtension"; -import { createInstanceParameters } from "./parameterDefinitions"; -import { uninstall } from "./uninstallExtension"; -import { upgrade } from "./upgrade"; - -function createExtensionInfo(): ExtensionInfo { - const version = CONFIG.version; - const fileName = CONFIG.fileName; - return { version, fileName }; -} export function createExtension(): ExasolExtension { - const extensionInfo = createExtensionInfo() - const repoBaseUrl = "https://github.com/exasol/s3-document-files-virtual-schema" - const downloadUrl = `${repoBaseUrl}/releases/download/${extensionInfo.version}/${extensionInfo.fileName}`; - const licenseUrl = `${repoBaseUrl}/blob/main/LICENSE`; - return { + return convertVirtualSchemaBaseExtension({ name: EXTENSION_NAME, description: "Virtual Schema for document files on AWS S3", category: "document-virtual-schema", - installableVersions: [{ name: extensionInfo.version, latest: true, deprecated: false }], - bucketFsUploads: [{ bucketFsFilename: extensionInfo.fileName, downloadUrl, fileSize: CONFIG.fileSizeBytes, name: "S3 VS Jar file", licenseUrl, licenseAgreementRequired: false }], - install(context: Context, version: string) { - installExtension(context, extensionInfo, version) - }, - addInstance(context: Context, version: string, params: ParameterValues): Instance { - return addInstance(context, extensionInfo, version, params); - }, - findInstallations(_context: Context, metadata: ExaMetadata): Installation[] { - return findInstallations(metadata.allScripts.rows); - }, - findInstances(context: Context, version: string): Instance[] { - return findInstances(context); - }, - uninstall(context: Context, version: string): void { - uninstall(context, extensionInfo, version) - }, - upgrade(context) { - return upgrade(context, extensionInfo) - }, - deleteInstance(context: Context, version: string, instanceId: string): void { - deleteInstance(context, extensionInfo, version, instanceId); - }, - getInstanceParameters(context: Context, version: string): Parameter[] { - if (extensionInfo.version !== version) { - throw new NotFoundError(`Version '${version}' not supported, can only use '${extensionInfo.version}'.`) - } - return createInstanceParameters() + version: CONFIG.version, + file: { name: CONFIG.fileName, size: CONFIG.fileSizeBytes }, + scripts: getUdfScriptDefinitions(), + virtualSchemaAdapterScript: ADAPTER_SCRIPT_NAME, + scriptVersionExtractor: jarFileVersionExtractor(/document-files-virtual-schema-dist-[\d.]+-s3-(\d+\.\d+\.\d+).jar/), + builder: createVirtualSchemaBuilder({ + connectionNameProperty: "CONNECTION_NAME", + virtualSchemaParameters: getVirtualSchemaParameterDefinitions(), + connectionDefinition: createJsonConnectionDefinition(getConnectionParameterDefinitions()) + }) + }) +} + +function getUdfScriptDefinitions(): ScriptDefinition[] { + return [ + { + name: ADAPTER_SCRIPT_NAME, + type: "ADAPTER", + scriptClass: "com.exasol.adapter.RequestDispatcher" }, - readInstanceParameterValues(_context: Context, _version: string, _instanceId: string): ParameterValues { - throw new NotFoundError("Reading instance parameter values not supported") + { + name: IMPORT_SCRIPT_NAME, + type: "SET", + parameters: "DATA_LOADER VARCHAR(2000000), SCHEMA_MAPPING_REQUEST VARCHAR(2000000), CONNECTION_NAME VARCHAR(500)", + emitParameters: "...", + scriptClass: "com.exasol.adapter.document.UdfEntryPoint" } - } + ] +} + +function getConnectionParameterDefinitions(): Parameter[] { + return [ + { id: "awsAccessKeyId", name: "AWS Access Key Id", type: "string", required: true }, + { id: "awsSecretAccessKey", name: "AWS Secret AccessKey", type: "string", required: true, secret: true }, + { id: "awsSessionToken", name: "AWS Session Token", type: "string", required: false, secret: true }, + { id: "awsRegion", name: "AWS Region", type: "string", required: true, placeholder: "eu-central-1" }, + { id: "s3Bucket", name: "S3 Bucket", type: "string", required: true }, + { id: "awsEndpointOverride", name: "AWS Endpoint Override", type: "string", required: false, placeholder: "s3.example.com:9000" }, + { id: "s3PathStyleAccess", name: "S3 Path Style Access", type: "boolean", required: false }, + { id: "useSsl", name: "Use SSL", type: "boolean", required: false, default: "true" }, + ]; +} + +function getVirtualSchemaParameterDefinitions(): Parameter[] { + return [ + { + id: "MAPPING", name: "EDML Mapping", type: "string", + description: "See documentation at https://github.com/exasol/virtual-schema-common-document/blob/main/doc/user_guide/edml_user_guide.md", + placeholder: `{ + "$schema": "https://schemas.exasol.com/edml-1.5.0.json", + "source": "path/to/books.csv", + "destinationTable": "BOOKS", + "description": "Example mapping", + "mapping": { + "fields": { } + }`, required: true, multiline: true + }, { + id: "MAX_PARALLEL_UDFS", name: "Max. number of parallel UDFs", type: "string", description: "Maximum number of UDFs that are executed in parallel. -1 represents unlimited.", + required: false, placeholder: "-1", default: "-1" + }, { + id: "DEBUG_ADDRESS", name: "Debug address", description: "Network address and port to which to send debug output", + type: "string", required: false, placeholder: "192.168.179.38:3000", default: "" + }, { + id: "LOG_LEVEL", name: "Log level", description: "Log level for debug output. Debug address must be defined for this to work.", + type: "select", required: false, options: getJavaLogLevelOptions(), default: "" + }, + ]; +} + +function getJavaLogLevelOptions(): SelectOption[] { + const javaLogLevels: string[] = ["OFF", "SEVERE", "WARNING", "INFO", "CONFIG", "FINE", "FINER", "FINEST"]; + return javaLogLevels.map(level => { return { id: level, name: level } }) } registerExtension(createExtension()) diff --git a/extension/src/findInstallations.ts b/extension/src/findInstallations.ts deleted file mode 100644 index a9bfdc94..00000000 --- a/extension/src/findInstallations.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ExaScriptsRow, Installation } from "@exasol/extension-manager-interface"; -import { AdapterScript } from "./adapterScript"; -import { ADAPTER_SCRIPT_NAME, IMPORT_SCRIPT_NAME } from "./common"; - - - -function findScriptByName(scripts: ExaScriptsRow[], name: string): AdapterScript | undefined { - return scripts.map(script => new AdapterScript(script)).find(script => script.name === name); -} - -export function findInstallations(scripts: ExaScriptsRow[]): Installation[] { - const importScript = findScriptByName(scripts, IMPORT_SCRIPT_NAME); - const adapterScript = findScriptByName(scripts, ADAPTER_SCRIPT_NAME); - if (!importScript && !adapterScript) { - return []; - } - if (!importScript || !adapterScript) { - console.log(`Either import script or adapter script not found`); - return []; - } - if (!importScript.isValidImportScript() || !adapterScript.isValidAdapterScript()) { - return []; - } - - return [{ - name: `${adapterScript.schema}.${adapterScript.name}`, - version: adapterScript.getVersion() ?? "(unknown)" - }]; -} - diff --git a/extension/src/findInstances.ts b/extension/src/findInstances.ts deleted file mode 100644 index d75b3969..00000000 --- a/extension/src/findInstances.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Context, Instance } from "@exasol/extension-manager-interface"; -import { ADAPTER_SCRIPT_NAME } from "./common"; - -export function findInstances(context: Context): Instance[] { - const result = context.sqlClient.query("SELECT SCHEMA_NAME FROM SYS.EXA_ALL_VIRTUAL_SCHEMAS" - + " WHERE ADAPTER_SCRIPT = ?||'.'||? " - + " ORDER BY SCHEMA_NAME", context.extensionSchemaName, ADAPTER_SCRIPT_NAME) - return result.rows.map(row => { - const schemaName = row[0]; - return { id: schemaName, name: schemaName } - }) -} \ No newline at end of file diff --git a/extension/src/installExtension.ts b/extension/src/installExtension.ts deleted file mode 100644 index e3b3d446..00000000 --- a/extension/src/installExtension.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BadRequestError, Context } from "@exasol/extension-manager-interface"; -import { ADAPTER_SCRIPT_NAME, EXTENSION_NAME, ExtensionInfo, IMPORT_SCRIPT_NAME } from "./common"; - -export function installExtension(context: Context, extension: ExtensionInfo, versionToInstall: string): void { - if (extension.version !== versionToInstall) { - throw new BadRequestError(`Installing version '${versionToInstall}' not supported, try '${extension.version}'.`) - } - const jarPath = context.bucketFs.resolvePath(extension.fileName) - - context.sqlClient.execute(` - CREATE OR REPLACE JAVA ADAPTER SCRIPT "${context.extensionSchemaName}"."${ADAPTER_SCRIPT_NAME}" AS - %scriptclass com.exasol.adapter.RequestDispatcher; - %jar ${jarPath};`) - - context.sqlClient.execute(` - CREATE OR REPLACE JAVA SET SCRIPT "${context.extensionSchemaName}"."${IMPORT_SCRIPT_NAME}" - (DATA_LOADER VARCHAR(2000000), SCHEMA_MAPPING_REQUEST VARCHAR(2000000), CONNECTION_NAME VARCHAR(500)) - EMITS(...) AS - %scriptclass com.exasol.adapter.document.UdfEntryPoint; - %jar ${jarPath};`) - context.sqlClient.execute(`COMMENT ON SCRIPT "${context.extensionSchemaName}"."${IMPORT_SCRIPT_NAME}" IS 'Created by Extension Manager for ${EXTENSION_NAME} extension ${extension.version}'`); - context.sqlClient.execute(`COMMENT ON SCRIPT "${context.extensionSchemaName}"."${ADAPTER_SCRIPT_NAME}" IS 'Created by Extension Manager for ${EXTENSION_NAME} extension ${extension.version}'`); -} \ No newline at end of file diff --git a/extension/src/parameterDefinitions.ts b/extension/src/parameterDefinitions.ts deleted file mode 100644 index 714b7db1..00000000 --- a/extension/src/parameterDefinitions.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Parameter } from "@exasol/extension-manager-interface"; - -export type ScopedParameter = Parameter & { scope: "general" | "connection" | "vs" } -export type ScopedParameters = { [key: string]: ScopedParameter } - -const allParams: ScopedParameters = { - virtualSchemaName: { scope: "general", id: "virtualSchemaName", name: "Name of the new virtual schema", type: "string", required: true }, - - // Connection parameters - awsAccessKeyId: { scope: "connection", id: "awsAccessKeyId", name: "AWS Access Key Id", type: "string", required: true }, - awsSecretAccessKey: { scope: "connection", id: "awsSecretAccessKey", name: "AWS Secret AccessKey", type: "string", required: true, secret: true }, - awsRegion: { scope: "connection", id: "awsRegion", name: "AWS Region", type: "string", required: true }, - s3Bucket: { scope: "connection", id: "s3Bucket", name: "S3 Bucket", type: "string", required: true }, - awsSessionToken: { scope: "connection", id: "awsSessionToken", name: "AWS Session Token", type: "string", required: false, secret: true }, - awsEndpointOverride: { scope: "connection", id: "awsEndpointOverride", name: "AWS Endpoint Override", type: "string", required: false }, - s3PathStyleAccess: { scope: "connection", id: "s3PathStyleAccess", name: "S3 Path Style Access", type: "boolean", required: false }, - useSsl: { scope: "connection", id: "useSsl", name: "Use SSL", type: "boolean", required: false }, - - // Virtual Schema parameters - mapping: { scope: "vs", id: "mapping", name: "EDML Mapping", type: "string", required: true, multiline: true }, -}; - -export function getAllParameterDefinitions(): ScopedParameters { - return allParams; -} - -export function createInstanceParameters(): Parameter[] { - return [ - allParams.virtualSchemaName, - allParams.awsAccessKeyId, - allParams.awsSecretAccessKey, - allParams.awsRegion, - allParams.s3Bucket, - allParams.awsSessionToken, - allParams.awsEndpointOverride, - allParams.s3PathStyleAccess, - allParams.useSsl, - allParams.mapping - ]; -} \ No newline at end of file diff --git a/extension/src/test-utils.ts b/extension/src/test-utils.ts index fc31cc44..a429f243 100644 --- a/extension/src/test-utils.ts +++ b/extension/src/test-utils.ts @@ -64,9 +64,13 @@ export function createMockContext(): ContextMock { export function script({ schema = "schema", name = "name", inputType, resultType, type = "", text = "", comment }: Partial): ExaScriptsRow { return { schema, name, inputType, resultType, type, text, comment } } -export function adapterScript({ name = "S3_FILES_ADAPTER", type = "ADAPTER", text = "adapter script" }: Partial): ExaScriptsRow { +export function adapterScript({ name = "S3_FILES_ADAPTER", type = "ADAPTER", text = undefined }: Partial): ExaScriptsRow { + const version = "1.2.3" + text = text ?? `CREATE ... %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-${version}.jar;` return script({ name, type, text }) } -export function importScript({ name = "IMPORT_FROM_S3_DOCUMENT_FILES", type = "UDF", inputType = "SET", resultType = "EMITS" }: Partial): ExaScriptsRow { - return script({ name, type, inputType, resultType }) +export function importScript({ name = "IMPORT_FROM_S3_DOCUMENT_FILES", type = "UDF", inputType = "SET", resultType = "EMITS", text = undefined }: Partial): ExaScriptsRow { + const version = "1.2.3" + text = text ?? `CREATE ... %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-${version}.jar;` + return script({ name, type, inputType, resultType, text }) } diff --git a/extension/src/uninstallExtension.ts b/extension/src/uninstallExtension.ts deleted file mode 100644 index 4224eb4b..00000000 --- a/extension/src/uninstallExtension.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { BadRequestError, Context } from "@exasol/extension-manager-interface"; -import { ADAPTER_SCRIPT_NAME, ExtensionInfo, IMPORT_SCRIPT_NAME } from "./common"; - -export function uninstall(context: Context, extension: ExtensionInfo, versionToUninstall: string): void { - if (extension.version !== versionToUninstall) { - throw new BadRequestError(`Uninstalling version '${versionToUninstall}' not supported, try '${extension.version}'.`) - } - - function extensionSchemaExists(): boolean { - const result = context.sqlClient.query("SELECT 1 FROM SYS.EXA_ALL_SCHEMAS WHERE SCHEMA_NAME=?", context.extensionSchemaName) - return result.rows.length > 0 - } - - if (extensionSchemaExists()) { // Drop commands fail when schema does not exist. - context.sqlClient.execute(`DROP ADAPTER SCRIPT "${context.extensionSchemaName}"."${ADAPTER_SCRIPT_NAME}"`) - context.sqlClient.execute(`DROP SCRIPT "${context.extensionSchemaName}"."${IMPORT_SCRIPT_NAME}"`) - } -} diff --git a/extension/src/upgrade.test.ts b/extension/src/upgrade.test.ts deleted file mode 100644 index 25840e40..00000000 --- a/extension/src/upgrade.test.ts +++ /dev/null @@ -1,59 +0,0 @@ - -import { ExaScriptsRow, NotFoundError, PreconditionFailedError } from '@exasol/extension-manager-interface'; -import { describe, expect, it } from '@jest/globals'; -import { createExtension } from "./extension"; -import { CONFIG } from './extension-config'; -import { createMockContext, script } from './test-utils'; - -function scriptWithText(text: string): ExaScriptsRow { - return script({ text }); -} - -function scriptWithVersion(version: string): ExaScriptsRow { - return scriptWithText(`CREATE ... %jar /path/to/document-files-virtual-schema-dist-0.0.0-s3-${version}.jar;`) -} - -describe("upgrade()", () => { - describe("preconditions fail", () => { - const tests: { name: string; adapterScript: ExaScriptsRow | null, importScript: ExaScriptsRow | null, expectedError: Error }[] = [ - { name: "both scripts missing", adapterScript: null, importScript: null, expectedError: new NotFoundError("extension is not installed, the following scripts are missing: S3_FILES_ADAPTER, IMPORT_FROM_S3_DOCUMENT_FILES") }, - { name: "import script missing", adapterScript: script({}), importScript: null, expectedError: new NotFoundError("extension is not installed, the following scripts are missing: IMPORT_FROM_S3_DOCUMENT_FILES") }, - { name: "adapter script missing", adapterScript: null, importScript: script({}), expectedError: new NotFoundError("extension is not installed, the following scripts are missing: S3_FILES_ADAPTER") }, - { name: "unknown adapter script version", adapterScript: scriptWithText("dummy"), importScript: script({}), expectedError: new PreconditionFailedError("Failed to extract version from adapter script schema.name, script text: 'dummy'") }, - { name: "unknown import script version", adapterScript: scriptWithVersion("1.2.3"), importScript: scriptWithText("dummy"), expectedError: new PreconditionFailedError("Failed to extract version from import script schema.name, script text: 'dummy'") }, - { name: "inconsistent script versions", adapterScript: scriptWithVersion("1.2.3"), importScript: scriptWithVersion("1.2.4"), expectedError: new PreconditionFailedError("Scripts have inconsistent versions. schema.name: 1.2.3, schema.name: 1.2.4") }, - { name: "latest version already installed", adapterScript: scriptWithVersion(CONFIG.version), importScript: scriptWithVersion(CONFIG.version), expectedError: new PreconditionFailedError("Extension is already installed in latest version " + CONFIG.version) }, - ] - - tests.forEach(test => it(test.name, () => { - const context = createMockContext() - context.mocks.simulateScripts(test.adapterScript, test.importScript) - expect(() => createExtension().upgrade(context)) - .toThrow(test.expectedError) - })) - }) - describe("success", () => { - it("returns versions", () => { - const context = createMockContext() - context.mocks.simulateScripts(scriptWithVersion("1.2.3"), scriptWithVersion("1.2.3")) - expect(createExtension().upgrade(context)).toStrictEqual({ previousVersion: "1.2.3", newVersion: CONFIG.version, }) - }) - it("executes CREATE SCRIPT statements", () => { - const context = createMockContext() - context.mocks.simulateScripts(scriptWithVersion("1.2.3"), scriptWithVersion("1.2.3")) - createExtension().upgrade(context) - - const executeCalls = context.mocks.sqlExecute.mock.calls - expect(executeCalls.length).toBe(4) - const adapterScript = executeCalls[0][0] - const importScript = executeCalls[1][0] - expect(adapterScript).toContain(`CREATE OR REPLACE JAVA ADAPTER SCRIPT "ext-schema"."S3_FILES_ADAPTER" AS`) - expect(adapterScript).toContain(`%jar /bucketfs/${CONFIG.fileName};`) - expect(importScript).toContain(`CREATE OR REPLACE JAVA SET SCRIPT "ext-schema"."IMPORT_FROM_S3_DOCUMENT_FILES"`) - expect(importScript).toContain(`%jar /bucketfs/${CONFIG.fileName};`) - const expectedComment = `Created by Extension Manager for S3 Virtual Schema extension ${CONFIG.version}` - expect(executeCalls[2]).toEqual([`COMMENT ON SCRIPT "ext-schema"."IMPORT_FROM_S3_DOCUMENT_FILES" IS '${expectedComment}'`]) - expect(executeCalls[3]).toEqual([`COMMENT ON SCRIPT "ext-schema"."S3_FILES_ADAPTER" IS '${expectedComment}'`]) - }) - }) -}) \ No newline at end of file diff --git a/extension/src/upgrade.ts b/extension/src/upgrade.ts deleted file mode 100644 index 9df39559..00000000 --- a/extension/src/upgrade.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Context, NotFoundError, PreconditionFailedError, UpgradeResult } from "@exasol/extension-manager-interface"; -import { AdapterScript } from "./adapterScript"; -import { ADAPTER_SCRIPT_NAME, ExtensionInfo, IMPORT_SCRIPT_NAME } from "./common"; -import { installExtension } from "./installExtension"; - -interface Scripts { - adapterScript: AdapterScript - importScript: AdapterScript -} - -export function upgrade(context: Context, extensionInfo: ExtensionInfo): UpgradeResult { - const scripts = getAdapterScripts(context) - const previousVersion = getAdapterVersion(extensionInfo, scripts) - const newVersion = extensionInfo.version - installExtension(context, extensionInfo, newVersion) - return { previousVersion, newVersion }; -} - -function getAdapterScripts(context: Context): Scripts { - const adapterScript = context.metadata.getScriptByName(ADAPTER_SCRIPT_NAME) - const importScript = context.metadata.getScriptByName(IMPORT_SCRIPT_NAME) - if (!adapterScript || !importScript) { - const missingScripts: string[] = [] - if (!adapterScript) { - missingScripts.push(ADAPTER_SCRIPT_NAME) - } - if (!importScript) { - missingScripts.push(IMPORT_SCRIPT_NAME) - } - throw new NotFoundError(`extension is not installed, the following scripts are missing: ${missingScripts.join(', ')}`) - } - return { - adapterScript: new AdapterScript(adapterScript), - importScript: new AdapterScript(importScript) - } -} - -function getAdapterVersion(extensionInfo: ExtensionInfo, scripts: Scripts): string { - const { adapterScript, importScript } = scripts; - const adapterVersion = adapterScript.getVersion(); - const importScriptVersion = importScript.getVersion(); - if (!adapterVersion) { - throw new PreconditionFailedError(`Failed to extract version from adapter script ${adapterScript.qualifiedName}, script text: '${adapterScript.text}'`) - } else if (!importScriptVersion) { - throw new PreconditionFailedError(`Failed to extract version from import script ${importScript.qualifiedName}, script text: '${importScript.text}'`) - } else if (adapterVersion !== importScriptVersion) { - throw new PreconditionFailedError(`Scripts have inconsistent versions. ${adapterScript.qualifiedName}: ${adapterVersion}, ${importScript.qualifiedName}: ${importScriptVersion}`) - } else if (adapterVersion === extensionInfo.version) { - throw new PreconditionFailedError(`Extension is already installed in latest version ${extensionInfo.version}`) - } - return adapterVersion -} diff --git a/pk_generated_parent.pom b/pk_generated_parent.pom index f81ee64e..13731d42 100644 --- a/pk_generated_parent.pom +++ b/pk_generated_parent.pom @@ -3,7 +3,7 @@ 4.0.0 com.exasol s3-document-files-virtual-schema-generated-parent - 2.8.2 + 2.8.3 pom UTF-8 diff --git a/pom.xml b/pom.xml index 9729ecf2..ea6dcbcc 100644 --- a/pom.xml +++ b/pom.xml @@ -2,12 +2,12 @@ 4.0.0 s3-document-files-virtual-schema - 2.8.2 + 2.8.3 Virtual Schema for document data in files on AWS S3 Adapter for document data access from files from AWS S3. https://github.com/exasol/s3-document-files-virtual-schema/ - 5.10.0 + 5.10.1 1.19.1 7.3.6 @@ -39,7 +39,7 @@ software.amazon.awssdk bom - 2.21.6 + 2.21.16 pom import @@ -85,7 +85,7 @@ nl.jqno.equalsverifier equalsverifier - 3.15.2 + 3.15.3 test @@ -110,7 +110,7 @@ org.mockito mockito-core - 5.6.0 + 5.7.0 test @@ -136,7 +136,7 @@ com.amazonaws aws-java-sdk-s3 - 1.12.572 + 1.12.582 test @@ -154,7 +154,7 @@ com.exasol hamcrest-resultset-matcher - 1.6.1 + 1.6.2 test @@ -190,7 +190,7 @@ com.exasol extension-manager-integration-test-java - 0.5.3 + 0.5.5 test @@ -232,7 +232,7 @@ com.exasol project-keeper-maven-plugin - 2.9.14 + 2.9.15 @@ -257,7 +257,7 @@ maven-clean-plugin - 3.3.1 + 3.3.2 @@ -351,7 +351,7 @@ s3-document-files-virtual-schema-generated-parent com.exasol - 2.8.2 + 2.8.3 pk_generated_parent.pom diff --git a/src/main/resources/classes.lst b/src/main/resources/classes.lst index 1ac5ba73..9940dd21 100644 --- a/src/main/resources/classes.lst +++ b/src/main/resources/classes.lst @@ -52,6 +52,7 @@ java/util/RegularEnumSet io/netty/handler/codec/http/DefaultHttpContent software/amazon/awssdk/auth/signer/S3SignerExecutionAttribute jdk/internal/util/Preconditions$1 +software/amazon/awssdk/http/auth/aws/internal/signer/V4RequestSigningResult sun/security/provider/NativePRNG$NonBlocking io/netty/util/internal/shaded/org/jctools/queues/atomic/MpscUnboundedAtomicArrayQueue software/amazon/awssdk/regions/servicemetadata/RamServiceMetadata @@ -61,8 +62,8 @@ java/lang/NullPointerException com/ctc/wstx/util/SymbolTable software/amazon/awssdk/core/util/SdkAutoConstructMap java/time/LocalTime -sun/security/provider/NativePRNG$Variant software/amazon/awssdk/regions/servicemetadata/ServicediscoveryServiceMetadata +sun/security/provider/NativePRNG$Variant software/amazon/awssdk/endpoints/Endpoint$Builder io/netty/handler/codec/CodecOutputList java/util/Collections$SynchronizedCollection @@ -172,6 +173,7 @@ software/amazon/awssdk/thirdparty/jackson/core/json/async/NonBlockingByteBufferJ org/antlr/v4/runtime/misc/Interval sun/text/normalizer/NormalizerBase$Mode software/amazon/awssdk/thirdparty/jackson/core/sym/CharsToNameCanonicalizer$Bucket +software/amazon/awssdk/services/s3/auth/scheme/internal/DefaultS3AuthSchemeParams$Builder com/exasol/adapter/metadata/TableMetadata java/net/SocketOption sun/net/sdp/SdpProvider @@ -187,6 +189,7 @@ sun/security/ssl/SSLCipher$T12CC20P1305ReadCipherGenerator sun/security/ssl/PskKeyExchangeModesExtension$PskKeyExchangeModesStringizer com/exasol/adapter/sql/SqlFunctionAggregateGroupConcat com/exasol/adapter/capabilities/Capabilities +software/amazon/awssdk/http/auth/aws/internal/signer/DefaultAwsV4HttpSigner java/util/Objects java/io/ObjectInputStream$GetFieldImpl software/amazon/awssdk/core/interceptor/SdkExecutionAttribute @@ -209,7 +212,6 @@ sun/security/provider/NativePRNG$Blocking software/amazon/awssdk/regions/servicemetadata/MeteringMarketplaceServiceMetadata jdk/net/ExtendedSocketOptions$1 software/amazon/awssdk/services/s3/model/DeleteBucketTaggingRequest -software/amazon/awssdk/core/CredentialType java/io/ObjectInputStream$HandleTable$HandleList java/util/HashMap$ValueSpliterator software/amazon/awssdk/services/s3/model/GetBucketLoggingRequest @@ -238,7 +240,6 @@ com/exasol/sql/dql/select/FromClause java/nio/DirectByteBuffer java/util/logging/LogManager$LogNode java/util/AbstractSequentialList -software/amazon/awssdk/awscore/internal/authcontext/AuthorizationStrategyFactory software/amazon/awssdk/core/retry/RetryMode$Resolver java/util/stream/IntPipeline$1 io/netty/util/internal/shaded/org/jctools/queues/MpscArrayQueueL1Pad @@ -264,7 +265,9 @@ java/util/concurrent/ConcurrentHashMap$EntryIterator scala/collection/LinearSeqOps sun/security/x509/PKIXExtensions java/io/FilePermission$1 +software/amazon/awssdk/http/auth/aws/internal/signer/util/SigningAlgorithm$MacThreadLocal sun/security/util/MemoryCache$SoftCacheEntry +software/amazon/awssdk/services/s3/auth/scheme/S3AuthSchemeParams$Builder software/amazon/awssdk/regions/servicemetadata/WellarchitectedServiceMetadata software/amazon/awssdk/thirdparty/jackson/core/json/WriterBasedJsonGenerator software/amazon/awssdk/thirdparty/jackson/core/JsonParseException @@ -299,8 +302,8 @@ sun/security/ssl/SupportedGroupsExtension$EESupportedGroupsProducer software/amazon/awssdk/regions/servicemetadata/ApiDetectiveServiceMetadata sun/text/normalizer/UCharacterProperty$IntProperty software/amazon/awssdk/protocols/core/ValueToStringConverter -software/amazon/awssdk/auth/signer/Aws4UnsignedPayloadSigner software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncBeforeTransmissionExecutionInterceptorsStage +software/amazon/awssdk/http/auth/aws/scheme/AwsV4aAuthScheme sun/security/ssl/ServerNameExtension$CHServerNamesStringizer org/apache/http/impl/cookie/RFC2965Spec java/security/SecureClassLoader$DebugHolder @@ -339,7 +342,6 @@ sun/security/ssl/NewSessionTicket sun/security/ssl/SSLKeyDerivationGenerator io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe java/lang/invoke/BoundMethodHandle$Species_LLLLLLL -software/amazon/awssdk/auth/signer/internal/BaseAws4Signer sun/security/ssl/NamedGroup$XDHScheme org/antlr/v4/runtime/atn/SemanticContext$Predicate sun/invoke/util/Wrapper @@ -357,15 +359,14 @@ io/netty/util/internal/PlatformDependent$Mpsc software/amazon/awssdk/thirdparty/jackson/core/io/JsonStringEncoder sun/security/x509/X509CertImpl scala/collection/LinearSeq +software/amazon/awssdk/http/auth/spi/signer/BaseSignRequest$Builder jakarta/json/stream/JsonParser software/amazon/awssdk/regions/servicemetadata/Appstream2ServiceMetadata -software/amazon/awssdk/auth/signer/AwsS3V4Signer java/lang/StringBuilder java/lang/StackStreamFactory$StackFrameTraverser com/exasol/sql/expression/literal/Literal sun/security/ssl/SSLSessionImpl java/nio/channels/SelectionKey -software/amazon/awssdk/auth/signer/internal/Aws4SignerUtils jdk/internal/org/objectweb/asm/FieldWriter software/amazon/awssdk/regions/servicemetadata/CodepipelineServiceMetadata sun/security/rsa/RSAUtil$KeyType @@ -492,14 +493,14 @@ java/security/GeneralSecurityException jdk/internal/reflect/ConstructorAccessor io/netty/util/concurrent/MultithreadEventExecutorGroup sun/reflect/generics/reflectiveObjects/TypeVariableImpl -sun/security/jca/ProviderList$1 software/amazon/awssdk/regions/servicemetadata/AirflowServiceMetadata +sun/security/jca/ProviderList$1 sun/util/resources/Bundles$BundleReference java/util/zip/ZipConstants sun/reflect/annotation/ExceptionProxy sun/security/x509/AuthorityKeyIdentifierExtension -sun/security/jca/ProviderList$3 software/amazon/awssdk/core/retry/conditions/AndRetryCondition +sun/security/jca/ProviderList$3 jakarta/json/JsonString sun/security/jca/ProviderList$2 io/netty/handler/ssl/JdkSslServerContext @@ -627,13 +628,12 @@ java/net/NetworkInterface$2 java/util/zip/ZipFile$InflaterCleanupAction software/amazon/awssdk/regions/servicemetadata/SecuritylakeServiceMetadata software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage$RetryingExecutor -software/amazon/awssdk/auth/signer/internal/Aws4SignerRequestParams java/util/Spliterator$OfDouble sun/security/util/ECUtil java/util/Hashtable$Entry sun/security/action/GetBooleanAction -java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync java/util/concurrent/CompletionException +java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync org/antlr/v4/runtime/Parser java/security/interfaces/XECPublicKey sun/security/ssl/SSLContextImpl$CustomizedTLSContext @@ -732,7 +732,6 @@ org/antlr/v4/runtime/atn/PredictionContextCache java/lang/Cloneable java/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl software/amazon/awssdk/services/s3/endpoints/internal/Eval -software/amazon/awssdk/core/io/SdkInputStream java/lang/Module org/glassfish/json/JsonWriterImpl$NoFlushOutputStream org/logicng/solvers/maxsat/algorithms/MaxSATConfig$Verbosity @@ -779,7 +778,6 @@ org/antlr/v4/runtime/IntStream java/util/logging/LogManager$SystemLoggerContext com/exasol/ExaIterator java/util/function/Function -software/amazon/awssdk/core/io/SdkDigestInputStream software/amazon/awssdk/services/s3/model/GetBucketVersioningRequest io/netty/util/internal/shaded/org/jctools/queues/BaseMpscLinkedArrayQueueProducerFields sun/security/ec/ECDSASignature$SHA1 @@ -832,7 +830,6 @@ sun/security/ssl/ClientHello$ClientHelloProducer javax/crypto/Cipher io/netty/util/concurrent/ThreadPerTaskExecutor com/ctc/wstx/sr/ValidatingStreamReader -java/security/DigestInputStream java/security/Permissions$1 software/amazon/awssdk/services/s3/model/UploadPartCopyRequest com/ctc/wstx/api/ReaderConfig @@ -869,7 +866,6 @@ org/antlr/v4/runtime/atn/PredictionMode java/util/ListIterator org/apache/http/io/HttpMessageParserFactory java/util/function/BiPredicate -software/amazon/awssdk/awscore/internal/authcontext/AuthorizationStrategy com/exasol/adapter/document/files/FilesSelectionExtractor jdk/net/ExtendedSocketOptions$ExtSocketOption io/netty/buffer/EmptyByteBuf @@ -893,7 +889,6 @@ org/antlr/v4/runtime/TokenSource io/netty/util/internal/PlatformDependent$ThreadLocalRandomProvider org/antlr/v4/runtime/Vocabulary scala/Some -software/amazon/awssdk/auth/signer/params/AwsS3V4SignerParams$Builder java/nio/charset/CodingErrorAction java/security/MessageDigestSpi software/amazon/awssdk/protocols/xml/internal/unmarshall/XmlProtocolUnmarshaller @@ -913,7 +908,6 @@ software/amazon/awssdk/regions/servicemetadata/IngestTimestreamServiceMetadata java/util/TimSort software/amazon/awssdk/regions/servicemetadata/OsisServiceMetadata org/codehaus/stax2/ri/evt/BaseEventImpl -software/amazon/awssdk/core/internal/io/AwsChunkedEncodingInputStream software/amazon/awssdk/utils/DateUtils software/amazon/awssdk/regions/servicemetadata/CognitoIdentityServiceMetadata sun/security/util/NamedCurve @@ -1089,6 +1083,7 @@ sun/security/ssl/ECDHKeyExchange org/codehaus/stax2/validation/XMLValidator sun/security/ssl/CertificateRequest$T12CertificateRequestProducer java/net/NetPermission +software/amazon/awssdk/http/auth/spi/scheme/AuthSchemeOption$SignerPropertyConsumer sun/security/ssl/PredefinedDHParameterSpecs$1 io/netty/handler/codec/DefaultHeaders$ValueValidator jdk/internal/math/FloatingDecimal$ASCIIToBinaryConverter @@ -1323,7 +1318,6 @@ sun/security/provider/DSA javax/net/ssl/TrustManagerFactory software/amazon/awssdk/core/internal/http/pipeline/stages/ApiCallTimeoutTrackingStage sun/security/ssl/ServerHelloDone$ServerHelloDoneMessage -software/amazon/awssdk/core/signer/Presigner software/amazon/awssdk/regions/servicemetadata/SupportappServiceMetadata sun/net/idn/StringPrep software/amazon/awssdk/regions/servicemetadata/ApiSagemakerServiceMetadata @@ -1381,9 +1375,7 @@ com/sun/crypto/provider/TlsPrfGenerator$V12 java/util/ArrayList java/util/LinkedList$Node com/exasol/adapter/document/documentnode/DocumentNodeVisitor -software/amazon/awssdk/auth/signer/internal/chunkedencoding/AwsSignedChunkedEncodingInputStream sun/security/util/AnchorCertificates$1 -software/amazon/awssdk/awscore/internal/authcontext/AwsCredentialsAuthorizationStrategy$Builder io/netty/util/Recycler$2 io/netty/util/Recycler$1 org/logicng/formulas/FormulaTransformation @@ -1526,6 +1518,7 @@ sun/security/ssl/KeyShareExtension$CHKeyShareProducer software/amazon/awssdk/regions/servicemetadata/RolesanywhereServiceMetadata java/util/logging/LogRecord software/amazon/awssdk/core/interceptor/Context$ModifyResponse +software/amazon/awssdk/http/auth/aws/internal/signer/util/DigestAlgorithm$DigestThreadLocal sun/security/rsa/PSSParameters org/logicng/pseudobooleans/PBConfig software/amazon/awssdk/utils/SdkAutoCloseable @@ -1547,6 +1540,7 @@ java/net/JarURLConnection software/amazon/awssdk/regions/servicemetadata/LogsServiceMetadata org/apache/http/conn/ConnectionPoolTimeoutException io/netty/handler/codec/http/HttpStatusClass$1 +software/amazon/awssdk/identity/spi/internal/DefaultAwsCredentialsIdentity$Builder java/util/JumboEnumSet org/apache/http/HttpClientConnection org/apache/http/params/CoreProtocolPNames @@ -1560,7 +1554,6 @@ io/netty/buffer/ByteBufConvertible sun/security/smartcardio/SunPCSC$1 java/io/IOException java/lang/invoke/BoundMethodHandle$Specializer$Factory -software/amazon/awssdk/auth/signer/internal/SignerKey software/amazon/awssdk/core/retry/conditions/OrRetryCondition sun/security/util/KeyStoreDelegator java/util/regex/Pattern$BmpCharProperty @@ -1605,7 +1598,6 @@ java/io/ObjectStreamConstants com/ctc/wstx/util/SymbolTable$Bucket com/exasol/sql/rendering/StringRendererConfig$Builder sun/security/x509/CertificateAlgorithmId -software/amazon/awssdk/auth/signer/internal/BoundedLinkedHashMap java/text/spi/DateFormatSymbolsProvider software/amazon/awssdk/regions/servicemetadata/AppIntegrationsServiceMetadata io/netty/util/internal/logging/InternalLogLevel @@ -1620,6 +1612,7 @@ jdk/internal/misc/JavaLangInvokeAccess org/apache/http/params/HttpProtocolParams org/logicng/formulas/FormulaFunction io/netty/handler/ssl/SslHandshakeTimeoutException +software/amazon/awssdk/http/auth/aws/internal/signer/V4Properties io/netty/util/AttributeKey jdk/internal/loader/Resource com/exasol/sql/expression/predicate/PredicateVisitor @@ -1695,6 +1688,7 @@ software/amazon/awssdk/http/HttpExecuteRequest$BuilderImpl com/sun/crypto/provider/GCTR software/amazon/awssdk/regions/servicemetadata/SyntheticsServiceMetadata java/net/InetSocketAddress +software/amazon/awssdk/core/internal/http/pipeline/stages/QueryParametersToBodyStage io/netty/buffer/PoolSubpage com/ctc/wstx/io/CharsetNames com/exasol/adapter/sql/ScalarFunction @@ -1715,6 +1709,7 @@ com/exasol/adapter/request/AdapterRequestType org/apache/http/conn/ssl/DefaultHostnameVerifier$HostNameType software/amazon/awssdk/regions/servicemetadata/NimbleServiceMetadata com/exasol/adapter/sql/SqlJoin +software/amazon/awssdk/http/auth/spi/scheme/AuthSchemeOption$IdentityPropertyConsumer java/lang/reflect/Proxy$ProxyBuilder$1 software/amazon/awssdk/core/ApiName$BuilderImpl javax/net/ssl/SSLEngineResult$HandshakeStatus @@ -1738,9 +1733,11 @@ java/io/InvalidClassException org/apache/http/auth/AuthSchemeFactory software/amazon/awssdk/regions/servicemetadata/SmsServiceMetadata java/lang/WeakPairMap$Pair$Lookup +software/amazon/awssdk/http/auth/aws/internal/scheme/DefaultAwsV4aAuthScheme java/util/stream/Collectors$CollectorImpl io/netty/channel/PendingBytesTracker$ChannelOutboundBufferPendingBytesTracker sun/security/rsa/RSAPublicKeyImpl +software/amazon/awssdk/http/auth/aws/internal/signer/V4RequestSigner org/codehaus/stax2/ri/typed/ValueDecoderFactory$LongDecoder jdk/internal/misc/TerminatingThreadLocal$1 sun/security/ssl/KeyShareExtension$HRRKeyShareReproducer @@ -1761,6 +1758,7 @@ sun/security/ssl/KeyShareExtension$HRRKeyShareStringizer sun/security/ssl/ECDHClientKeyExchange$ECDHEClientKeyExchangeConsumer io/netty/util/internal/logging/InternalLogger io/netty/bootstrap/AbstractBootstrap +software/amazon/awssdk/services/s3/auth/scheme/S3AuthSchemeProvider sun/util/resources/Bundles$1 sun/security/ssl/Finished$T10VerifyDataGenerator io/netty/buffer/PoolArena$HeapArena @@ -1775,6 +1773,7 @@ org/glassfish/json/JsonGeneratorImpl$Context org/logicng/formulas/Implication sun/util/resources/ParallelListResourceBundle$KeySet java/util/concurrent/SynchronousQueue +software/amazon/awssdk/http/auth/spi/signer/SignedRequest java/util/Properties org/apache/http/conn/util/PublicSuffixMatcherLoader java/lang/reflect/ProxyGenerator$ProxyMethod @@ -1795,6 +1794,7 @@ com/exasol/adapter/document/documentnode/json/JsonNodeFactory$1 java/net/InetAddress$InetAddressHolder jdk/internal/reflect/ConstructorAccessorImpl software/amazon/awssdk/core/client/config/ClientOverrideConfiguration +software/amazon/awssdk/services/s3/auth/scheme/internal/S3AuthSchemeInterceptor org/glassfish/json/JsonObjectBuilderImpl$JsonObjectImpl org/glassfish/json/JsonTokenizer$JsonToken javax/net/ssl/ExtendedSSLSession @@ -1859,7 +1859,6 @@ java/util/stream/Streams$AbstractStreamBuilderImpl io/netty/handler/codec/http/CombinedHttpHeaders java/util/stream/MatchOps$BooleanTerminalSink sun/security/ssl/SSLSocketFactoryImpl -software/amazon/awssdk/auth/signer/internal/SigningAlgorithm sun/security/ssl/SupportedVersionsExtension$HRRSupportedVersionsConsumer com/exasol/adapter/document/mapping/PropertyToDecimalColumnMapping com/exasol/adapter/request/parser/SchemaMetadataInfoParser$1 @@ -2027,6 +2026,7 @@ software/amazon/awssdk/auth/credentials/AwsCredentialsProvider software/amazon/awssdk/thirdparty/jackson/core/json/JsonReadFeature com/exasol/sql/ColumnDefinitionVisitor com/exasol/adapter/document/files/stringfilter/StringFilterFactory +software/amazon/awssdk/http/auth/aws/internal/signer/util/SignerUtils org/apache/http/client/utils/URIUtils$UriFlag java/io/OutputStreamWriter com/exasol/adapter/document/edml/TruncateableMappingErrorBehaviour @@ -2042,6 +2042,7 @@ software/amazon/awssdk/regions/servicemetadata/DatasyncServiceMetadata com/ctc/wstx/sr/Element java/util/concurrent/ConcurrentHashMap$TreeBin java/util/concurrent/ThreadFactory +software/amazon/awssdk/awscore/internal/AwsProtocolMetadata java/lang/CharacterData00 sun/security/ssl/JsseJce$EcAvailability org/antlr/v4/runtime/misc/IntSet @@ -2079,6 +2080,7 @@ sun/security/ssl/SupportedGroupsExtension$CHSupportedGroupsProducer software/amazon/awssdk/services/s3/endpoints/internal/Value$Str org/apache/http/conn/routing/HttpRoutePlanner software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller$Builder +software/amazon/awssdk/http/auth/aws/signer/AwsV4FamilyHttpSigner$AuthLocation io/netty/resolver/InetSocketAddressResolver$1 org/apache/http/client/HttpRequestRetryHandler sun/security/ssl/PskKeyExchangeModesExtension$PskKeyExchangeModesOnLoadAbsence @@ -2142,7 +2144,6 @@ jdk/internal/misc/JavaLangModuleAccess io/netty/channel/ChannelOutboundBuffer software/amazon/awssdk/regions/servicemetadata/IoteventsdataServiceMetadata sun/security/ssl/ServerHello$T13HelloRetryRequestReproducer -software/amazon/awssdk/auth/signer/Aws4Signer software/amazon/awssdk/services/s3/internal/settingproviders/SystemsSettingsUseArnRegionProvider software/amazon/awssdk/services/s3/endpoints/internal/RuleEvaluator com/exasol/adapter/document/documentpath/PathSegment @@ -2167,6 +2168,7 @@ software/amazon/awssdk/regions/servicemetadata/DiscoveryServiceMetadata sun/security/x509/AVA com/exasol/adapter/sql/SqlLiteralNull software/amazon/awssdk/http/SdkHttpExecutionAttributes +software/amazon/awssdk/http/auth/spi/internal/signer/DefaultBaseSignedRequest$BuilderImpl java/security/cert/CertPathChecker java/nio/file/attribute/FileTime org/slf4j/Logger @@ -2233,8 +2235,11 @@ java/io/StreamTokenizer com/exasol/adapter/document/UdfCallBuilder$1 io/netty/handler/codec/http/HttpClientCodec$Encoder org/apache/http/conn/UnsupportedSchemeException +software/amazon/awssdk/http/auth/internal/scheme/DefaultNoAuthAuthScheme$1 org/logicng/transformations/cnf/CNFConfig$Algorithm +software/amazon/awssdk/http/auth/internal/scheme/DefaultNoAuthAuthScheme$2 software/amazon/awssdk/core/runtime/transform/Marshaller +software/amazon/awssdk/http/auth/internal/scheme/DefaultNoAuthAuthScheme$3 io/netty/channel/SimpleChannelInboundHandler org/apache/http/pool/ConnPool software/amazon/awssdk/services/s3/model/GetBucketIntelligentTieringConfigurationRequest @@ -2300,10 +2305,12 @@ sun/security/ssl/KeyShareExtension$HRRKeyShareProducer software/amazon/awssdk/core/metrics/CoreMetric java/lang/Iterable sun/reflect/generics/tree/BaseType +software/amazon/awssdk/http/auth/aws/internal/signer/util/BoundedLinkedHashMap io/netty/util/internal/shaded/org/jctools/queues/atomic/BaseMpscLinkedAtomicArrayQueuePad2 io/netty/util/internal/shaded/org/jctools/queues/atomic/BaseMpscLinkedAtomicArrayQueuePad1 org/logicng/io/parsers/LogicNGPseudoBooleanParser$ComparisonContext software/amazon/awssdk/core/internal/http/pipeline/stages/ApiCallMetricCollectionStage +software/amazon/awssdk/http/auth/aws/internal/signer/PrecomputedSha256Checksummer org/codehaus/stax2/ri/evt/StartDocumentEventImpl org/apache/http/client/methods/HttpUriRequest software/amazon/awssdk/thirdparty/jackson/core/base/GeneratorBase @@ -2315,6 +2322,7 @@ java/lang/invoke/StringConcatFactory$Stringifiers$StringifierMost com/ctc/wstx/util/BaseNsContext sun/security/ssl/Finished$VerifyDataGenerator java/lang/ProcessEnvironment$Value +software/amazon/awssdk/utils/ToString sun/security/pkcs12/PKCS12KeyStore$DualFormatPKCS12 sun/security/ssl/PreSharedKeyExtension$CHPreSharedKeyConsumer software/amazon/awssdk/protocols/query/unmarshall/XmlElement$Builder @@ -2352,6 +2360,7 @@ java/lang/invoke/MethodHandleImpl$Intrinsic com/exasol/adapter/document/mapping/ColumnValueExtractorFactory$Visitor software/amazon/awssdk/services/s3/endpoints/internal/Parameters$Builder sun/security/x509/AuthorityInfoAccessExtension +software/amazon/awssdk/services/s3/auth/scheme/S3AuthSchemeParams sun/net/idn/StringPrep$StringPrepTrieImpl io/netty/handler/codec/DefaultHeaders$ValueIterator java/util/concurrent/locks/ReentrantLock @@ -2446,6 +2455,7 @@ software/amazon/awssdk/core/internal/retry/SdkDefaultRetrySetting$1 software/amazon/awssdk/http/nio/netty/internal/utils/ChannelResolver org/apache/http/impl/io/EmptyInputStream sun/security/util/HostnameChecker +software/amazon/awssdk/http/auth/aws/internal/signer/V4CanonicalRequest org/logicng/solvers/maxsat/algorithms/MaxSATConfig software/amazon/awssdk/services/s3/endpoints/internal/Parameter$Builder software/amazon/awssdk/services/s3/model/PutBucketAnalyticsConfigurationRequest @@ -2462,7 +2472,6 @@ jdk/internal/reflect/ReflectionFactory java/lang/Package java/util/Locale$Category software/amazon/awssdk/utils/builder/SdkBuilder -software/amazon/awssdk/auth/signer/params/AwsS3V4SignerParams scala/util/Properties software/amazon/awssdk/regions/servicemetadata/Cloud9ServiceMetadata software/amazon/awssdk/services/s3/S3ServiceClientConfiguration$Builder @@ -2476,6 +2485,7 @@ java/util/concurrent/Executors$FinalizableDelegatedExecutorService software/amazon/awssdk/regions/servicemetadata/Wafv2ServiceMetadata sun/text/resources/FormatData_en jdk/internal/logger/SurrogateLogger +software/amazon/awssdk/identity/spi/internal/DefaultAwsCredentialsIdentity sun/reflect/generics/tree/ReturnType software/amazon/awssdk/thirdparty/jackson/core/StreamReadConstraints java/util/stream/IntStream @@ -2503,6 +2513,7 @@ org/apache/http/params/HttpParamsNames io/netty/channel/ChannelPipeline sun/security/ssl/DummyX509TrustManager software/amazon/awssdk/services/s3/model/NoSuchUploadException$Builder +software/amazon/awssdk/http/auth/spi/signer/SignedRequest$Builder sun/security/ssl/TransportContext io/netty/handler/codec/http/HttpObjectDecoder$State sun/security/provider/NativePRNG @@ -2542,6 +2553,7 @@ software/amazon/awssdk/internal/http/LowCopyListMap$ForBuilder org/slf4j/helpers/BasicMDCAdapter java/nio/file/attribute/FileAttributeView java/text/spi/BreakIteratorProvider +software/amazon/awssdk/services/s3/auth/scheme/internal/ModeledS3AuthSchemeProvider software/amazon/awssdk/core/async/AsyncResponseTransformerUtils com/exasol/adapter/document/querypredicate/normalizer/QueryPredicateToLogicngConverter$VariablesMappingBuilder io/netty/util/concurrent/FailedFuture @@ -2581,7 +2593,6 @@ sun/security/ssl/CipherType jakarta/json/JsonArray software/amazon/awssdk/regions/servicemetadata/CloudhsmServiceMetadata sun/security/ssl/X509Authentication$X509Credentials -software/amazon/awssdk/auth/signer/params/Aws4SignerParams$Builder software/amazon/awssdk/protocols/core/ProtocolMarshaller java/util/jar/Manifest io/netty/buffer/UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf @@ -2601,6 +2612,7 @@ sun/security/util/SecurityProperties org/apache/log4j/helpers/LogLog java/util/logging/SocketHandler com/exasol/adapter/sql/SqlFunctionScalarJsonValue +software/amazon/awssdk/http/auth/spi/signer/BaseSignRequest io/netty/util/concurrent/SingleThreadEventExecutor sun/security/ssl/PskKeyExchangeModesExtension$PskKeyExchangeModesProducer java/io/ObjectInputStream$GetField @@ -2620,7 +2632,6 @@ sun/security/ec/ECOperations java/io/ClassCache org/apache/http/impl/client/HttpClients java/nio/charset/CoderResult -software/amazon/awssdk/auth/signer/internal/AbstractAwsS3V4Signer software/amazon/awssdk/services/s3/model/MetadataCopier java/time/format/DateTimeTextProvider$1 software/amazon/awssdk/regions/servicemetadata/FrauddetectorServiceMetadata @@ -2763,7 +2774,6 @@ io/netty/util/internal/shaded/org/jctools/queues/atomic/MpscAtomicArrayQueueProd java/security/cert/PKIXCertPathChecker sun/security/ssl/CertStatusExtension$SHCertStatusReqV2Consumer io/netty/buffer/UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf -software/amazon/awssdk/auth/signer/internal/AbstractAws4Signer$CanonicalRequest java/io/BufferedReader sun/security/util/ByteArrayLexOrder sun/net/ext/ExtendedSocketOptions @@ -2793,6 +2803,7 @@ org/logicng/io/parsers/LogicNGPseudoBooleanParser org/antlr/v4/runtime/atn/ATNDeserializer$UnicodeDeserializer io/netty/handler/ssl/OpenSslServerContext org/antlr/v4/runtime/ANTLRErrorListener +software/amazon/awssdk/http/auth/spi/internal/signer/DefaultSignedRequest io/netty/channel/PendingBytesTracker$NoopPendingBytesTracker io/netty/handler/ssl/ReferenceCountedOpenSslEngine sun/security/ec/point/AffinePoint @@ -2816,6 +2827,7 @@ software/amazon/awssdk/regions/regionmetadata/UsGovEast1 java/lang/StackWalker$ExtendedOption com/exasol/swig/ConnectionInformationWrapper software/amazon/awssdk/services/s3/internal/handlers/EnableChunkedEncodingInterceptor +software/amazon/awssdk/awscore/internal/AwsProtocolMetadata$Builder sun/security/ssl/PreSharedKeyExtension$SHPreSharedKeyProducer com/exasol/adapter/document/documentfetcher/files/segmentation/SegmentMatcherFactory java/util/stream/MatchOps @@ -2833,14 +2845,13 @@ software/amazon/awssdk/services/s3/DefaultS3AsyncClientBuilder org/antlr/v4/runtime/atn/Transition software/amazon/awssdk/awscore/eventstream/EventStreamResponseHandler java/util/EnumSet -java/security/Provider$ServiceKey software/amazon/awssdk/regions/servicemetadata/ResourceGroupsServiceMetadata +java/security/Provider$ServiceKey software/amazon/awssdk/http/nio/netty/internal/NettyRequestExecutor$StreamedRequest software/amazon/awssdk/regions/servicemetadata/TextractServiceMetadata software/amazon/awssdk/regions/servicemetadata/OmicsServiceMetadata java/security/NoSuchAlgorithmException software/amazon/awssdk/core/interceptor/ExecutionAttributes -software/amazon/awssdk/auth/signer/params/Aws4SignerParams org/antlr/v4/runtime/misc/ParseCancellationException com/exasol/adapter/document/querypredicate/normalizer/LogicngToQueryPredicateConverter com/exasol/adapter/document/documentnode/DocumentNode @@ -2863,11 +2874,12 @@ software/amazon/awssdk/regions/servicemetadata/ApiPricingServiceMetadata software/amazon/awssdk/regions/servicemetadata/SnowballServiceMetadata com/exasol/adapter/document/mapping/TableMapping sun/security/ssl/RandomCookie -scala/Option$ software/amazon/awssdk/http/auth/spi/signer/SignerProperty +scala/Option$ software/amazon/awssdk/services/s3/model/GetObjectAttributesRequest software/amazon/awssdk/services/s3/model/S3Object$Builder scala/util/Left +software/amazon/awssdk/http/auth/spi/internal/signer/DefaultBaseSignRequest$BuilderImpl java/time/temporal/TemporalQueries$4 java/time/temporal/TemporalQueries$5 java/time/temporal/TemporalQueries$6 @@ -2875,6 +2887,7 @@ java/time/temporal/TemporalQueries$7 com/ctc/wstx/sr/InputProblemReporter java/time/temporal/TemporalQueries$1 java/time/temporal/TemporalQueries$2 +software/amazon/awssdk/http/auth/spi/internal/signer/DefaultSignRequest java/time/temporal/TemporalQueries$3 sun/security/ssl/ClientHello$T12ClientHelloConsumer java/io/Bits @@ -2883,8 +2896,8 @@ java/lang/invoke/MethodHandleImpl$AsVarargsCollector java/security/spec/ECPoint software/amazon/awssdk/services/s3/endpoints/internal/Literal$Obj software/amazon/awssdk/protocols/xml/internal/unmarshall/XmlUnmarshaller -java/lang/ThreadLocal$SuppliedThreadLocal software/amazon/awssdk/thirdparty/jackson/core/io/UTF8Writer +java/lang/ThreadLocal$SuppliedThreadLocal software/amazon/awssdk/services/s3/model/BucketAlreadyOwnedByYouException com/exasol/adapter/response/PushDownResponse$Builder org/antlr/v4/runtime/FailedPredicateException @@ -2924,8 +2937,8 @@ com/exasol/adapter/document/files/BinDistributor$Bin sun/nio/cs/UTF_8 com/exasol/adapter/document/files/RequestRateRetryIterator software/amazon/awssdk/profiles/ProfileFileSupplier -software/amazon/awssdk/core/sync/RequestBody org/codehaus/stax2/ri/typed/ValueDecoderFactory$FloatArrayDecoder +software/amazon/awssdk/core/sync/RequestBody software/amazon/awssdk/services/s3/model/ListObjectsV2Response$Builder software/amazon/awssdk/http/apache/internal/conn/ClientConnectionRequestFactory io/netty/channel/socket/nio/NioChannelOption @@ -2937,7 +2950,6 @@ software/amazon/awssdk/utils/ReflectionMethodInvoker java/util/BitSet com/exasol/adapter/document/files/FileTypeSpecificDocumentFetcher software/amazon/awssdk/services/s3/internal/handlers/SyncChecksumValidationInterceptor -software/amazon/awssdk/auth/signer/internal/ContentChecksum com/exasol/adapter/sql/SqlSelectList java/nio/channels/spi/AbstractSelector$1 software/amazon/awssdk/regions/servicemetadata/NetworkmanagerServiceMetadata @@ -3157,7 +3169,6 @@ com/exasol/sql/expression/literal/StringLiteral java/time/Month software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncApiCallMetricCollectionStage software/amazon/awssdk/core/internal/http/AmazonSyncHttpClient -software/amazon/awssdk/auth/signer/internal/FifoCache software/amazon/awssdk/core/client/handler/SyncClientHandler software/amazon/awssdk/core/ApiName com/exasol/ExaMetadata @@ -3193,6 +3204,7 @@ software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient org/slf4j/LoggerFactory org/glassfish/json/JsonObjectBuilderImpl software/amazon/awssdk/http/nio/netty/internal/utils/NettyUtils +software/amazon/awssdk/http/auth/aws/internal/signer/Checksummer sun/security/ssl/MaxFragExtension$EEMaxFragmentLengthProducer java/lang/NoSuchMethodException org/reactivestreams/Subscriber @@ -3212,6 +3224,7 @@ software/amazon/awssdk/thirdparty/jackson/core/util/BufferRecyclers javax/crypto/ShortBufferException java/lang/StrictMath software/amazon/awssdk/core/internal/http/loader/SdkServiceLoader +software/amazon/awssdk/checksums/DefaultChecksumAlgorithm$ChecksumAlgorithmsCache java/nio/file/FileSystems sun/text/normalizer/Trie2 com/ctc/wstx/evt/BaseStartElement @@ -3236,6 +3249,7 @@ com/sun/crypto/provider/TlsPrfGenerator java/util/stream/Sink org/logicng/explanations/mus/MUSConfig$Algorithm software/amazon/awssdk/services/s3/model/ListBucketAnalyticsConfigurationsRequest +software/amazon/awssdk/http/auth/aws/internal/signer/util/FifoCache software/amazon/awssdk/core/interceptor/ClasspathInterceptorChainFactory sun/security/ssl/HandshakeHash$T12HandshakeHash sun/security/util/DisabledAlgorithmConstraints$1 @@ -3306,11 +3320,13 @@ io/netty/util/internal/PlatformDependent org/apache/http/HttpResponse org/antlr/v4/runtime/tree/SyntaxTree software/amazon/awssdk/regions/servicemetadata/LicenseManagerUserSubscriptionsServiceMetadata +software/amazon/awssdk/http/auth/aws/internal/signer/CredentialScope sun/security/ssl/KeyShareExtension$SHKeyShareProducer software/amazon/awssdk/services/s3/endpoints/internal/Not io/netty/util/AttributeMap software/amazon/awssdk/services/s3/internal/settingproviders/UseArnRegionProvider org/apache/http/client/methods/HttpEntityEnclosingRequestBase +software/amazon/awssdk/identity/spi/IdentityProperty jdk/internal/module/ModuleBootstrap$2 software/amazon/awssdk/core/async/listener/SubscriberListener java/security/spec/RSAPrivateKeySpec @@ -3327,6 +3343,7 @@ java/lang/invoke/StringConcatFactory$Strategy software/amazon/awssdk/regions/servicemetadata/DataIotServiceMetadata java/util/UUID java/util/Collections$SynchronizedSet +software/amazon/awssdk/http/auth/aws/internal/signer/util/CredentialUtils sun/security/ssl/ContentType sun/security/ssl/Finished$T13FinishedConsumer io/netty/util/internal/SystemPropertyUtil @@ -3414,8 +3431,8 @@ java/net/URL$DefaultFactory software/amazon/awssdk/http/nio/netty/internal/nrs/HandlerPublisher$1 java/security/ProtectionDomain$JavaSecurityAccessImpl org/logicng/formulas/NAryOperator -jdk/internal/math/FloatingDecimal$1 software/amazon/awssdk/regions/regionmetadata/UsIsoEast1 +jdk/internal/math/FloatingDecimal$1 software/amazon/awssdk/awscore/AwsRequest$BuilderImpl io/netty/channel/ChannelFactory sun/security/provider/certpath/PKIXCertPathValidator @@ -3438,11 +3455,13 @@ java/util/ImmutableCollections$Set12$1 software/amazon/awssdk/awscore/client/handler/AwsSyncClientHandler org/apache/http/impl/HttpConnectionMetricsImpl sun/security/ec/XDHPublicKeyImpl +software/amazon/awssdk/checksums/DefaultChecksumAlgorithm org/apache/http/TokenIterator software/amazon/awssdk/thirdparty/jackson/core/io/DataOutputAsStream org/antlr/v4/runtime/atn/RuleStopState java/security/interfaces/ECKey sun/nio/fs/UnixFileAttributes +software/amazon/awssdk/core/interceptor/ExecutionAttribute$MappedValueStorage sun/security/ssl/BaseSSLSocketImpl software/amazon/awssdk/services/s3/endpoints/internal/Identifier sun/security/x509/CertificateX509Key @@ -3517,6 +3536,7 @@ sun/nio/fs/UnixFileStoreAttributes io/netty/util/HashingStrategy sun/security/ssl/CertSignAlgsExtension$CertSignatureSchemesStringizer org/apache/commons/logging/impl/WeakHashtable$WeakKey +software/amazon/awssdk/http/auth/aws/internal/signer/util/DigestAlgorithm java/security/BasicPermissionCollection software/amazon/awssdk/regions/servicemetadata/MghServiceMetadata software/amazon/awssdk/regions/servicemetadata/RekognitionServiceMetadata @@ -3787,6 +3807,7 @@ software/amazon/awssdk/identity/spi/internal/DefaultResolveIdentityRequest$Build sun/security/ssl/DHKeyExchange io/netty/channel/AdaptiveRecvByteBufAllocator$HandleImpl io/netty/util/concurrent/CompleteFuture +software/amazon/awssdk/awscore/internal/AwsServiceProtocol com/sun/crypto/provider/GaloisCounterMode org/codehaus/stax2/ri/evt/CharactersEventImpl io/netty/buffer/SizeClasses @@ -3808,11 +3829,13 @@ software/amazon/awssdk/profiles/ProfileFileLocation com/exasol/adapter/document/documentpath/DocumentPathIteratorFactory org/apache/http/impl/auth/SPNegoSchemeFactory sun/security/ssl/SSLConfiguration$CustomizedServerSignatureSchemes +software/amazon/awssdk/http/auth/spi/signer/BaseSignedRequest$Builder sun/security/ssl/SSLEngineImpl software/amazon/awssdk/regions/servicemetadata/NetworkFirewallServiceMetadata java/util/AbstractMap org/apache/http/impl/auth/HttpAuthenticator java/security/SignatureException +software/amazon/awssdk/http/auth/scheme/NoAuthAuthScheme com/exasol/datatype/type/Decimal jdk/internal/misc/JavaLangRefAccess java/util/stream/Stream @@ -3916,6 +3939,7 @@ org/apache/http/conn/ssl/SSLConnectionSocketFactory io/netty/handler/codec/http/HttpMethod io/netty/buffer/PoolSubpageMetric java/util/ImmutableCollections$Set12 +software/amazon/awssdk/services/s3/auth/scheme/internal/DefaultS3AuthSchemeProvider scala/Option software/amazon/awssdk/regions/servicemetadata/LakeformationServiceMetadata java/lang/invoke/MethodTypeForm @@ -3978,6 +4002,7 @@ org/apache/http/impl/client/HttpClientBuilder$2 com/ctc/wstx/io/WstxInputSource sun/nio/ch/SocketChannelImpl sun/security/ssl/CertStatusExtension$CertStatusRespStringizer +software/amazon/awssdk/http/auth/aws/internal/signer/DefaultAwsV4HttpSigner$1 org/codehaus/stax2/validation/XMLValidationSchema org/apache/http/client/methods/HttpRequestBase java/io/DataOutputStream @@ -4009,6 +4034,7 @@ sun/security/ec/ECKeyPairGenerator java/nio/channels/ClosedChannelException com/exasol/adapter/sql/SqlLiteralBool io/netty/handler/codec/http/HttpResponseStatus +software/amazon/awssdk/http/auth/aws/scheme/AwsV4AuthScheme software/amazon/awssdk/core/interceptor/Context$AfterMarshalling software/amazon/awssdk/thirdparty/jackson/core/json/ReaderBasedJsonParser sun/security/x509/AccessDescription @@ -4078,11 +4104,12 @@ jdk/internal/reflect/SerializationConstructorAccessorImpl jdk/internal/org/objectweb/asm/AnnotationVisitor java/util/concurrent/CancellationException software/amazon/awssdk/core/RequestOverrideConfiguration$Builder -software/amazon/awssdk/utils/internal/Base16Codec io/netty/channel/socket/nio/NioSocketChannel +software/amazon/awssdk/utils/internal/Base16Codec java/lang/RuntimeException software/amazon/awssdk/core/retry/conditions/RetryOnStatusCodeCondition software/amazon/awssdk/identity/spi/ResolveIdentityRequest$Builder +software/amazon/awssdk/http/auth/aws/internal/signer/util/SigningAlgorithm com/exasol/adapter/document/queryplanning/selectionextractor/SelectionMatcher sun/security/ssl/PskKeyExchangeModesExtension$PskKeyExchangeModesSpec java/nio/charset/spi/CharsetProvider @@ -4141,6 +4168,7 @@ io/netty/channel/CompleteChannelFuture sun/util/logging/internal/LoggingProviderImpl$LogManagerAccess sun/security/ssl/ClientHello$ClientHelloConsumer java/nio/file/OpenOption +software/amazon/awssdk/http/auth/spi/scheme/AuthScheme software/amazon/awssdk/http/nio/netty/NettySdkAsyncHttpService org/apache/http/conn/socket/ConnectionSocketFactory sun/security/provider/certpath/ldap/JdkLDAP$ProviderService @@ -4179,6 +4207,7 @@ org/apache/log4j/spi/RendererSupport com/exasol/datatype/type/Varchar software/amazon/awssdk/core/interceptor/Context$AfterUnmarshalling java/util/regex/Pattern$CharPropertyGreedy +software/amazon/awssdk/http/auth/aws/internal/signer/V4PayloadSigner sun/text/normalizer/Norm2AllModes$Norm2AllModesSingleton software/amazon/awssdk/regions/servicemetadata/IottwinmakerServiceMetadata jdk/internal/module/ServicesCatalog @@ -4228,9 +4257,7 @@ software/amazon/awssdk/core/client/config/ClientOverrideConfiguration$Builder software/amazon/awssdk/http/apache/internal/conn/ClientConnectionManagerFactory$DelegatingHttpClientConnectionManager java/util/regex/Pattern$Node software/amazon/awssdk/metrics/MetricPublisher -software/amazon/awssdk/core/async/AsyncRequestBody java/lang/Exception -software/amazon/awssdk/auth/signer/internal/chunkedencoding/AwsChunkSigner java/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser sun/security/util/math/intpoly/P521OrderField software/amazon/awssdk/thirdparty/jackson/core/json/JsonReadContext @@ -4265,6 +4292,7 @@ software/amazon/awssdk/services/s3/internal/handlers/DecodeUrlEncodedResponseInt org/antlr/v4/runtime/tree/RuleNode io/netty/channel/StacklessClosedChannelException java/util/Formatter +software/amazon/awssdk/http/auth/spi/signer/SignRequest$Builder io/netty/handler/codec/http/HttpHeaderValues java/util/concurrent/ConcurrentSkipListMap$Iter jdk/internal/reflect/MethodAccessorGenerator @@ -4324,7 +4352,6 @@ org/apache/http/protocol/HttpCoreContext java/lang/InstantiationError sun/security/ssl/KeyShareExtension$SHKeyShareConsumer sun/security/ssl/Authenticator$TLS10Authenticator -software/amazon/awssdk/auth/signer/internal/AbstractAwsSigner java/nio/file/DirectoryStream sun/text/normalizer/NormalizerBase$NFKCMode sun/security/ssl/SSLConfiguration$1 @@ -4388,6 +4415,7 @@ org/apache/http/conn/routing/RouteInfo$TunnelType sun/security/ssl/CertificateMessage$T12CertificateConsumer java/security/BasicPermission org/antlr/v4/runtime/atn/RangeTransition +software/amazon/awssdk/http/auth/aws/internal/signer/V4CanonicalRequest$Options com/exasol/adapter/document/documentfetcher/files/RemoteFile software/amazon/awssdk/awscore/endpoint/FipsEnabledProvider java/util/TreeMap$ValueIterator @@ -4412,6 +4440,7 @@ software/amazon/awssdk/services/s3/S3AsyncClientBuilder java/util/ServiceLoader org/apache/http/impl/io/IdentityOutputStream org/apache/http/client/methods/HttpGet +software/amazon/awssdk/identity/spi/AwsCredentialsIdentity$Builder jdk/internal/reflect/ClassDefiner$1 org/apache/http/conn/SchemePortResolver sun/security/x509/SubjectAlternativeNameExtension @@ -4472,7 +4501,6 @@ org/logicng/formulas/Constant io/netty/channel/DefaultChannelPipeline$PendingHandlerCallback io/netty/handler/ssl/JdkApplicationProtocolNegotiator sun/nio/fs/LinuxFileSystem -software/amazon/awssdk/core/internal/io/AwsChunkedInputStream io/netty/channel/nio/AbstractNioChannel$NioUnsafe sun/net/www/MessageHeader io/netty/channel/ChannelHandlerMask @@ -4518,6 +4546,7 @@ io/netty/handler/ssl/util/KeyManagerFactoryWrapper java/util/ImmutableCollections java/time/LocalTime$1 org/apache/http/impl/cookie/NetscapeDraftSpecProvider +software/amazon/awssdk/http/auth/aws/internal/signer/DefaultV4PayloadSigner java/io/DataInputStream sun/security/ssl/SSLContextImpl$CustomizedSSLProtocols scala/collection/IterableOnceOps @@ -4634,6 +4663,7 @@ software/amazon/awssdk/http/nio/netty/internal/SharedSdkEventLoopGroup$Reference sun/security/x509/GeneralNames sun/nio/fs/UnixFileAttributeViews$Basic org/antlr/v4/runtime/tree/ErrorNode +software/amazon/awssdk/http/auth/aws/internal/signer/DefaultV4RequestSigner java/util/JumboEnumSet$EnumSetIterator java/util/spi/TimeZoneNameProvider org/slf4j/jul/JDK14LoggerFactory @@ -4686,13 +4716,13 @@ org/apache/http/conn/routing/HttpRouteDirector java/util/concurrent/CompletableFuture$AltResult software/amazon/awssdk/utils/ConditionalDecorator sun/security/ssl/ECPointFormatsExtension$ECPointFormatsStringizer -software/amazon/awssdk/core/CredentialType$CredentialTypeCache software/amazon/awssdk/core/interceptor/ExecutionAttribute$DerivationValueStorage software/amazon/awssdk/http/nio/netty/internal/ResponseHandler$OnCancelSubscription org/apache/log4j/CategoryKey java/time/format/DateTimeParseContext sun/nio/ch/OptionKey software/amazon/awssdk/core/internal/http/pipeline/stages/ExecutionFailureExceptionReportingStage +software/amazon/awssdk/http/auth/spi/internal/signer/DefaultSignRequest$BuilderImpl java/io/Flushable sun/invoke/util/VerifyAccess software/amazon/awssdk/regions/servicemetadata/ElasticfilesystemServiceMetadata @@ -4745,7 +4775,6 @@ io/netty/handler/timeout/WriteTimeoutException sun/util/locale/provider/BaseLocaleDataMetaInfo io/netty/channel/ChannelOutboundHandlerAdapter org/apache/http/cookie/Cookie -software/amazon/awssdk/auth/signer/params/AwsS3V4SignerParams$BuilderImpl jdk/internal/ref/CleanerImpl scala/collection/immutable/StrictOptimizedSeqOps java/util/stream/SortedOps$OfRef @@ -4899,6 +4928,7 @@ java/util/concurrent/atomic/Striped64$1 sun/security/ssl/CertStatusExtension$CTCertStatusResponseConsumer com/exasol/sql/ColumnsDefinition sun/security/ssl/ServerNameExtension$SHServerNamesSpec +software/amazon/awssdk/http/auth/aws/internal/scheme/DefaultAwsV4AuthScheme java/util/regex/Pattern$Ques java/io/BufferedInputStream java/util/Arrays$ArrayItr @@ -4930,9 +4960,9 @@ io/netty/util/concurrent/ProgressiveFuture software/amazon/awssdk/protocols/xml/internal/marshall/XmlProtocolMarshaller$Builder io/netty/channel/Channel$Unsafe sun/security/pkcs/PKCS8Key -sun/security/provider/SHA2$SHA256 org/apache/http/client/methods/HttpPut java/util/Date +sun/security/provider/SHA2$SHA256 io/netty/channel/ChannelHandler java/lang/module/ModuleDescriptor jdk/internal/loader/URLClassPath$JarLoader$1 @@ -5003,7 +5033,6 @@ sun/security/ssl/ChangeCipherSpec$T13ChangeCipherSpecConsumer java/security/CodeSource java/nio/channels/FileChannel io/netty/channel/DefaultChannelPipeline$TailContext -software/amazon/awssdk/auth/signer/params/Aws4SignerParams$BuilderImpl io/netty/channel/MessageSizeEstimator$Handle com/exasol/adapter/document/mapping/ColumnValueExtractorException java/time/temporal/TemporalAdjuster @@ -5142,6 +5171,7 @@ org/apache/http/client/methods/HttpPost io/netty/util/internal/shaded/org/jctools/queues/QueueProgressIndicators software/amazon/awssdk/http/TlsTrustManagersProvider software/amazon/awssdk/core/document/Document +software/amazon/awssdk/checksums/spi/ChecksumAlgorithm com/exasol/adapter/document/documentfetcher/files/segmentation/FileSegmentDescription sun/security/ssl/SSLCipher$T10BlockReadCipherGenerator software/amazon/awssdk/regions/servicemetadata/GlueServiceMetadata @@ -5211,6 +5241,7 @@ sun/security/ssl/CertStatusExtension$CHCertStatusReqV2Consumer com/exasol/adapter/document/documentfetcher/files/randomaccessinputstream/RandomAccessInputStreamCache sun/security/ssl/Authenticator software/amazon/awssdk/services/s3/internal/handlers/GetObjectInterceptor +software/amazon/awssdk/http/auth/aws/internal/signer/V4Properties$Builder org/antlr/v4/runtime/atn/NotSetTransition software/amazon/awssdk/regions/regionmetadata/MeSouth1 sun/security/ssl/SSLPossessionGenerator @@ -5251,6 +5282,7 @@ java/util/stream/StreamSupport javax/crypto/NullCipher io/netty/handler/codec/http/DefaultHttpHeaders sun/text/normalizer/Norm2AllModes$NFKCSingleton +software/amazon/awssdk/http/auth/aws/internal/signer/util/SignerKey com/ctc/wstx/util/StringUtil software/amazon/awssdk/regions/servicemetadata/StreamsDynamodbServiceMetadata sun/security/ssl/XDHKeyExchange$1 @@ -5288,7 +5320,9 @@ com/exasol/adapter/sql/SqlPredicateEqual software/amazon/awssdk/regions/servicemetadata/EcsServiceMetadata org/apache/http/impl/auth/BasicSchemeFactory java/nio/charset/IllegalCharsetNameException +software/amazon/awssdk/core/SdkProtocolMetadata io/netty/handler/ssl/SslUtils +software/amazon/awssdk/http/auth/spi/internal/signer/DefaultBaseSignedRequest sun/security/ssl/CookieExtension$CHCookieConsumer software/amazon/awssdk/services/s3/model/S3Exception$Builder org/logicng/cardinalityconstraints/CCAtMostK @@ -5313,7 +5347,6 @@ sun/security/ssl/ExtendedMasterSecretExtension$ExtendedMasterSecretSpec org/glassfish/json/BufferPoolImpl sun/security/ssl/CertificateMessage$T12CertificateMessage sun/invoke/util/Wrapper$Format -software/amazon/awssdk/auth/credentials/AwsSessionCredentials software/amazon/awssdk/regions/servicemetadata/ClouddirectoryServiceMetadata com/exasol/adapter/document/files/S3ObjectDescription java/lang/reflect/Member @@ -5331,6 +5364,7 @@ sun/security/ssl/SSLEngineInputRecord sun/util/locale/provider/LocaleServiceProviderPool java/nio/file/spi/FileSystemProvider java/lang/WeakPairMap$Pair$Weak$1 +software/amazon/awssdk/http/auth/spi/signer/SignRequest sun/security/ssl/CertificateRequest$T13CertificateRequestConsumer com/exasol/adapter/document/UdfCountCalculator software/amazon/awssdk/http/SdkHttpService @@ -5339,6 +5373,7 @@ com/exasol/adapter/document/documentfetcher/files/JsonDocumentFetcher software/amazon/awssdk/regions/servicemetadata/RuntimeV2LexServiceMetadata sun/security/ssl/CertStatusExtension$SHCertStatusReqV2Producer software/amazon/awssdk/http/nio/netty/internal/RequestContext +software/amazon/awssdk/core/interceptor/ExecutionAttribute$MappedAttributeBuilder java/lang/invoke/Invokers$Holder java/security/Security$1 software/amazon/awssdk/http/apache/ApacheHttpClient$Builder @@ -5461,7 +5496,6 @@ java/security/spec/X509EncodedKeySpec io/netty/channel/nio/SelectedSelectionKeySetSelector software/amazon/awssdk/http/apache/ApacheHttpClient$DefaultBuilder sun/security/ssl/Plaintext -software/amazon/awssdk/core/signer/AsyncRequestBodySigner java/io/StringWriter java/util/Collections$SingletonSet java/lang/invoke/ClassSpecializer$1 @@ -5507,6 +5541,7 @@ software/amazon/awssdk/http/nio/netty/internal/SharedSdkEventLoopGroup sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream com/exasol/adapter/sql/Predicate java/nio/channels/spi/AbstractInterruptibleChannel +software/amazon/awssdk/http/auth/scheme/NoAuthAuthScheme$AnonymousIdentity com/exasol/adapter/capabilities/Capabilities$Builder java/util/concurrent/atomic/AtomicReferenceArray java/lang/AutoCloseable @@ -5522,7 +5557,6 @@ com/exasol/adapter/document/files/stringfilter/wildcardexpression/renderer/regex org/logicng/formulas/Literal java/lang/reflect/GenericDeclaration software/amazon/awssdk/services/s3/model/S3Request$BuilderImpl -software/amazon/awssdk/core/signer/AsyncSigner sun/text/normalizer/Norm2AllModes$DecomposeNormalizer2 io/netty/channel/ChannelOutboundBuffer$1 jdk/internal/loader/BuiltinClassLoader$5 @@ -5538,8 +5572,8 @@ io/netty/util/internal/PlatformDependent$4 java/time/temporal/IsoFields$Field$3 java/security/Provider$Service java/time/temporal/IsoFields$Field$2 -software/amazon/awssdk/utils/internal/CodecUtils scala/Function1 +software/amazon/awssdk/utils/internal/CodecUtils sun/text/normalizer/CharTrie java/time/temporal/IsoFields$Field$1 software/amazon/awssdk/auth/token/credentials/SdkTokenProvider @@ -5555,7 +5589,6 @@ software/amazon/awssdk/regions/servicemetadata/FinspaceApiServiceMetadata sun/security/ssl/ExtendedMasterSecretExtension$SHExtendedMasterSecretConsumer sun/nio/ch/NativeDispatcher sun/nio/cs/UTF_32BE -software/amazon/awssdk/auth/signer/internal/AbstractAws4Signer software/amazon/awssdk/thirdparty/jackson/core/JsonProcessingException org/logicng/solvers/sat/GlucoseConfig$Builder sun/security/util/math/intpoly/IntegerPolynomial @@ -5732,6 +5765,7 @@ io/netty/buffer/AbstractByteBufAllocator$1 software/amazon/awssdk/services/s3/endpoints/internal/GetAttr$Builder software/amazon/awssdk/regions/servicemetadata/EvidentlyServiceMetadata software/amazon/awssdk/services/s3/model/GetBucketAccelerateConfigurationRequest +software/amazon/awssdk/services/s3/auth/scheme/internal/DefaultS3AuthSchemeParams jdk/internal/loader/ClassLoaders$AppClassLoader java/security/Permission java/util/logging/LogManager$LoggerWeakRef @@ -5769,7 +5803,6 @@ java/util/logging/LogManager$1 io/netty/channel/DefaultMessageSizeEstimator java/lang/InheritableThreadLocal javax/net/ssl/KeyManager -software/amazon/awssdk/awscore/internal/authcontext/AwsCredentialsAuthorizationStrategy io/netty/util/internal/shaded/org/jctools/queues/atomic/MpscAtomicArrayQueueL2Pad java/io/FileOutputStream java/security/KeyFactory @@ -5824,8 +5857,8 @@ sun/security/ssl/SSLCipher$T12GcmWriteCipherGenerator io/netty/util/internal/shaded/org/jctools/queues/BaseLinkedQueuePad2 io/netty/handler/codec/HeadersUtils$StringEntry org/apache/http/impl/client/BasicCredentialsProvider -io/netty/util/internal/shaded/org/jctools/queues/BaseLinkedQueuePad0 sun/security/jgss/SunProvider$1 +io/netty/util/internal/shaded/org/jctools/queues/BaseLinkedQueuePad0 io/netty/util/internal/shaded/org/jctools/queues/BaseLinkedQueuePad1 io/netty/util/internal/PlatformDependent0$3 org/antlr/v4/runtime/CommonTokenFactory @@ -5860,6 +5893,7 @@ software/amazon/awssdk/core/client/handler/ClientExecutionParams software/amazon/awssdk/core/util/SdkAutoConstructList io/netty/channel/ConnectTimeoutException java/util/concurrent/ConcurrentHashMap$ValuesView +software/amazon/awssdk/http/auth/spi/internal/signer/DefaultBaseSignRequest com/exasol/adapter/capabilities/MainCapability com/exasol/ExaMetadataImpl$ColumnInfo java/util/Collections$3 @@ -5870,7 +5904,6 @@ java/lang/module/ModuleReference sun/security/ssl/ServerHelloDone io/netty/channel/SingleThreadEventLoop sun/security/ssl/KeyShareExtension$CHKeyShareStringizer -software/amazon/awssdk/auth/signer/internal/SigningAlgorithm$MacThreadLocal sun/security/x509/KeyIdentifier software/amazon/awssdk/services/s3/model/ListObjectsV2Response javax/crypto/KeyGenerator @@ -5913,7 +5946,6 @@ jakarta/json/JsonPatch java/io/ObjectInputStream$BlockDataInputStream org/antlr/v4/runtime/RecognitionException java/util/Random -software/amazon/awssdk/auth/signer/params/Aws4PresignerParams software/amazon/awssdk/awscore/exception/AwsServiceException software/amazon/awssdk/core/http/ExecutionContext org/logicng/solvers/maxsat/algorithms/MaxSATConfig$SolverType @@ -5929,6 +5961,7 @@ software/amazon/awssdk/regions/regionmetadata/ApSoutheast1 software/amazon/awssdk/awscore/AwsRequestOverrideConfiguration$BuilderImpl java/time/chrono/ChronoZonedDateTime software/amazon/awssdk/regions/servicemetadata/MonitoringServiceMetadata +software/amazon/awssdk/http/auth/spi/internal/signer/DefaultSignedRequest$BuilderImpl org/glassfish/json/JsonParserImpl software/amazon/awssdk/core/internal/SdkInternalTestAdvancedClientOption sun/nio/cs/StreamDecoder @@ -5953,6 +5986,7 @@ jdk/internal/ref/CleanerFactory sun/security/ssl/CertificateRequest$T10CertificateRequestConsumer software/amazon/awssdk/http/async/AsyncExecuteRequest$BuilderImpl java/lang/AssertionError +software/amazon/awssdk/http/auth/internal/scheme/DefaultNoAuthAuthScheme java/util/regex/Pattern$Branch java/security/SecureRandomSpi org/codehaus/stax2/ri/typed/ValueDecoderFactory$DecoderBase diff --git a/src/test/java/com/exasol/adapter/document/files/IntegrationTestSetup.java b/src/test/java/com/exasol/adapter/document/files/IntegrationTestSetup.java index ac0765fe..af70e187 100644 --- a/src/test/java/com/exasol/adapter/document/files/IntegrationTestSetup.java +++ b/src/test/java/com/exasol/adapter/document/files/IntegrationTestSetup.java @@ -28,7 +28,7 @@ public class IntegrationTestSetup implements AutoCloseable { public static final Path CLOUD_SETUP_CONFIG = Path.of("cloudSetup/generated/testConfig.json"); - public static final String ADAPTER_JAR = "document-files-virtual-schema-dist-7.3.6-s3-2.8.2.jar"; + public static final String ADAPTER_JAR = "document-files-virtual-schema-dist-7.3.6-s3-2.8.3.jar"; public static final Path ADAPTER_JAR_LOCAL_PATH = Path.of("target", ADAPTER_JAR); public final String s3BucketName; private final ExasolTestSetup exasolTestSetup = new ExasolTestSetupFactory(CLOUD_SETUP_CONFIG).getTestSetup(); diff --git a/src/test/java/com/exasol/adapter/document/files/S3DocumentFilesAdapterIT.java b/src/test/java/com/exasol/adapter/document/files/S3DocumentFilesAdapterIT.java index 333a33d2..772c47c5 100644 --- a/src/test/java/com/exasol/adapter/document/files/S3DocumentFilesAdapterIT.java +++ b/src/test/java/com/exasol/adapter/document/files/S3DocumentFilesAdapterIT.java @@ -5,6 +5,7 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.*; import java.nio.charset.StandardCharsets; @@ -17,8 +18,10 @@ import java.util.logging.Logger; import java.util.regex.Pattern; +import org.hamcrest.Matcher; import org.hamcrest.MatcherAssert; import org.junit.jupiter.api.*; +import org.junit.jupiter.api.function.Executable; import org.testcontainers.junit.jupiter.Testcontainers; import com.exasol.adapter.document.edml.*; @@ -228,4 +231,81 @@ private void createBucketIfNotExists(final String bucketName) { // ignore } } + + // The following tests fail for Exasol 8. They will be fixed in + // https://github.com/exasol/s3-document-files-virtual-schema/issues/140 + @Test + @Override + void testReadCsvWithTypesWithHeader() throws IOException, SQLException { + if (isExasol8()) { + assertSqlException(super::testReadCsvWithTypesWithHeader, containsString( + "Data type mismatch in column number 7 (1-indexed).Expected TIMESTAMP(3) WITH LOCAL TIME ZONE, but got TIMESTAMP(3).")); + } else { + super.testReadCsvWithTypesWithHeader(); + } + } + + @Test + @Override + void testLoadRandomCsvFile() throws Exception { + if (isExasol8()) { + assertSqlException(super::testLoadRandomCsvFile, containsString( + "Data type mismatch in column number 6 (1-indexed).Expected TIMESTAMP(3) WITH LOCAL TIME ZONE, but got TIMESTAMP(3).")); + } else { + super.testLoadRandomCsvFile(); + } + } + + @Test + @Override + void testReadCsvWithTypesWithoutHeader() throws IOException, SQLException { + if (isExasol8()) { + assertSqlException(super::testReadCsvWithTypesWithoutHeader, containsString( + "Data type mismatch in column number 7 (1-indexed).Expected TIMESTAMP(3) WITH LOCAL TIME ZONE, but got TIMESTAMP(3).")); + } else { + super.testReadCsvWithTypesWithoutHeader(); + } + } + + @Test + @Override + void testReadParquetFile() throws IOException, SQLException { + if (isExasol8()) { + assertSqlException(super::testReadParquetFile, containsString( + "Data type mismatch in column number 5 (1-indexed).Expected TIMESTAMP(3) WITH LOCAL TIME ZONE, but got TIMESTAMP(3).")); + } else { + super.testReadParquetFile(); + } + } + + @Test + @Override + void testReadParquetFileWithAutomaticInference() throws IOException, SQLException { + if (isExasol8()) { + assertSqlException(super::testReadParquetFileWithAutomaticInference, containsString( + "Data type mismatch in column number 5 (1-indexed).Expected TIMESTAMP(3) WITH LOCAL TIME ZONE, but got TIMESTAMP(3).")); + } else { + super.testReadParquetFileWithAutomaticInference(); + } + } + + private void assertSqlException(final Executable executable, final Matcher exceptionMatcher) { + final SQLException exception = assertThrows(SQLException.class, executable); + assertThat(exception.getMessage(), exceptionMatcher); + } + + private boolean isExasol8() { + return getExasolMajorVersion().equals("8"); + } + + private static String getExasolMajorVersion() { + try (Statement stmt = SETUP.getConnection().createStatement()) { + final ResultSet result = stmt + .executeQuery("SELECT PARAM_VALUE FROM SYS.EXA_METADATA WHERE PARAM_NAME='databaseMajorVersion'"); + assertTrue(result.next(), "no result"); + return result.getString(1); + } catch (final SQLException exception) { + throw new IllegalStateException("Failed to query Exasol version: " + exception.getMessage(), exception); + } + } } diff --git a/src/test/java/com/exasol/adapter/document/files/extension/ExtensionIT.java b/src/test/java/com/exasol/adapter/document/files/extension/ExtensionIT.java index 3acaa9ab..9ad7f64a 100644 --- a/src/test/java/com/exasol/adapter/document/files/extension/ExtensionIT.java +++ b/src/test/java/com/exasol/adapter/document/files/extension/ExtensionIT.java @@ -3,12 +3,9 @@ import static com.exasol.matcher.ResultSetStructureMatcher.table; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import java.io.FileNotFoundException; import java.net.InetSocketAddress; -import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; import java.sql.ResultSet; @@ -25,7 +22,6 @@ import com.exasol.adapter.document.edml.serializer.EdmlSerializer; import com.exasol.adapter.document.files.IntegrationTestSetup; import com.exasol.adapter.document.files.s3testsetup.AwsS3TestSetup; -import com.exasol.adapter.document.files.s3testsetup.S3TestSetup; import com.exasol.bucketfs.BucketAccessException; import com.exasol.dbbuilder.dialects.exasol.AdapterScript.Language; import com.exasol.dbbuilder.dialects.exasol.ExasolSchema; @@ -33,29 +29,54 @@ import com.exasol.dbbuilder.dialects.exasol.udf.UdfScript.InputType; import com.exasol.exasoltestsetup.ExasolTestSetup; import com.exasol.exasoltestsetup.ExasolTestSetupFactory; -import com.exasol.extensionmanager.client.model.*; -import com.exasol.extensionmanager.itest.*; +import com.exasol.extensionmanager.client.model.ParameterValue; +import com.exasol.extensionmanager.itest.ExasolVersionCheck; +import com.exasol.extensionmanager.itest.ExtensionManagerSetup; +import com.exasol.extensionmanager.itest.base.AbstractVirtualSchemaExtensionIT; +import com.exasol.extensionmanager.itest.base.ExtensionITConfig; import com.exasol.extensionmanager.itest.builder.ExtensionBuilder; import com.exasol.mavenprojectversiongetter.MavenProjectVersionGetter; import software.amazon.awssdk.core.sync.RequestBody; -class ExtensionIT { - private static final String PREVIOUS_VERSION = "2.8.1"; - private static final String PREVIOUS_VERSION_JAR_FILE = "document-files-virtual-schema-dist-7.3.4-s3-" - + PREVIOUS_VERSION + ".jar"; +class ExtensionIT extends AbstractVirtualSchemaExtensionIT { private static final Path EXTENSION_SOURCE_DIR = Paths.get("extension").toAbsolutePath(); - private static final String EXTENSION_ID = "s3-vs-extension.js"; - private static final int EXPECTED_PARAMETER_COUNT = 10; private static final String PROJECT_VERSION = MavenProjectVersionGetter.getCurrentProjectVersion(); + private static final String EXTENSION_ID = "s3-vs-extension.js"; + private static final String MAPPING_DESTINATION_TABLE = "DESTINATION_TABLE"; + private static ExasolTestSetup exasolTestSetup; private static ExtensionManagerSetup setup; - private static S3TestSetup s3TestSetup; + private static AwsS3TestSetup s3TestSetup; private static String s3BucketName; + private String s3ImportPrefix; + + @BeforeEach + void createS3ImportPrefix() { + s3ImportPrefix = "vs-works-test-" + System.currentTimeMillis() + "/"; + } + + @Override + protected ExtensionITConfig createConfig() { + final String previousVersion = "2.8.2"; + return ExtensionITConfig.builder().projectName("s3-document-files-virtual-schema") // + .extensionId(EXTENSION_ID) // + .currentVersion(PROJECT_VERSION) // + .expectedParameterCount(13) // + .extensionName("S3 Virtual Schema") // + .extensionDescription("Virtual Schema for document files on AWS S3") // + .previousVersion(previousVersion) // + .previousVersionJarFile("document-files-virtual-schema-dist-7.3.6-s3-" + previousVersion + ".jar") + .build(); + } @BeforeAll static void setup() throws FileNotFoundException, BucketAccessException, TimeoutException { + if (System.getProperty("com.exasol.dockerdb.image") == null) { + System.setProperty("com.exasol.dockerdb.image", "8.23.0"); + } exasolTestSetup = new ExasolTestSetupFactory(IntegrationTestSetup.CLOUD_SETUP_CONFIG).getTestSetup(); + ExasolVersionCheck.assumeExasolVersion8(exasolTestSetup); setup = ExtensionManagerSetup.create(exasolTestSetup, ExtensionBuilder.createDefaultNpmBuilder( EXTENSION_SOURCE_DIR, EXTENSION_SOURCE_DIR.resolve("dist").resolve(EXTENSION_ID))); s3TestSetup = new AwsS3TestSetup(); @@ -65,213 +86,58 @@ static void setup() throws FileNotFoundException, BucketAccessException, Timeout IntegrationTestSetup.ADAPTER_JAR); } - @AfterAll - static void teardown() throws Exception { - if (s3TestSetup != null) { - s3TestSetup.emptyS3Bucket(s3BucketName); - s3TestSetup.deleteBucket(s3BucketName); - } - if (setup != null) { - setup.close(); - } - // do not delete ADAPTER_JAR as it is required by other integration tests, too - // and upload immediately after delete fails. - exasolTestSetup.close(); - } - - @AfterEach - void cleanup() { - setup.cleanup(); - } - - @Test - void listExtensions() { - final List extensions = setup.client().getExtensions(); - assertAll(() -> assertThat(extensions, hasSize(1)), // - () -> assertThat(extensions.get(0).getName(), equalTo("S3 Virtual Schema")), - () -> assertThat(extensions.get(0).getInstallableVersions().get(0).getName(), equalTo(PROJECT_VERSION)), - () -> assertThat(extensions.get(0).getInstallableVersions().get(0).isLatest(), is(true)), - () -> assertThat(extensions.get(0).getInstallableVersions().get(0).isDeprecated(), is(false)), - () -> assertThat(extensions.get(0).getDescription(), - equalTo("Virtual Schema for document files on AWS S3"))); - } - - @Test - void listInstallationsEmpty() { - final List installations = setup.client().getInstallations(); - assertThat(installations, hasSize(0)); - } - - @Test - void listInstallations_ignoresWrongScriptNames() { - createAdapter("wrong_adapter_name", "wrong_import_script_name"); - final List installations = setup.client().getInstallations(); - assertThat(installations, hasSize(0)); - } - - @Test - void listInstallations_findsMatchingScripts() { - createAdapter("S3_FILES_ADAPTER", "IMPORT_FROM_S3_DOCUMENT_FILES"); - final List installations = setup.client().getInstallations(); - assertAll(() -> assertThat(installations, hasSize(1)), // - () -> assertThat(installations.get(0).getName(), - equalTo(ExtensionManagerSetup.EXTENSION_SCHEMA_NAME + ".S3_FILES_ADAPTER")), - () -> assertThat(installations.get(0).getVersion(), equalTo(PROJECT_VERSION))); - } - - @Test - void listInstallations_findsOwnInstallation() { - setup.client().install(); - final List installations = setup.client().getInstallations(); - assertAll(() -> assertThat(installations, hasSize(1)), // - () -> assertThat(installations.get(0).getName(), - equalTo(ExtensionManagerSetup.EXTENSION_SCHEMA_NAME + ".S3_FILES_ADAPTER")), - () -> assertThat(installations.get(0).getVersion(), equalTo(PROJECT_VERSION))); - } - - @Test - void getExtensionDetailsFailsForUnknownVersion() { - setup.client().assertRequestFails(() -> setup.client().getExtensionDetails("unknownVersion"), - equalTo("Version 'unknownVersion' not supported, can only use '" + PROJECT_VERSION + "'."), - equalTo(404)); - } - - @Test - void getExtensionDetailsSuccess() { - final ExtensionDetailsResponse extensionDetails = setup.client().getExtensionDetails(PROJECT_VERSION); - final List parameters = extensionDetails.getParameterDefinitions(); - final ParamDefinition param1 = new ParamDefinition().id("virtualSchemaName") - .name("Name of the new virtual schema").definition(Map.of("id", "virtualSchemaName", "name", - "Name of the new virtual schema", "required", true, "scope", "general", "type", "string")); - assertAll(() -> assertThat(extensionDetails.getId(), equalTo("s3-vs-extension.js")), - () -> assertThat(extensionDetails.getVersion(), equalTo(PROJECT_VERSION)), - () -> assertThat(parameters, hasSize(EXPECTED_PARAMETER_COUNT)), - () -> assertThat(parameters.get(0), equalTo(param1))); - } - - @Test - void install_createsScripts() { - setup.client().install(); - assertScriptsExist(); - } - - @Test - void install_worksIfCalledTwice() { - setup.client().install(); - setup.client().install(); - assertScriptsExist(); + @Override + protected ExtensionManagerSetup getSetup() { + return setup; } - @Test - void install_failsForUnsupportedVersion() { - final ExtensionManagerClient client = setup.client(); - client.assertRequestFails(() -> client.install("unsupported"), - equalTo("Installing version 'unsupported' not supported, try '" + PROJECT_VERSION + "'."), - equalTo(400)); - setup.exasolMetadata().assertNoScripts(); - } - - @Test - void createInstanceFailsWithoutRequiredParameters() { - final ExtensionManagerClient client = setup.client(); - client.install(); - client.assertRequestFails(() -> client.createInstance(List.of()), startsWith( - "invalid parameters: Failed to validate parameter 'Name of the new virtual schema': This is a required parameter."), - equalTo(400)); - } - - @Test - void uninstall_failsForUnknownVersion() { - setup.client().assertRequestFails(() -> setup.client().uninstall("unknownVersion"), - equalTo("Uninstalling version 'unknownVersion' not supported, try '" + PROJECT_VERSION + "'."), - equalTo(400)); - } - - @Test - void uninstall_succeedsForNonExistingInstallation() { - assertDoesNotThrow(() -> setup.client().uninstall()); - } - - @Test - void uninstall_removesAdapters() { - setup.client().install(); - assertAll(() -> assertScriptsExist(), // - () -> assertThat(setup.client().getInstallations(), hasSize(1))); - setup.client().uninstall(PROJECT_VERSION); - assertAll(() -> assertThat(setup.client().getInstallations(), is(empty())), - () -> setup.exasolMetadata().assertNoScripts()); - } - - @Test - void upgradeFailsWhenNotInstalled() { - setup.client().assertRequestFails(() -> setup.client().upgrade(), - "extension is not installed, the following scripts are missing: S3_FILES_ADAPTER, IMPORT_FROM_S3_DOCUMENT_FILES", - 404); - } - - @Test - void upgradeFailsWhenAlreadyUpToDate() { - setup.client().install(); - setup.client().assertRequestFails(() -> setup.client().upgrade(), - "Extension is already installed in latest version " + PROJECT_VERSION, 412); - } - - @Test - void upgradeFromPreviousVersion() throws InterruptedException, BucketAccessException, TimeoutException, - FileNotFoundException, URISyntaxException { - final PreviousExtensionVersion previousVersion = createPreviousVersion(); - previousVersion.prepare(); - previousVersion.install(); - final String virtualTable = createVirtualSchema(previousVersion.getExtensionId(), PREVIOUS_VERSION); - verifyVirtualTableContainsData(virtualTable); - assertInstalledVersion("EXA_EXTENSIONS.S3_FILES_ADAPTER", PREVIOUS_VERSION, previousVersion); - previousVersion.upgrade(); - assertInstalledVersion("EXA_EXTENSIONS.S3_FILES_ADAPTER", PROJECT_VERSION, previousVersion); - verifyVirtualTableContainsData(virtualTable); - } - - private PreviousExtensionVersion createPreviousVersion() { - return setup.previousVersionManager().newVersion().currentVersion(PROJECT_VERSION) // - .previousVersion(PREVIOUS_VERSION) // - .adapterFileName(PREVIOUS_VERSION_JAR_FILE) // - .extensionFileName(EXTENSION_ID) // - .project("s3-document-files-virtual-schema") // + @Override + protected void createScripts() { + final String adapterJarBucketFsPath = "/buckets/bfsdefault/default/" + + IntegrationTestSetup.ADAPTER_JAR_LOCAL_PATH.getFileName().toString(); + final ExasolSchema schema = setup.createExtensionSchema(); + schema.createAdapterScriptBuilder("S3_FILES_ADAPTER") + .bucketFsContent("com.exasol.adapter.RequestDispatcher", adapterJarBucketFsPath).language(Language.JAVA) .build(); + schema.createUdfBuilder("IMPORT_FROM_S3_DOCUMENT_FILES").language(UdfScript.Language.JAVA) + .inputType(InputType.SET) + .parameter(GenericUdfCallHandler.PARAMETER_DOCUMENT_FETCHER, "VARCHAR(2000000)") + .parameter(GenericUdfCallHandler.PARAMETER_SCHEMA_MAPPING_REQUEST, "VARCHAR(2000000)") + .parameter(GenericUdfCallHandler.PARAMETER_CONNECTION_NAME, "VARCHAR(500)").emits() + .bucketFsContent(UdfEntryPoint.class.getName(), adapterJarBucketFsPath).build(); } - private void assertInstalledVersion(final String expectedName, final String expectedVersion, - final PreviousExtensionVersion previousVersion) { - // The extension is installed twice (previous and current version), so each one returns one installation. - assertThat(setup.client().getInstallations(), - containsInAnyOrder( - new InstallationsResponseInstallation().name(expectedName).version(expectedVersion) - .id(EXTENSION_ID), // - new InstallationsResponseInstallation().name(expectedName).version(expectedVersion) - .id(previousVersion.getExtensionId()))); + @Override + protected void assertScriptsExist() { + final String jarDirective = "%jar /buckets/bfsdefault/default/" + IntegrationTestSetup.ADAPTER_JAR + ";"; + final String comment = "Created by Extension Manager for S3 Virtual Schema " + PROJECT_VERSION; + setup.exasolMetadata() + .assertScript(table() + .row("IMPORT_FROM_S3_DOCUMENT_FILES", "UDF", "SET", "EMITS", + allOf(containsString("%scriptclass " + UdfEntryPoint.class.getName() + ";"), // + containsString(jarDirective)), + comment) // + .row("S3_FILES_ADAPTER", "ADAPTER", null, null, + allOf(containsString("%scriptclass " + RequestDispatcher.class.getName() + ";"), // + containsString(jarDirective)), + comment) // + .matches()); } - @Test - void virtualSchemaWorks() throws SQLException { - setup.client().install(); - final String virtualTable = createVirtualSchema(); - verifyVirtualTableContainsData(virtualTable); - } + @Override + protected void prepareInstance() { + upload(s3ImportPrefix + "test-data-1.json", "{\"id\": 1, \"name\": \"abc\" }"); + upload(s3ImportPrefix + "test-data-2.json", "{\"id\": 2, \"name\": \"xyz\" }"); - private String createVirtualSchema() { - return createVirtualSchema(EXTENSION_ID, PROJECT_VERSION); } - private String createVirtualSchema(final String extensionId, final String extensionVersion) { - final String prefix = "vs-works-test-" + System.currentTimeMillis() + "/"; - upload(prefix + "test-data-1.json", "{\"id\": 1, \"name\": \"abc\" }"); - upload(prefix + "test-data-2.json", "{\"id\": 2, \"name\": \"xyz\" }"); - final String virtualSchemaName = "MY_VS"; - final EdmlDefinition mappingDefinition = getMappingDefinition(prefix + "test-data-*.json"); - createInstance(extensionId, extensionVersion, virtualSchemaName, mappingDefinition); - return virtualSchemaName + "." + mappingDefinition.getDestinationTable(); + private void upload(final String key, final String content) { + s3TestSetup.upload(s3BucketName, key, RequestBody.fromString(content)); } - private void verifyVirtualTableContainsData(final String virtualTable) { + @Override + protected void assertVirtualSchemaContent(final String virtualSchemaName) { + final String virtualTable = "\"" + virtualSchemaName + "\".\"" + MAPPING_DESTINATION_TABLE + "\""; try (final ResultSet result = exasolTestSetup.createConnection().createStatement() .executeQuery("SELECT ID, NAME FROM " + virtualTable + " ORDER BY ID ASC")) { assertThat(result, table().row(1L, "abc").row(2L, "xyz").matches()); @@ -280,118 +146,16 @@ private void verifyVirtualTableContainsData(final String virtualTable) { } } - @Test - void listingInstancesNoVSExists() throws SQLException { - assertThat(setup.client().listInstances(), hasSize(0)); - } - - private void upload(final String key, final String content) { - s3TestSetup.upload(s3BucketName, key, RequestBody.fromString(content)); - } - - @Test - void listingInstancesIgnoresVersion() { - setup.client().install(); - final String name = "my_virtual_SCHEMA"; - createInstance(name); - assertThat(setup.client().listInstances("unknownVersion"), - allOf(hasSize(1), equalTo(List.of(new Instance().id(name).name(name))))); - } - - @Test - void createInstanceCreatesDbObjects() { - setup.client().install(); - final String name = "my_virtual_SCHEMA"; - createInstance(name); - - setup.exasolMetadata().assertConnection(table().row("MY_VIRTUAL_SCHEMA_CONNECTION", - "Created by Extension Manager for S3 Virtual Schema my_virtual_SCHEMA").matches()); - setup.exasolMetadata() - .assertVirtualSchema(table() - .row("my_virtual_SCHEMA", "SYS", "EXA_EXTENSIONS.S3_FILES_ADAPTER", not(emptyOrNullString())) - .matches()); - assertThat(setup.client().listInstances(), - allOf(hasSize(1), equalTo(List.of(new Instance().id(name).name(name))))); - } - - @Test - void createTwoInstances() { - setup.client().install(); - createInstance("vs1"); - createInstance("vs2"); - - setup.exasolMetadata() - .assertConnection(table() - .row("VS1_CONNECTION", "Created by Extension Manager for S3 Virtual Schema vs1") - .row("VS2_CONNECTION", "Created by Extension Manager for S3 Virtual Schema vs2").matches()); - setup.exasolMetadata() - .assertVirtualSchema(table() - .row("vs1", "SYS", "EXA_EXTENSIONS.S3_FILES_ADAPTER", not(emptyOrNullString())) - .row("vs2", "SYS", "EXA_EXTENSIONS.S3_FILES_ADAPTER", not(emptyOrNullString())).matches()); - - assertThat(setup.client().listInstances(), allOf(hasSize(2), - equalTo(List.of(new Instance().id("vs1").name("vs1"), new Instance().id("vs2").name("vs2"))))); - } - - @Test - void createInstanceWithSingleQuote() { - setup.client().install(); - createInstance("Quoted'schema"); - setup.exasolMetadata().assertConnection(table() - .row("QUOTED'SCHEMA_CONNECTION", "Created by Extension Manager for S3 Virtual Schema Quoted'schema") - .matches()); - setup.exasolMetadata().assertVirtualSchema(table() - .row("Quoted'schema", "SYS", "EXA_EXTENSIONS.S3_FILES_ADAPTER", not(emptyOrNullString())).matches()); - } - - @Test - void deleteNonExistingInstance() { - assertDoesNotThrow(() -> setup.client().deleteInstance("no-such-instance")); - } - - @Test - void deleteFailsForUnknownVersion() { - setup.client().assertRequestFails(() -> setup.client().deleteInstance("unknownVersion", "no-such-instance"), - equalTo("Version 'unknownVersion' not supported, can only use '" + PROJECT_VERSION + "'."), - equalTo(404)); - } - - @Test - void deleteExistingInstance() { - setup.client().install(); - createInstance("vs1"); - final List instances = setup.client().listInstances(); - assertThat(instances, hasSize(1)); - setup.client().deleteInstance(instances.get(0).getId()); - assertThat(setup.client().listInstances(), is(empty())); - assertAll(() -> setup.exasolMetadata().assertNoConnections(), - () -> setup.exasolMetadata().assertNoVirtualSchema()); - } - - private void createInstance(final String virtualSchemaName) { - createInstance(virtualSchemaName, getMappingDefinition("test-data-*.json")); - } - - private void createInstance(final String virtualSchemaName, final EdmlDefinition mapping) { - createInstance(EXTENSION_ID, PROJECT_VERSION, virtualSchemaName, mapping); - } - - private void createInstance(final String extensionId, final String extensionVersion, final String virtualSchemaName, - final EdmlDefinition mapping) { - setup.addVirtualSchemaToCleanupQueue(virtualSchemaName); - setup.addConnectionToCleanupQueue(virtualSchemaName.toUpperCase() + "_CONNECTION"); - final String instanceName = setup.client().createInstance(extensionId, extensionVersion, - createValidParameters(virtualSchemaName, mapping)); - assertThat(instanceName, equalTo(virtualSchemaName)); - } + @Override + protected Collection createValidParameterValues() { + final List parameters = new ArrayList<>(); + parameters.addAll(List.of( // + param("awsRegion", s3TestSetup.getRegion()), // + param("s3Bucket", s3BucketName), // + param("awsAccessKeyId", s3TestSetup.getUsername()), // + param("awsSecretAccessKey", s3TestSetup.getPassword()))); + parameters.add(param("MAPPING", new EdmlSerializer().serialize(getMappingDefinition()))); - private List createValidParameters(final String virtualSchemaName, final EdmlDefinition mapping) { - final List parameters = new ArrayList<>( - List.of(param("virtualSchemaName", virtualSchemaName), param("awsRegion", s3TestSetup.getRegion()), // - param("s3Bucket", s3BucketName), // - param("awsAccessKeyId", s3TestSetup.getUsername()), // - param("awsSecretAccessKey", s3TestSetup.getPassword()), // - param("mapping", new EdmlSerializer().serialize(mapping)))); getInDatabaseS3Address().map(address -> param("awsEndpointOverride", address)) // .ifPresent(parameters::add); if (s3TestSetup.getMfaToken().isPresent()) { @@ -400,8 +164,12 @@ private List createValidParameters(final String virtualSchemaNam return parameters; } + private EdmlDefinition getMappingDefinition() { + return getMappingDefinition(s3ImportPrefix + "test-data-*.json"); + } + private EdmlDefinition getMappingDefinition(final String source) { - return EdmlDefinition.builder().source(source).destinationTable("TEST") // + return EdmlDefinition.builder().source(source).destinationTable(MAPPING_DESTINATION_TABLE) // .mapping(Fields.builder() // .mapField("id", ToDecimalMapping.builder().build()) // .mapField("name", ToVarcharMapping.builder().varcharColumnSize(200).build()) // @@ -416,37 +184,12 @@ private Optional getInDatabaseS3Address() { .map(InetSocketAddress::toString); } - private ParameterValue param(final String name, final String value) { - return new ParameterValue().name(name).value(value); - } - - private void assertScriptsExist() { - final String jarDirective = "%jar /buckets/bfsdefault/default/" + IntegrationTestSetup.ADAPTER_JAR + ";"; - final String comment = "Created by Extension Manager for S3 Virtual Schema extension " + PROJECT_VERSION; - setup.exasolMetadata() - .assertScript(table() - .row("IMPORT_FROM_S3_DOCUMENT_FILES", "UDF", "SET", "EMITS", - allOf(containsString("%scriptclass " + UdfEntryPoint.class.getName() + ";"), // - containsString(jarDirective)), - comment) // - .row("S3_FILES_ADAPTER", "ADAPTER", null, null, - allOf(containsString("%scriptclass " + RequestDispatcher.class.getName() + ";"), // - containsString(jarDirective)), - comment) // - .matches()); - } - - private void createAdapter(final String adapterScriptName, final String importScriptName) { - final String adapterJarBucketFsPath = "/buckets/bfsdefault/default/" - + IntegrationTestSetup.ADAPTER_JAR_LOCAL_PATH.getFileName().toString(); - final ExasolSchema schema = setup.createExtensionSchema(); - schema.createAdapterScriptBuilder(adapterScriptName) - .bucketFsContent("com.exasol.adapter.RequestDispatcher", adapterJarBucketFsPath).language(Language.JAVA) - .build(); - schema.createUdfBuilder(importScriptName).language(UdfScript.Language.JAVA).inputType(InputType.SET) - .parameter(GenericUdfCallHandler.PARAMETER_DOCUMENT_FETCHER, "VARCHAR(2000000)") - .parameter(GenericUdfCallHandler.PARAMETER_SCHEMA_MAPPING_REQUEST, "VARCHAR(2000000)") - .parameter(GenericUdfCallHandler.PARAMETER_CONNECTION_NAME, "VARCHAR(500)").emits() - .bucketFsContent(UdfEntryPoint.class.getName(), adapterJarBucketFsPath).build(); + @Override + @Test + public void upgradeFromPreviousVersion() { + // This test can be removed once version 2.8.3 was released + setup.client().assertRequestFails(super::upgradeFromPreviousVersion, containsString( + "invalid parameters: Failed to validate parameter 'Name of the new virtual schema' (virtualSchemaName): This is a required parameter."), + equalTo(400)); } } diff --git a/src/test/java/com/exasol/adapter/document/files/extension/OldExtensionIT.java b/src/test/java/com/exasol/adapter/document/files/extension/OldExtensionIT.java new file mode 100644 index 00000000..46c88d5f --- /dev/null +++ b/src/test/java/com/exasol/adapter/document/files/extension/OldExtensionIT.java @@ -0,0 +1,195 @@ +package com.exasol.adapter.document.files.extension; + +import static com.exasol.matcher.ResultSetStructureMatcher.table; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.equalTo; + +import java.io.FileNotFoundException; +import java.net.InetSocketAddress; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.concurrent.TimeoutException; + +import org.junit.jupiter.api.*; + +import com.exasol.adapter.document.edml.*; +import com.exasol.adapter.document.edml.serializer.EdmlSerializer; +import com.exasol.adapter.document.files.IntegrationTestSetup; +import com.exasol.adapter.document.files.s3testsetup.AwsS3TestSetup; +import com.exasol.adapter.document.files.s3testsetup.S3TestSetup; +import com.exasol.bucketfs.BucketAccessException; +import com.exasol.exasoltestsetup.ExasolTestSetup; +import com.exasol.exasoltestsetup.ExasolTestSetupFactory; +import com.exasol.extensionmanager.client.model.InstallationsResponseInstallation; +import com.exasol.extensionmanager.client.model.ParameterValue; +import com.exasol.extensionmanager.itest.*; +import com.exasol.extensionmanager.itest.builder.ExtensionBuilder; +import com.exasol.mavenprojectversiongetter.MavenProjectVersionGetter; + +import software.amazon.awssdk.core.sync.RequestBody; + +/** + * This test class can be deleted once version 2.8.3 was released and {@link ExtensionIT#upgradeFromPreviousVersion()} + * is deleted. + */ +class OldExtensionIT { + private static final String PREVIOUS_VERSION = "2.8.2"; + private static final String PREVIOUS_VERSION_JAR_FILE = "document-files-virtual-schema-dist-7.3.6-s3-" + + PREVIOUS_VERSION + ".jar"; + private static final Path EXTENSION_SOURCE_DIR = Paths.get("extension").toAbsolutePath(); + private static final String EXTENSION_ID = "s3-vs-extension.js"; + private static final String PROJECT_VERSION = MavenProjectVersionGetter.getCurrentProjectVersion(); + private static ExasolTestSetup exasolTestSetup; + private static ExtensionManagerSetup setup; + private static S3TestSetup s3TestSetup; + private static String s3BucketName; + + @BeforeAll + static void setup() throws FileNotFoundException, BucketAccessException, TimeoutException { + if (System.getProperty("com.exasol.dockerdb.image") == null) { + System.setProperty("com.exasol.dockerdb.image", "8.23.0"); + } + exasolTestSetup = new ExasolTestSetupFactory(IntegrationTestSetup.CLOUD_SETUP_CONFIG).getTestSetup(); + ExasolVersionCheck.assumeExasolVersion8(exasolTestSetup); + setup = ExtensionManagerSetup.create(exasolTestSetup, ExtensionBuilder.createDefaultNpmBuilder( + EXTENSION_SOURCE_DIR, EXTENSION_SOURCE_DIR.resolve("dist").resolve(EXTENSION_ID))); + s3TestSetup = new AwsS3TestSetup(); + s3BucketName = "extension-test.s3.virtual-schema-test-bucket-" + System.currentTimeMillis(); + s3TestSetup.createBucket(s3BucketName); + exasolTestSetup.getDefaultBucket().uploadFile(IntegrationTestSetup.ADAPTER_JAR_LOCAL_PATH, + IntegrationTestSetup.ADAPTER_JAR); + } + + @AfterAll + static void teardown() throws Exception { + if (s3TestSetup != null) { + s3TestSetup.emptyS3Bucket(s3BucketName); + s3TestSetup.deleteBucket(s3BucketName); + } + if (setup != null) { + setup.close(); + } + // do not delete ADAPTER_JAR as it is required by other integration tests, too + // and upload immediately after delete fails. + exasolTestSetup.close(); + } + + @AfterEach + void cleanup() { + setup.cleanup(); + } + + @Test + void upgradeFromPreviousVersion() throws InterruptedException, BucketAccessException, TimeoutException, + FileNotFoundException, URISyntaxException { + final PreviousExtensionVersion previousVersion = createPreviousVersion(); + previousVersion.prepare(); + previousVersion.install(); + final String virtualTable = createVirtualSchema(previousVersion.getExtensionId(), PREVIOUS_VERSION); + verifyVirtualTableContainsData(virtualTable); + assertInstalledVersion(PREVIOUS_VERSION, previousVersion); + previousVersion.upgrade(); + assertInstalledVersion(PROJECT_VERSION, previousVersion); + verifyVirtualTableContainsData(virtualTable); + } + + private PreviousExtensionVersion createPreviousVersion() { + return setup.previousVersionManager().newVersion().currentVersion(PROJECT_VERSION) // + .previousVersion(PREVIOUS_VERSION) // + .adapterFileName(PREVIOUS_VERSION_JAR_FILE) // + .extensionFileName(EXTENSION_ID) // + .project("s3-document-files-virtual-schema") // + .build(); + } + + private void assertInstalledVersion(final String expectedVersion, final PreviousExtensionVersion previousVersion) { + // The extension is installed twice (previous and current version), so each one returns one installation. + assertThat(setup.client().getInstallations(), + containsInAnyOrder( + new InstallationsResponseInstallation().name("S3 Virtual Schema").version(expectedVersion) + .id(EXTENSION_ID), // + new InstallationsResponseInstallation().name("EXA_EXTENSIONS.S3_FILES_ADAPTER") + .version(expectedVersion).id(previousVersion.getExtensionId()))); + } + + private String createVirtualSchema(final String extensionId, final String extensionVersion) { + final String prefix = "vs-works-test-" + System.currentTimeMillis() + "/"; + upload(prefix + "test-data-1.json", "{\"id\": 1, \"name\": \"abc\" }"); + upload(prefix + "test-data-2.json", "{\"id\": 2, \"name\": \"xyz\" }"); + final String virtualSchemaName = "MY_VS"; + final EdmlDefinition mappingDefinition = getMappingDefinition(prefix + "test-data-*.json"); + createInstance(extensionId, extensionVersion, virtualSchemaName, mappingDefinition); + return virtualSchemaName + "." + mappingDefinition.getDestinationTable(); + } + + private void verifyVirtualTableContainsData(final String virtualTable) { + try (final ResultSet result = exasolTestSetup.createConnection().createStatement() + .executeQuery("SELECT ID, NAME FROM " + virtualTable + " ORDER BY ID ASC")) { + assertThat(result, table().row(1L, "abc").row(2L, "xyz").matches()); + } catch (final SQLException exception) { + throw new AssertionError("Assertion query failed", exception); + } + } + + private void upload(final String key, final String content) { + s3TestSetup.upload(s3BucketName, key, RequestBody.fromString(content)); + } + + private void createInstance(final String extensionId, final String extensionVersion, final String virtualSchemaName, + final EdmlDefinition mapping) { + setup.addVirtualSchemaToCleanupQueue(virtualSchemaName); + setup.addConnectionToCleanupQueue(virtualSchemaName.toUpperCase() + "_CONNECTION"); + final String instanceName = setup.client().createInstance(extensionId, extensionVersion, + createValidParameters(virtualSchemaName, mapping, extensionVersion)); + assertThat(instanceName, equalTo(virtualSchemaName)); + } + + private List createValidParameters(final String virtualSchemaName, final EdmlDefinition mapping, + final String extensionVersion) { + final List parameters = new ArrayList<>(); + parameters.addAll(List.of( // + param("awsRegion", s3TestSetup.getRegion()), // + param("s3Bucket", s3BucketName), // + param("awsAccessKeyId", s3TestSetup.getUsername()), // + param("awsSecretAccessKey", s3TestSetup.getPassword()))); + if (extensionVersion.equals(PREVIOUS_VERSION)) { + parameters.add(param("virtualSchemaName", virtualSchemaName)); + parameters.add(param("mapping", new EdmlSerializer().serialize(mapping))); + } else { + parameters.add(param("base-vs.virtual-schema-name", virtualSchemaName)); + parameters.add(param("MAPPING", new EdmlSerializer().serialize(mapping))); + } + + getInDatabaseS3Address().map(address -> param("awsEndpointOverride", address)) // + .ifPresent(parameters::add); + if (s3TestSetup.getMfaToken().isPresent()) { + parameters.add(param("awsSessionToken", s3TestSetup.getMfaToken().get())); + } + return parameters; + } + + private EdmlDefinition getMappingDefinition(final String source) { + return EdmlDefinition.builder().source(source).destinationTable("TEST") // + .mapping(Fields.builder() // + .mapField("id", ToDecimalMapping.builder().build()) // + .mapField("name", ToVarcharMapping.builder().varcharColumnSize(200).build()) // + .mapField("fieldWith'Quote", ToVarcharMapping.builder().varcharColumnSize(200).build()) // + .build()) + .build(); + } + + private Optional getInDatabaseS3Address() { + return s3TestSetup.getEntrypoint() + .map(endpoint -> exasolTestSetup.makeTcpServiceAccessibleFromDatabase(endpoint)) + .map(InetSocketAddress::toString); + } + + private ParameterValue param(final String name, final String value) { + return new ParameterValue().name(name).value(value); + } +}