diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c83a543..e1f8604 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,6 +16,14 @@ jobs: fetch-depth: 0 persist-credentials: false + - name: Installing + run: yarn --frozen-lockfile --perfer-offline --link-duplicates + + - name: Build and test + run: | + yarn build + yarn test + - name: Semantic Release uses: cycjimmy/semantic-release-action@v2 with: @@ -31,3 +39,4 @@ jobs: GIT_COMMITTER_EMAIL: ${{ secrets.SOCIALGROOVYBOT_EMAIL }} GIT_COMMITTER_NAME: ${{ secrets.SOCIALGROOVYBOT_NAME }} NPM_TOKEN: ${{ secrets.SOCIALGROOVYBOT_NPM_TOKEN }} + diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9c8a02c..e0d6a09 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,4 +24,6 @@ jobs: # run: yarn lint - name: Unit tests - run: yarn test + run: | + yarn build + yarn test diff --git a/.gitignore b/.gitignore index 12d7f0c..d80f752 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules .env -.env* \ No newline at end of file +.env* +dist diff --git a/.sonarcloud.properties b/.sonarcloud.properties new file mode 100644 index 0000000..6511b8e --- /dev/null +++ b/.sonarcloud.properties @@ -0,0 +1 @@ +sonar.exclusions=**/src/__tests__/**,**/__snapshots__/**,**/src/migrations/** \ No newline at end of file diff --git a/README.md b/README.md index b33dc93..a6c7ca7 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,6 @@ Extract matomo data from [`Live.getLastVisitsDetails`](https://developer.matomo.org/api-reference/reporting-api) API and push events and visits informations to Postgres. -Use [pg_partman](https://github.com/pgpartman/pg_partman) to partition data by month. - ## Usage Create the [initial table](./initial.sql) database table then run the following job with correct environment variables. @@ -16,16 +14,16 @@ npx @socialgouv/matomo-postgres ### Environment variables Deployment -| name | value | -| ----------------- | ---------------------------------------------- | -| MATOMO_KEY\* | matomo api token | -| MATOMO_SITE\* | matomo site id | -| MATOMO_URL\* | matomo url | -| PGDATABASE\* | Postgres connection string | -| DESTINATION_TABLE | `matomo` | -| STARTDATE | default to today() | -| RESULTPERPAGE | matomo pagination : `100` | -| OFFSET | default days to check in the past; default = 3 | +| name | value | +| ----------------- | -------------------------------------------------------- | +| MATOMO_KEY\* | matomo api token | +| MATOMO_SITE\* | matomo site id | +| MATOMO_URL\* | matomo url | +| PGDATABASE\* | Postgres connection string | +| DESTINATION_TABLE | `matomo` | +| STARTDATE | default to today() | +| RESULTPERPAGE | matomo pagination (defaults to 500) | +| INITIAL_OFFSET | How many days to fetch on initialisation (defaults to 3) | ## Dev @@ -43,3 +41,6 @@ yarn start Use `yarn test -u` to update the snapshots +## Database migrations + +`yarn migrate` is run on each `yarn start` with Kysely migrations at [./src/migrations](./src/migrations/) diff --git a/bin/index.js b/bin/index.js index 1f3866c..8dfa55f 100755 --- a/bin/index.js +++ b/bin/index.js @@ -1,11 +1,22 @@ #!/usr/bin/env node -const run = require("../src/index"); +const { db } = require("../dist/db"); + +const { default: run } = require("../dist/index"); +const { default: migrate } = require("../dist/migrate-latest"); + +async function start(date) { + console.log(`\nRunning migrations\n`); + await migrate(); + console.log(`\nStarting import\n`); + await run(date); + db.destroy(); +} if (require.main === module) { const date = (process.argv[process.argv.length - 1].match(/^\d\d\d\d-\d\d-\d\d$/) && process.argv[process.argv.length - 1]) || ""; console.log(`\nRunning @socialgouv/matomo-postgres ${date}\n`); - run(date); + start(date); } diff --git a/docker-compose.yml b/docker-compose.yml index 94d4a31..dae7c8d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,9 +1,10 @@ version: "3.0" services: postgres: - build: - context: ./docker - dockerfile: ./Dockerfile + image: postgres:15 + # build: + # context: ./docker + # dockerfile: ./Dockerfile volumes: - postgres_data:/var/lib/postgresql/data environment: diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index 270d005..0000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -FROM postgres:13-alpine - -ENV PG_PARTMAN_VERSION v4.7.0 - -# Install pg_jobmon -RUN set -ex \ - \ - && apk add --no-cache --virtual .fetch-deps \ - ca-certificates \ - openssl \ - tar \ - \ - && apk add --no-cache --virtual .build-deps \ - autoconf \ - automake \ - g++ \ - clang \ - llvm \ - libtool \ - libxml2-dev \ - make \ - perl -# Install pg_partman -RUN set -ex \ - && wget -O pg_partman.tar.gz "https://github.com/pgpartman/pg_partman/archive/$PG_PARTMAN_VERSION.tar.gz" \ - && mkdir -p /usr/src/pg_partman \ - && tar \ - --extract \ - --file pg_partman.tar.gz \ - --directory /usr/src/pg_partman \ - --strip-components 1 \ - && rm pg_partman.tar.gz \ - && cd /usr/src/pg_partman \ - && make \ - && make install \ - && cd / \ - && rm -rf /usr/src/pg_partman \ - && apk del .fetch-deps .build-deps - -# Copy the init script -# The Docker Postgres initd script will run anything -# in the directory /docker-entrypoint-initdb.d -COPY initdb.sh /docker-entrypoint-initdb.d/initdb.sh \ No newline at end of file diff --git a/docker/initdb.sh b/docker/initdb.sh deleted file mode 100644 index 3d05ea6..0000000 --- a/docker/initdb.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -e - -echo "Creating partman extension" -psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL - CREATE SCHEMA partman; - CREATE EXTENSION pg_partman SCHEMA partman; -EOSQL - -echo "ADDING pg_partman_bgw TO postgresql.conf" -echo "shared_preload_libraries = 'pg_partman_bgw'" >> $PGDATA/postgresql.conf -echo "pg_partman_bgw.interval = 3600" >> $PGDATA/postgresql.conf -echo "pg_partman_bgw.role = '$POSTGRES_USER'" >> $PGDATA/postgresql.conf -echo "pg_partman_bgw.dbname = '$POSTGRES_DB'" >> $PGDATA/postgresql.conf \ No newline at end of file diff --git a/initial.sql b/initial.sql deleted file mode 100644 index dc3f770..0000000 --- a/initial.sql +++ /dev/null @@ -1,73 +0,0 @@ --- converting existing matomo table to partitioned witg pg_partman --- usage : ON_ERROR_STOP=1 psql < partition.sql - ---- pg_partman setup - -CREATE SCHEMA IF NOT EXISTS partman; -CREATE EXTENSION IF NOT EXISTS pg_partman SCHEMA partman; - ---- backup and recreate a new partionned matomo table - -CREATE TABLE IF NOT EXISTS matomo_tmp as (select * from matomo); - -ALTER TABLE IF EXISTS matomo RENAME TO matomo_backup; - -CREATE TABLE IF NOT EXISTS matomo -( - idsite text, - idvisit text, - actions text, - country text, - region text, - city text, - operatingsystemname text, - devicemodel text, - devicebrand text, - visitduration text, - dayssincefirstvisit text, - visitortype text, - sitename text, - userid text, - serverdateprettyfirstaction date, - action_id text, - action_type text, - action_eventcategory text, - action_eventaction text, - action_eventname text, - action_eventvalue decimal, - action_timespent text, - action_timestamp timestamp with time zone DEFAULT now(), - usercustomproperties json, - usercustomdimensions json, - dimension1 text, - dimension2 text, - dimension3 text, - dimension4 text, - dimension5 text, - dimension6 text, - dimension7 text, - dimension8 text, - dimension9 text, - dimension10 text, - action_url text, - sitesearchkeyword text, - action_title text -) PARTITION BY RANGE (action_timestamp); - -ALTER TABLE IF EXISTS matomo ADD CONSTRAINT unique_action_id UNIQUE (action_id, action_timestamp); -ALTER TABLE IF EXISTS matomo ALTER COLUMN action_eventvalue TYPE decimal USING action_eventvalue::decimal; -CREATE INDEX IF NOT EXISTS idx_action_timestamp_matomo ON matomo (action_timestamp); -CREATE INDEX IF NOT EXISTS idx_idvisit_matomo ON matomo(idvisit); -CREATE INDEX IF NOT EXISTS idx_action_eventcategory_matomo ON matomo(action_eventcategory); -CREATE INDEX IF NOT EXISTS idx_action_type_matomo ON matomo(action_type); -CREATE INDEX IF NOT EXISTS idx_action_eventaction_matomo ON matomo(action_eventaction); - -SELECT partman.create_parent('public.matomo', 'action_timestamp', 'native', 'monthly'); - --- Import des données depuis la table standard vers la table partitionnée -CALL partman.partition_data_proc('public.matomo', p_source_table := 'public.matomo_tmp', p_order:= 'DESC'); - -VACUUM ANALYZE public.matomo; - -DROP TABLE if exists matomo_tmp; - diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..fd96875 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,16 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: "ts-jest", + testEnvironment: "node", + testMatch: ["**/*.test.ts"], + transform: { + // '^.+\\.[tj]sx?$' to process js/ts with `ts-jest` + // '^.+\\.m?[tj]sx?$' to process js/ts/mjs/mts with `ts-jest` + "^.+\\.tsx?$": [ + "ts-jest", + { + isolatedModules: true, + }, + ], + }, +}; diff --git a/jsconfig.json b/jsconfig.json deleted file mode 100644 index 7168911..0000000 --- a/jsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "resolveJsonModule": true, - "checkJs": true, - "module": "commonjs", - "target": "es6" - }, - "include": ["src/**/*", "types/*"] -} diff --git a/package.json b/package.json index e6916e8..2ea8443 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "0.0.1", "types": "types/index.d.ts", "license": "Apache-2.0", - "main": "src/index.js", + "main": "dist/index.js", "preferGlobal": true, "publishConfig": { "access": "public" @@ -12,25 +12,37 @@ "bin": { "matomo-postgres": "./bin/index.js" }, + "files": [ + "bin", + "dist" + ], "scripts": { - "start": "node ./src/index.js", + "start": "yarn migrate && node ./dist/index.js", + "build": "tsc", + "prepublish": "yarn build", + "migrate": "node ./dist/migrate-latest.js", "test": "jest --verbose" }, "prettier": { "printWidth": 120 }, "dependencies": { - "date-fns": "^2.23.0", - "debug": "^4.3.3", - "dotenv": "^10.0.0", - "p-all": "^3.0.0", - "pg": "^8.7.1", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "kysely": "^0.23.4", + "p-all": "^3", + "pg": "^8.9.0", "piwik-client": "^0.2.2" }, "devDependencies": { - "@types/jest": "^27.0.3", - "@types/pg": "^8.6.1", - "jest": "^27.1.1", - "typescript": "^4.4.4" + "@types/debug": "^4.1.7", + "@types/jest": "^29.4.0", + "@types/node": "^18.14.4", + "@types/pg": "^8.6.6", + "jest": "^29.4.3", + "ts-jest": "^29.0.5", + "ts-node": "^10.9.1", + "typescript": "^4.9.5" } } diff --git a/src/__tests__/__snapshots__/importDate.test.js.snap b/src/__tests__/__snapshots__/importDate.test.js.snap deleted file mode 100644 index b1656df..0000000 --- a/src/__tests__/__snapshots__/importDate.test.js.snap +++ /dev/null @@ -1,389 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`importDate: should import all events for a given date 1`] = ` -Array [ - Object { - "date": "2021-08-02", - "filter_limit": 500, - "filter_offset": 0, - "filter_sort_order": "asc", - "idSite": 0, - "method": "Live.getLastVisitsDetails", - "period": "day", - }, -] -`; - -exports[`importDate: should import all events for a given date 2`] = ` -Array [ - Array [ - "SELECT COUNT(distinct idvisit) FROM matomo WHERE action_timestamp::date='2021-08-02';", - ], - Array [ - "insert into matomo - (idsite, idvisit, actions, country, region, city, operatingsystemname, devicemodel, devicebrand, visitduration, dayssincefirstvisit, visitortype, visitorid, referrertype, referrername, sitename, userid, serverdateprettyfirstaction, action_id, action_type, action_title, action_eventcategory, action_eventaction, action_eventname, action_eventvalue, action_timespent, action_timestamp, action_url, siteSearchKeyword, usercustomproperties, usercustomdimensions, dimension1, dimension2, dimension3, dimension4, dimension5, dimension6, dimension7, dimension8, dimension9, dimension10) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41) - ON CONFLICT DO NOTHING", - Array [ - "42", - 123, - "2", - "Argentine", - "Buenos Aires", - "Buenos Aires", - "Mac", - "Générique Bureau", - "Inconnu", - "300", - "23", - "returningCustomer", - "visitorId", - "referrerType", - "referrerName", - "tests", - "24", - "2021-08-20T21:55:12.000Z", - "123_0", - "event", - "Evènement", - "Ecommerce", - "Cart change", - "added - Basic Wetsuit", - 1, - 48, - "2021-08-20T21:35:18.000Z", - "https://dive-shop.net/products/basic-wetsuit/", - undefined, - Object { - "page-author": "Julien", - "post-age": "-430 days", - }, - Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "guest", - "julien", - "page", - "indonesia", - "diving", - "shop", - "v1.2.3", - "fr", - "light", - "36", - ], - ], - Array [ - "insert into matomo - (idsite, idvisit, actions, country, region, city, operatingsystemname, devicemodel, devicebrand, visitduration, dayssincefirstvisit, visitortype, visitorid, referrertype, referrername, sitename, userid, serverdateprettyfirstaction, action_id, action_type, action_title, action_eventcategory, action_eventaction, action_eventname, action_eventvalue, action_timespent, action_timestamp, action_url, siteSearchKeyword, usercustomproperties, usercustomdimensions, dimension1, dimension2, dimension3, dimension4, dimension5, dimension6, dimension7, dimension8, dimension9, dimension10) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41) - ON CONFLICT DO NOTHING", - Array [ - "42", - 123, - "2", - "Argentine", - "Buenos Aires", - "Buenos Aires", - "Mac", - "Générique Bureau", - "Inconnu", - "300", - "23", - "returningCustomer", - "visitorId", - "referrerType", - "referrerName", - "tests", - "24", - "2021-08-20T21:55:12.000Z", - "123_1", - "action", - "Divezone Brand Diving Boots - Divezone Store", - undefined, - undefined, - undefined, - undefined, - "2", - "2021-08-20T21:30:25.000Z", - "https://dive-shop.net/products/diving-boots/", - undefined, - Object {}, - Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "guest", - "julien", - "page", - "indonesia", - "diving", - "shop", - "v1.2.3", - "fr", - "light", - "36", - ], - ], - Array [ - "insert into matomo - (idsite, idvisit, actions, country, region, city, operatingsystemname, devicemodel, devicebrand, visitduration, dayssincefirstvisit, visitortype, visitorid, referrertype, referrername, sitename, userid, serverdateprettyfirstaction, action_id, action_type, action_title, action_eventcategory, action_eventaction, action_eventname, action_eventvalue, action_timespent, action_timestamp, action_url, siteSearchKeyword, usercustomproperties, usercustomdimensions, dimension1, dimension2, dimension3, dimension4, dimension5, dimension6, dimension7, dimension8, dimension9, dimension10) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41) - ON CONFLICT DO NOTHING", - Array [ - "42", - 123, - "2", - "Argentine", - "Buenos Aires", - "Buenos Aires", - "Mac", - "Générique Bureau", - "Inconnu", - "300", - "23", - "returningCustomer", - "visitorId", - "referrerType", - "referrerName", - "tests", - "24", - "2021-08-20T21:55:12.000Z", - "123_2", - "search", - "Divezone Brand Diving Boots - Divezone Store", - undefined, - undefined, - undefined, - undefined, - "2", - "2021-08-20T21:30:22.000Z", - "https://dive-shop.net/products/diving-boots/", - "scuba", - Object {}, - Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "guest", - "julien", - "page", - "indonesia", - "diving", - "shop", - "v1.2.3", - "fr", - "light", - "36", - ], - ], - Array [ - "insert into matomo - (idsite, idvisit, actions, country, region, city, operatingsystemname, devicemodel, devicebrand, visitduration, dayssincefirstvisit, visitortype, visitorid, referrertype, referrername, sitename, userid, serverdateprettyfirstaction, action_id, action_type, action_title, action_eventcategory, action_eventaction, action_eventname, action_eventvalue, action_timespent, action_timestamp, action_url, siteSearchKeyword, usercustomproperties, usercustomdimensions, dimension1, dimension2, dimension3, dimension4, dimension5, dimension6, dimension7, dimension8, dimension9, dimension10) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41) - ON CONFLICT DO NOTHING", - Array [ - "42", - 124, - "2", - "Argentine", - "Buenos Aires", - "Buenos Aires", - "Mac", - "Générique Bureau", - "Inconnu", - "300", - "23", - "returningCustomer", - "visitorId", - "referrerType", - "referrerName", - "tests", - "24", - "2021-08-20T21:55:12.000Z", - "124_0", - "event", - "Evènement", - "Ecommerce", - "Cart change", - "added - Basic Wetsuit", - 1, - 48, - "2021-08-20T21:35:18.000Z", - "https://dive-shop.net/products/basic-wetsuit/", - undefined, - Object { - "page-author": "Julien", - "post-age": "-430 days", - }, - Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "guest", - "julien", - "page", - "indonesia", - "diving", - "shop", - "v1.2.3", - "fr", - "light", - "36", - ], - ], - Array [ - "insert into matomo - (idsite, idvisit, actions, country, region, city, operatingsystemname, devicemodel, devicebrand, visitduration, dayssincefirstvisit, visitortype, visitorid, referrertype, referrername, sitename, userid, serverdateprettyfirstaction, action_id, action_type, action_title, action_eventcategory, action_eventaction, action_eventname, action_eventvalue, action_timespent, action_timestamp, action_url, siteSearchKeyword, usercustomproperties, usercustomdimensions, dimension1, dimension2, dimension3, dimension4, dimension5, dimension6, dimension7, dimension8, dimension9, dimension10) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41) - ON CONFLICT DO NOTHING", - Array [ - "42", - 124, - "2", - "Argentine", - "Buenos Aires", - "Buenos Aires", - "Mac", - "Générique Bureau", - "Inconnu", - "300", - "23", - "returningCustomer", - "visitorId", - "referrerType", - "referrerName", - "tests", - "24", - "2021-08-20T21:55:12.000Z", - "124_1", - "action", - "Divezone Brand Diving Boots - Divezone Store", - undefined, - undefined, - undefined, - undefined, - "2", - "2021-08-20T21:30:25.000Z", - "https://dive-shop.net/products/diving-boots/", - undefined, - Object {}, - Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "guest", - "julien", - "page", - "indonesia", - "diving", - "shop", - "v1.2.3", - "fr", - "light", - "36", - ], - ], - Array [ - "insert into matomo - (idsite, idvisit, actions, country, region, city, operatingsystemname, devicemodel, devicebrand, visitduration, dayssincefirstvisit, visitortype, visitorid, referrertype, referrername, sitename, userid, serverdateprettyfirstaction, action_id, action_type, action_title, action_eventcategory, action_eventaction, action_eventname, action_eventvalue, action_timespent, action_timestamp, action_url, siteSearchKeyword, usercustomproperties, usercustomdimensions, dimension1, dimension2, dimension3, dimension4, dimension5, dimension6, dimension7, dimension8, dimension9, dimension10) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41) - ON CONFLICT DO NOTHING", - Array [ - "42", - 124, - "2", - "Argentine", - "Buenos Aires", - "Buenos Aires", - "Mac", - "Générique Bureau", - "Inconnu", - "300", - "23", - "returningCustomer", - "visitorId", - "referrerType", - "referrerName", - "tests", - "24", - "2021-08-20T21:55:12.000Z", - "124_2", - "search", - "Divezone Brand Diving Boots - Divezone Store", - undefined, - undefined, - undefined, - undefined, - "2", - "2021-08-20T21:30:22.000Z", - "https://dive-shop.net/products/diving-boots/", - "scuba", - Object {}, - Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "guest", - "julien", - "page", - "indonesia", - "diving", - "shop", - "v1.2.3", - "fr", - "light", - "36", - ], - ], -] -`; diff --git a/src/__tests__/__snapshots__/importDate.test.ts.snap b/src/__tests__/__snapshots__/importDate.test.ts.snap new file mode 100644 index 0000000..49c2857 --- /dev/null +++ b/src/__tests__/__snapshots__/importDate.test.ts.snap @@ -0,0 +1,2427 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`importDate: should paginate matomo API calls and produce 46 queries 3`] = ` +[ + [ + "select count(distinct "idvisit") as "count" from "matomo" where date(timezone('UTC', action_timestamp)) = $1", + [ + "2023-04-15", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "undefined_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], +] +`; diff --git a/src/__tests__/__snapshots__/importEvent.test.js.snap b/src/__tests__/__snapshots__/importEvent.test.js.snap deleted file mode 100644 index f2fd827..0000000 --- a/src/__tests__/__snapshots__/importEvent.test.js.snap +++ /dev/null @@ -1,359 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`importEvent: should extract events from matomo visit actionsDetails and create insert queries 1`] = ` -Array [ - Object { - "action_eventaction": "Cart change", - "action_eventcategory": "Ecommerce", - "action_eventname": "added - Basic Wetsuit", - "action_eventvalue": 1, - "action_id": "124_0", - "action_timespent": 48, - "action_timestamp": "2021-08-20T21:35:18.000Z", - "action_title": "Evènement", - "action_type": "event", - "action_url": "https://dive-shop.net/products/basic-wetsuit/", - "actions": "2", - "city": "Buenos Aires", - "country": "Argentine", - "dayssincefirstvisit": "23", - "devicebrand": "Inconnu", - "devicemodel": "Générique Bureau", - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - "idsite": "42", - "idvisit": "124", - "operatingsystemname": "Mac", - "referrername": "referrerName", - "referrertype": "referrerType", - "region": "Buenos Aires", - "serverdateprettyfirstaction": "2021-08-20T21:55:12.000Z", - "siteSearchKeyword": undefined, - "sitename": "tests", - "usercustomdimensions": Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "usercustomproperties": Object { - "page-author": "Julien", - "post-age": "-430 days", - }, - "userid": "24", - "visitduration": "300", - "visitorid": "visitorId", - "visitortype": "returningCustomer", - }, - Object { - "action_eventaction": undefined, - "action_eventcategory": undefined, - "action_eventname": undefined, - "action_eventvalue": undefined, - "action_id": "124_1", - "action_timespent": "2", - "action_timestamp": "2021-08-20T21:30:25.000Z", - "action_title": "Divezone Brand Diving Boots - Divezone Store", - "action_type": "action", - "action_url": "https://dive-shop.net/products/diving-boots/", - "actions": "2", - "city": "Buenos Aires", - "country": "Argentine", - "dayssincefirstvisit": "23", - "devicebrand": "Inconnu", - "devicemodel": "Générique Bureau", - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - "idsite": "42", - "idvisit": "124", - "operatingsystemname": "Mac", - "referrername": "referrerName", - "referrertype": "referrerType", - "region": "Buenos Aires", - "serverdateprettyfirstaction": "2021-08-20T21:55:12.000Z", - "siteSearchKeyword": undefined, - "sitename": "tests", - "usercustomdimensions": Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "usercustomproperties": Object {}, - "userid": "24", - "visitduration": "300", - "visitorid": "visitorId", - "visitortype": "returningCustomer", - }, - Object { - "action_eventaction": undefined, - "action_eventcategory": undefined, - "action_eventname": undefined, - "action_eventvalue": undefined, - "action_id": "124_2", - "action_timespent": "2", - "action_timestamp": "2021-08-20T21:30:22.000Z", - "action_title": "Divezone Brand Diving Boots - Divezone Store", - "action_type": "search", - "action_url": "https://dive-shop.net/products/diving-boots/", - "actions": "2", - "city": "Buenos Aires", - "country": "Argentine", - "dayssincefirstvisit": "23", - "devicebrand": "Inconnu", - "devicemodel": "Générique Bureau", - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - "idsite": "42", - "idvisit": "124", - "operatingsystemname": "Mac", - "referrername": "referrerName", - "referrertype": "referrerType", - "region": "Buenos Aires", - "serverdateprettyfirstaction": "2021-08-20T21:55:12.000Z", - "siteSearchKeyword": "scuba", - "sitename": "tests", - "usercustomdimensions": Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "usercustomproperties": Object {}, - "userid": "24", - "visitduration": "300", - "visitorid": "visitorId", - "visitortype": "returningCustomer", - }, -] -`; - -exports[`importEvent: should extract events from matomo visit actionsDetails and create insert queries 2`] = ` -Array [ - Array [ - "insert into matomo - (idsite, idvisit, actions, country, region, city, operatingsystemname, devicemodel, devicebrand, visitduration, dayssincefirstvisit, visitortype, visitorid, referrertype, referrername, sitename, userid, serverdateprettyfirstaction, action_id, action_type, action_title, action_eventcategory, action_eventaction, action_eventname, action_eventvalue, action_timespent, action_timestamp, action_url, siteSearchKeyword, usercustomproperties, usercustomdimensions, dimension1, dimension2, dimension3, dimension4, dimension5, dimension6, dimension7, dimension8, dimension9, dimension10) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41) - ON CONFLICT DO NOTHING", - Array [ - "42", - "124", - "2", - "Argentine", - "Buenos Aires", - "Buenos Aires", - "Mac", - "Générique Bureau", - "Inconnu", - "300", - "23", - "returningCustomer", - "visitorId", - "referrerType", - "referrerName", - "tests", - "24", - "2021-08-20T21:55:12.000Z", - "124_0", - "event", - "Evènement", - "Ecommerce", - "Cart change", - "added - Basic Wetsuit", - 1, - 48, - "2021-08-20T21:35:18.000Z", - "https://dive-shop.net/products/basic-wetsuit/", - undefined, - Object { - "page-author": "Julien", - "post-age": "-430 days", - }, - Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "guest", - "julien", - "page", - "indonesia", - "diving", - "shop", - "v1.2.3", - "fr", - "light", - "36", - ], - ], - Array [ - "insert into matomo - (idsite, idvisit, actions, country, region, city, operatingsystemname, devicemodel, devicebrand, visitduration, dayssincefirstvisit, visitortype, visitorid, referrertype, referrername, sitename, userid, serverdateprettyfirstaction, action_id, action_type, action_title, action_eventcategory, action_eventaction, action_eventname, action_eventvalue, action_timespent, action_timestamp, action_url, siteSearchKeyword, usercustomproperties, usercustomdimensions, dimension1, dimension2, dimension3, dimension4, dimension5, dimension6, dimension7, dimension8, dimension9, dimension10) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41) - ON CONFLICT DO NOTHING", - Array [ - "42", - "124", - "2", - "Argentine", - "Buenos Aires", - "Buenos Aires", - "Mac", - "Générique Bureau", - "Inconnu", - "300", - "23", - "returningCustomer", - "visitorId", - "referrerType", - "referrerName", - "tests", - "24", - "2021-08-20T21:55:12.000Z", - "124_1", - "action", - "Divezone Brand Diving Boots - Divezone Store", - undefined, - undefined, - undefined, - undefined, - "2", - "2021-08-20T21:30:25.000Z", - "https://dive-shop.net/products/diving-boots/", - undefined, - Object {}, - Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "guest", - "julien", - "page", - "indonesia", - "diving", - "shop", - "v1.2.3", - "fr", - "light", - "36", - ], - ], - Array [ - "insert into matomo - (idsite, idvisit, actions, country, region, city, operatingsystemname, devicemodel, devicebrand, visitduration, dayssincefirstvisit, visitortype, visitorid, referrertype, referrername, sitename, userid, serverdateprettyfirstaction, action_id, action_type, action_title, action_eventcategory, action_eventaction, action_eventname, action_eventvalue, action_timespent, action_timestamp, action_url, siteSearchKeyword, usercustomproperties, usercustomdimensions, dimension1, dimension2, dimension3, dimension4, dimension5, dimension6, dimension7, dimension8, dimension9, dimension10) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41) - ON CONFLICT DO NOTHING", - Array [ - "42", - "124", - "2", - "Argentine", - "Buenos Aires", - "Buenos Aires", - "Mac", - "Générique Bureau", - "Inconnu", - "300", - "23", - "returningCustomer", - "visitorId", - "referrerType", - "referrerName", - "tests", - "24", - "2021-08-20T21:55:12.000Z", - "124_2", - "search", - "Divezone Brand Diving Boots - Divezone Store", - undefined, - undefined, - undefined, - undefined, - "2", - "2021-08-20T21:30:22.000Z", - "https://dive-shop.net/products/diving-boots/", - "scuba", - Object {}, - Object { - "dimension1": "guest", - "dimension10": "36", - "dimension2": "julien", - "dimension3": "page", - "dimension4": "indonesia", - "dimension5": "diving", - "dimension6": "shop", - "dimension7": "v1.2.3", - "dimension8": "fr", - "dimension9": "light", - }, - "guest", - "julien", - "page", - "indonesia", - "diving", - "shop", - "v1.2.3", - "fr", - "light", - "36", - ], - ], -] -`; diff --git a/src/__tests__/__snapshots__/importEvent.test.ts.snap b/src/__tests__/__snapshots__/importEvent.test.ts.snap new file mode 100644 index 0000000..d4feb9d --- /dev/null +++ b/src/__tests__/__snapshots__/importEvent.test.ts.snap @@ -0,0 +1,171 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`getEventsFromMatomoVisit: should merge action events 1`] = ` +[ + { + "action_eventaction": "Cart change", + "action_eventcategory": "Ecommerce", + "action_eventname": "added - Basic Wetsuit", + "action_eventvalue": 1, + "action_id": "124_0", + "action_timespent": 48, + "action_timestamp": "2021-08-20T21:35:18.000Z", + "action_title": "Evènement", + "action_type": "event", + "action_url": "https://dive-shop.net/products/basic-wetsuit/", + "actions": "2", + "city": "Buenos Aires", + "country": "Argentine", + "dayssincefirstvisit": "23", + "devicebrand": "Inconnu", + "devicemodel": "Générique Bureau", + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + "idsite": "42", + "idvisit": "124", + "operatingsystemname": "Mac", + "referrername": "referrerName", + "referrertype": "referrerType", + "region": "Buenos Aires", + "serverdateprettyfirstaction": "2021-08-20T21:55:12.000Z", + "sitename": "tests", + "sitesearchkeyword": undefined, + "usercustomdimensions": { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "usercustomproperties": { + "page-author": "Julien", + "post-age": "-430 days", + }, + "userid": "24", + "visitduration": "300", + "visitorid": "visitorId", + "visitortype": "returningCustomer", + }, + { + "action_eventaction": undefined, + "action_eventcategory": undefined, + "action_eventname": undefined, + "action_eventvalue": undefined, + "action_id": "124_1", + "action_timespent": "2", + "action_timestamp": "2021-08-20T21:30:25.000Z", + "action_title": "Divezone Brand Diving Boots - Divezone Store", + "action_type": "action", + "action_url": "https://dive-shop.net/products/diving-boots/", + "actions": "2", + "city": "Buenos Aires", + "country": "Argentine", + "dayssincefirstvisit": "23", + "devicebrand": "Inconnu", + "devicemodel": "Générique Bureau", + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + "idsite": "42", + "idvisit": "124", + "operatingsystemname": "Mac", + "referrername": "referrerName", + "referrertype": "referrerType", + "region": "Buenos Aires", + "serverdateprettyfirstaction": "2021-08-20T21:55:12.000Z", + "sitename": "tests", + "sitesearchkeyword": undefined, + "usercustomdimensions": { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "usercustomproperties": {}, + "userid": "24", + "visitduration": "300", + "visitorid": "visitorId", + "visitortype": "returningCustomer", + }, + { + "action_eventaction": undefined, + "action_eventcategory": undefined, + "action_eventname": undefined, + "action_eventvalue": undefined, + "action_id": "124_2", + "action_timespent": "2", + "action_timestamp": "2021-08-20T21:30:22.000Z", + "action_title": "Divezone Brand Diving Boots - Divezone Store", + "action_type": "search", + "action_url": "https://dive-shop.net/products/diving-boots/", + "actions": "2", + "city": "Buenos Aires", + "country": "Argentine", + "dayssincefirstvisit": "23", + "devicebrand": "Inconnu", + "devicemodel": "Générique Bureau", + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + "idsite": "42", + "idvisit": "124", + "operatingsystemname": "Mac", + "referrername": "referrerName", + "referrertype": "referrerType", + "region": "Buenos Aires", + "serverdateprettyfirstaction": "2021-08-20T21:55:12.000Z", + "sitename": "tests", + "sitesearchkeyword": "scuba", + "usercustomdimensions": { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "usercustomproperties": {}, + "userid": "24", + "visitduration": "300", + "visitorid": "visitorId", + "visitortype": "returningCustomer", + }, +] +`; diff --git a/src/__tests__/__snapshots__/index.test.js.snap b/src/__tests__/__snapshots__/index.test.js.snap deleted file mode 100644 index 4dbc0b3..0000000 --- a/src/__tests__/__snapshots__/index.test.js.snap +++ /dev/null @@ -1,56 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`run: should create table 1`] = ` -Array [ - " - -CREATE SCHEMA IF NOT EXISTS partman; -CREATE EXTENSION IF NOT EXISTS pg_partman SCHEMA partman; -CREATE TABLE IF NOT EXISTS matomo -( - idsite text, - idvisit text, - actions text, - country text, - region text, - city text, - operatingsystemname text, - devicemodel text, - devicebrand text, - visitduration text, - dayssincefirstvisit text, - visitortype text, - sitename text, - userid text, - serverdateprettyfirstaction date, - action_id text, - action_type text, - action_eventcategory text, - action_eventaction text, - action_eventname text, - action_eventvalue decimal, - action_timespent text, - action_timestamp timestamp with time zone DEFAULT now(), - usercustomproperties json, - usercustomdimensions json, - dimension1 text, - dimension2 text, - dimension3 text, - dimension4 text, - dimension5 text, - dimension6 text, - dimension7 text, - dimension8 text, - dimension9 text, - dimension10 text, - action_url text, - sitesearchkeyword text, - action_title text, - visitorid text, - referrertype text, - referrername text -) PARTITION BY RANGE (action_timestamp); -", - Array [], -] -`; diff --git a/src/__tests__/__snapshots__/run.test.ts.snap b/src/__tests__/__snapshots__/run.test.ts.snap new file mode 100644 index 0000000..71c5c3c --- /dev/null +++ b/src/__tests__/__snapshots__/run.test.ts.snap @@ -0,0 +1,1741 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`run: should fetch the latest 5 days on matomo 1`] = ` +[ + { + "date": "2023-03-29", + "filter_limit": 10, + "filter_offset": 0, + "filter_sort_order": "asc", + "idSite": "42", + "method": "Live.getLastVisitsDetails", + "period": "day", + }, + { + "date": "2023-03-30", + "filter_limit": 10, + "filter_offset": 0, + "filter_sort_order": "asc", + "idSite": "42", + "method": "Live.getLastVisitsDetails", + "period": "day", + }, + { + "date": "2023-03-31", + "filter_limit": 10, + "filter_offset": 0, + "filter_sort_order": "asc", + "idSite": "42", + "method": "Live.getLastVisitsDetails", + "period": "day", + }, + { + "date": "2023-04-01", + "filter_limit": 10, + "filter_offset": 0, + "filter_sort_order": "asc", + "idSite": "42", + "method": "Live.getLastVisitsDetails", + "period": "day", + }, + { + "date": "2023-04-02", + "filter_limit": 10, + "filter_offset": 0, + "filter_sort_order": "asc", + "idSite": "42", + "method": "Live.getLastVisitsDetails", + "period": "day", + }, +] +`; + +exports[`run: should fetch the latest event date if no date provided 1`] = ` +[ + "select action_timestamp at time zone 'UTC' as "action_timestamp" from "matomo" order by "action_timestamp" desc limit $1", + [ + 1, + ], +] +`; + +exports[`run: should run SQL queries 1`] = ` +[ + [ + "select action_timestamp at time zone 'UTC' as "action_timestamp" from "matomo" order by "action_timestamp" desc limit $1", + [ + 1, + ], + ], + [ + "select count(distinct "idvisit") as "count" from "matomo" where date(timezone('UTC', action_timestamp)) = $1", + [ + "2023-03-29", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "select count(distinct "idvisit") as "count" from "matomo" where date(timezone('UTC', action_timestamp)) = $1", + [ + "2023-03-30", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "select count(distinct "idvisit") as "count" from "matomo" where date(timezone('UTC', action_timestamp)) = $1", + [ + "2023-03-31", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "select count(distinct "idvisit") as "count" from "matomo" where date(timezone('UTC', action_timestamp)) = $1", + [ + "2023-04-01", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "select count(distinct "idvisit") as "count" from "matomo" where date(timezone('UTC', action_timestamp)) = $1", + [ + "2023-04-02", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 123, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "123_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_eventcategory", "action_eventaction", "action_eventname", "action_eventvalue", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_0", + "event", + "Evènement", + "Ecommerce", + "Cart change", + "added - Basic Wetsuit", + 1, + 48, + "2021-08-20T21:35:18.000Z", + "https://dive-shop.net/products/basic-wetsuit/", + { + "page-author": "Julien", + "post-age": "-430 days", + }, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_1", + "action", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:25.000Z", + "https://dive-shop.net/products/diving-boots/", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], + [ + "insert into "matomo" ("idsite", "idvisit", "actions", "country", "region", "city", "operatingsystemname", "devicemodel", "devicebrand", "visitduration", "dayssincefirstvisit", "visitortype", "visitorid", "referrertype", "referrername", "sitename", "userid", "serverdateprettyfirstaction", "action_id", "action_type", "action_title", "action_timespent", "action_timestamp", "action_url", "sitesearchkeyword", "usercustomproperties", "usercustomdimensions", "dimension1", "dimension2", "dimension3", "dimension4", "dimension5", "dimension6", "dimension7", "dimension8", "dimension9", "dimension10") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37) on conflict do nothing", + [ + "42", + 124, + "2", + "Argentine", + "Buenos Aires", + "Buenos Aires", + "Mac", + "Générique Bureau", + "Inconnu", + "300", + "23", + "returningCustomer", + "visitorId", + "referrerType", + "referrerName", + "tests", + "24", + "2021-08-20T21:55:12.000Z", + "124_2", + "search", + "Divezone Brand Diving Boots - Divezone Store", + "2", + "2021-08-20T21:30:22.000Z", + "https://dive-shop.net/products/diving-boots/", + "scuba", + {}, + { + "dimension1": "guest", + "dimension10": "36", + "dimension2": "julien", + "dimension3": "page", + "dimension4": "indonesia", + "dimension5": "diving", + "dimension6": "shop", + "dimension7": "v1.2.3", + "dimension8": "fr", + "dimension9": "light", + }, + "guest", + "julien", + "page", + "indonesia", + "diving", + "shop", + "v1.2.3", + "fr", + "light", + "36", + ], + ], +] +`; diff --git a/src/__tests__/importDate.test.js b/src/__tests__/importDate.test.js deleted file mode 100644 index 55eb50f..0000000 --- a/src/__tests__/importDate.test.js +++ /dev/null @@ -1,133 +0,0 @@ -const { importDate } = require("../importDate"); - -const mock_pgQuery = jest.fn(); -const mock_matomoApi = jest.fn(); - -process.env.MATOMO_SITE = "42"; -process.env.PROJECT_NAME = "some-project"; - -const matomoVisit = require("./visit.json"); - -jest.mock("pg", () => { - class Client { - escapeIdentifier(name) { - return name; - } - end() {} - connect() { - return Promise.resolve(); - } - query(...args) { - return mock_pgQuery(...args); - } - } - return { - Client, - }; -}); - -jest.mock("piwik-client", () => { - class MatomoClient { - api(...args) { - return mock_matomoApi(...args); - } - } - return MatomoClient; -}); - -beforeEach(() => { - jest.resetAllMocks(); - jest.resetModules(); - process.env.STARTDATE = ""; -}); - -test("importDate: should import all events for a given date", async () => { - const pgSpy = jest.fn().mockResolvedValue(); - const matomoSpy = jest.fn().mockImplementation((options, cb) => { - return cb(null, [ - { - ...matomoVisit, - idVisit: 123, - }, - { - ...matomoVisit, - idVisit: 124, - }, - ]); - }); - const fakeClient = { - escapeIdentifier(name) { - return name; - }, - query: pgSpy, - }; - //@ts-expect-error - await importDate(fakeClient, matomoSpy, new Date("2021-08-02")); - expect(matomoSpy.mock.calls.map((c) => c[0])).toMatchSnapshot(); - expect(pgSpy.mock.calls).toMatchSnapshot(); -}); - -test("importDate: should import when new results", async () => { - const pgResult = { rows: [] }; - const pgSpy = jest.fn().mockResolvedValue(pgResult); - const matomoSpy = jest.fn().mockImplementation((options, cb) => { - return cb(null, [ - { - ...matomoVisit, - idVisit: 123, - }, - ]); - }); - const fakeClient = { - query: pgSpy, - escapeIdentifier(name) { - return name; - }, - }; - //@ts-expect-error - const imported = await importDate(fakeClient, matomoSpy, new Date("2021-08-03T00:00:00")); - expect(pgSpy.mock.calls.length).toEqual(4); - expect(imported.length).toEqual(3); - expect(matomoSpy.mock.calls[0][0].filter_offset).toEqual(0); -}); - -test("importDate: should offset matomo calls when results already exist", async () => { - const pgResult = { rows: [{ count: 42 }] }; - const pgSpy = jest.fn().mockResolvedValue(pgResult); - const matomoSpy = jest.fn().mockImplementation((options, cb) => { - return cb(null, [ - { - ...matomoVisit, - idVisit: 123, - }, - ]); - }); - const fakeClient = { - query: pgSpy, - escapeIdentifier(name) { - return name; - }, - }; - //@ts-expect-error - const imported = await importDate(fakeClient, matomoSpy, new Date("2021-08-03T00:00:00")); - expect(pgSpy.mock.calls.length).toEqual(4); - expect(imported.length).toEqual(3); - expect(matomoSpy.mock.calls[0][0].filter_offset).toEqual(42); -}); - -test("importDate: should NOT import when no matomo results", async () => { - const pgSpy = jest.fn().mockResolvedValue({ rows: [{ action_timestamp: 1627948800000 }] }); - const matomoSpy = jest.fn().mockImplementation((options, cb) => { - return cb(null, []); - }); - const fakeClient = { - query: pgSpy, - escapeIdentifier(name) { - return name; - }, - }; - //@ts-expect-error - const imported = await importDate(fakeClient, matomoSpy, new Date("2021-08-03")); - expect(pgSpy.mock.calls.length).toEqual(1); - expect(imported.length).toEqual(0); -}); diff --git a/src/__tests__/importDate.test.ts b/src/__tests__/importDate.test.ts new file mode 100644 index 0000000..5ebf6da --- /dev/null +++ b/src/__tests__/importDate.test.ts @@ -0,0 +1,135 @@ +process.env.MATOMO_SITE = "42"; +process.env.PROJECT_NAME = "some-project"; +process.env.RESULTPERPAGE = "10"; + +import { Pool } from "pg"; + +import matomoVisit from "./visit.json"; + +import { importDate } from "../importDate"; + +const TEST_DATE = new Date(2023, 3, 15); + +let queries: any[] = []; + +let result = { + command: "string", + rowCount: 0, +}; + +jest.mock("pg", () => { + const client = { + query: (query: string, values: any) => { + queries.push([query, values]); + return result; + }, + release: jest.fn(), + }; + const methods = { + connect: () => client, + on: jest.fn(), + query: jest.fn(), + }; + return { Pool: jest.fn(() => methods) }; +}); + +let pool: any; +beforeEach(() => { + pool = new Pool(); + queries = []; +}); +afterEach(() => { + jest.clearAllMocks(); +}); + +test("importDate: should import given date", async () => { + const piwikApi = jest.fn(); + + piwikApi.mockImplementation((options, cb) => { + cb(null, [ + { + ...matomoVisit, + idVisit: 123, + }, + { + ...matomoVisit, + idVisit: 124, + }, + ]); + }); + + pool.query.mockResolvedValueOnce({ rows: [], rowCount: 0 }); + + await importDate(piwikApi, TEST_DATE); + + expect(piwikApi.mock.calls.length).toEqual(1); + + expect(piwikApi.mock.calls[0][0]).toMatchInlineSnapshot(` +{ + "date": "2023-04-15", + "filter_limit": 10, + "filter_offset": 0, + "filter_sort_order": "asc", + "idSite": "42", + "method": "Live.getLastVisitsDetails", + "period": "day", +} +`); + expect(queries[0]).toMatchInlineSnapshot(` +[ + "select count(distinct "idvisit") as "count" from "matomo" where date(timezone('UTC', action_timestamp)) = $1", + [ + "2023-04-15", + ], +] +`); + expect(queries.length).toEqual(1 + matomoVisit.actionDetails.length * 2); +}); + +test("importDate: should paginate matomo API calls and produce 46 queries", async () => { + const piwikApi = jest.fn(); + let calls = 0; + + piwikApi.mockImplementation((options, cb) => { + cb( + null, + Array.from({ length: calls ? 5 : 10 }, (k, v) => ({ + ...matomoVisit, + idVisit: k, + })) + ); + calls++; + }); + + pool.query.mockResolvedValueOnce({ rows: [], rowCount: 0 }); + + await importDate(piwikApi, TEST_DATE); + + expect(piwikApi.mock.calls.length).toEqual(2); + + expect(piwikApi.mock.calls[0][0]).toMatchInlineSnapshot(` +{ + "date": "2023-04-15", + "filter_limit": 10, + "filter_offset": 0, + "filter_sort_order": "asc", + "idSite": "42", + "method": "Live.getLastVisitsDetails", + "period": "day", +} +`); + expect(piwikApi.mock.calls[1][0]).toMatchInlineSnapshot(` +{ + "date": "2023-04-15", + "filter_limit": 10, + "filter_offset": 10, + "filter_sort_order": "asc", + "idSite": "42", + "method": "Live.getLastVisitsDetails", + "period": "day", +} +`); + + expect(queries.length).toEqual(1 + matomoVisit.actionDetails.length * 15); + expect(queries).toMatchSnapshot(); +}); diff --git a/src/__tests__/importEvent.test.js b/src/__tests__/importEvent.test.js deleted file mode 100644 index b97a2cb..0000000 --- a/src/__tests__/importEvent.test.js +++ /dev/null @@ -1,22 +0,0 @@ -process.env.MATOMO_SITE = "42"; -process.env.PROJECT_NAME = "some-project"; - -const matomoVisit = require("./visit.json"); -const { getEventsFromMatomoVisit, importEvent } = require("../importEvent"); - -test("importEvent: should extract events from matomo visit actionsDetails and create insert queries", () => { - //@ts-expect-error - const visits = getEventsFromMatomoVisit(matomoVisit); - expect(visits).toMatchSnapshot(); - const spy = jest.fn(); - spy.mockResolvedValue(Promise.resolve()); - const fakeClient = { - escapeIdentifier(name) { - return name; - }, - query: spy, - }; - //@ts-expect-error - visits.map((visit) => importEvent(fakeClient, visit)); - expect(spy.mock.calls).toMatchSnapshot(); -}); diff --git a/src/__tests__/importEvent.test.ts b/src/__tests__/importEvent.test.ts new file mode 100644 index 0000000..787a759 --- /dev/null +++ b/src/__tests__/importEvent.test.ts @@ -0,0 +1,12 @@ +process.env.MATOMO_SITE = "42"; +process.env.PROJECT_NAME = "some-project"; +process.env.RESULTPERPAGE = "10"; + +import matomoVisit from "./visit.json"; +import { getEventsFromMatomoVisit } from "../importEvent"; + +test("getEventsFromMatomoVisit: should merge action events", () => { + // @ts-ignore + const visits = getEventsFromMatomoVisit(matomoVisit); + expect(visits).toMatchSnapshot(); +}); diff --git a/src/__tests__/index.test.js b/src/__tests__/index.test.js deleted file mode 100644 index 522a8b0..0000000 --- a/src/__tests__/index.test.js +++ /dev/null @@ -1,194 +0,0 @@ -const mock_pgQuery = jest.fn(); -const mock_matomoApi = jest.fn(); -const formatISO = require("date-fns/formatISO"); -const addDays = require("date-fns/addDays"); - -const { OFFSET } = require("../config"); - -process.env.MATOMO_SITE = "42"; -process.env.PROJECT_NAME = "some-project"; - -const matomoVisit = require("./visit.json"); - -const run = require("../index"); - -const NB_REQUEST_TO_INIT_DB = 3; // Number of query to init DB (createTable.js) -const TEST_DATE = new Date(); - -// @ts-ignore -const isoDate = (date) => formatISO(date, { representation: "date" }); - -jest.mock("pg", () => { - class Client { - escapeIdentifier(name) { - return name; - } - end() {} - connect() { - return Promise.resolve(); - } - query(...args) { - return Promise.resolve(mock_pgQuery(...args)); - } - } - return { - Client, - }; -}); - -jest.mock("piwik-client", () => { - class MatomoClient { - api(...args) { - return mock_matomoApi(...args); - } - } - return MatomoClient; -}); - -beforeEach(() => { - jest.resetAllMocks(); - jest.resetModules(); - process.env.STARTDATE = ""; - //process.env.OFFSET = ""; -}); - -test("run: should create table", async () => { - mock_pgQuery.mockReturnValue({ rows: [] }); - mock_matomoApi.mockImplementation((options, cb) => { - return cb(null, []); - }); - await run(); - expect(mock_pgQuery.mock.calls[0]).toMatchSnapshot(); -}); - -test("run: should fetch the latest event date if no date provided", async () => { - jest.useFakeTimers("modern").setSystemTime(TEST_DATE.getTime()); - mock_pgQuery.mockReturnValue({ rows: [] }); - - mock_matomoApi.mockImplementation((options, cb) => { - return cb(null, [ - { - ...matomoVisit, - idVisit: 123, - }, - { - ...matomoVisit, - idVisit: 124, - }, - ]); - }); - - await run(); - - // check matomo requests - expect(mock_matomoApi.mock.calls[0][0].date).toEqual(isoDate(TEST_DATE)); - expect(mock_matomoApi.mock.calls[0][0].filter_offset).toEqual(0); - - // check db queries - expect(mock_pgQuery.mock.calls[NB_REQUEST_TO_INIT_DB][0]).toEqual( - "select action_timestamp from matomo order by action_timestamp desc limit 1" - ); -}); - -test("run: should resume using latest event date - offset if no date provided", async () => { - jest.useFakeTimers("modern").setSystemTime(TEST_DATE.getTime()); - - const LAST_EVENT_DATE_OFFSET = 2; - // @ts-ignore - const LAST_EVENT_DATE = addDays(TEST_DATE, -LAST_EVENT_DATE_OFFSET); - - mock_pgQuery.mockReturnValue({ rows: [{ action_timestamp: LAST_EVENT_DATE.getTime() }] }); - - mock_matomoApi.mockImplementation((options, cb) => { - return cb(null, [ - { - ...matomoVisit, - idVisit: 123, - }, - { - ...matomoVisit, - idVisit: 124, - }, - ]); - }); - - await run(); - - // check matomo requests - expect(mock_matomoApi.mock.calls[0][0].date).toEqual( - // @ts-ignore - isoDate(addDays(LAST_EVENT_DATE, -parseInt(OFFSET))) - ); - expect(mock_matomoApi.mock.calls[0][0].filter_offset).toEqual(0); - - const daysCount = LAST_EVENT_DATE_OFFSET + parseInt(OFFSET) + 1; - expect(mock_matomoApi.mock.calls.length).toEqual(daysCount); - - // check db queries - expect(mock_pgQuery.mock.calls.length).toEqual(NB_REQUEST_TO_INIT_DB + 1 + daysCount * 7); // NB_REQUEST_TO_INIT_DB + select queries + days offset -}); - -test("run: should use today date if nothing in DB", async () => { - jest.useFakeTimers("modern").setSystemTime(TEST_DATE.getTime()); - mock_pgQuery.mockReturnValue({ rows: [] }); - - mock_matomoApi.mockImplementation((options, cb) => { - return cb(null, [ - { - ...matomoVisit, - idVisit: 123, - }, - ]); - }); - - await run(); - - // check matomo requests - expect(mock_matomoApi.mock.calls.length).toEqual(1); - expect(mock_matomoApi.mock.calls[0][0].date).toEqual(isoDate(TEST_DATE)); - - // check the 4 events inserted - expect(mock_pgQuery.mock.calls.length).toEqual(NB_REQUEST_TO_INIT_DB + 5); // NB_REQUEST_TO_INIT_DB + check date + latest + 2 inserts -}); - -test("run: should use given date if any", async () => { - jest.useFakeTimers("modern").setSystemTime(TEST_DATE.getTime()); - mock_pgQuery.mockReturnValue({ rows: [] }); - - mock_matomoApi.mockImplementation((options, cb) => { - return cb(null, [ - { - ...matomoVisit, - idVisit: 123, - }, - ]); - }); - - // @ts-ignore - await run(isoDate(addDays(TEST_DATE, -10)) + "T00:00:00.000Z"); - - expect(mock_matomoApi.mock.calls.length).toEqual(11); - expect(mock_pgQuery.mock.calls.length).toEqual(NB_REQUEST_TO_INIT_DB + 11 * 4); // NB_REQUEST_TO_INIT_DB + inserts. no initial select as date is provided -}); - -test("run: should use STARTDATE if any", async () => { - // @ts-ignore - process.env.STARTDATE = isoDate(addDays(TEST_DATE, -5)) + "T00:00:00.000Z"; - jest.useFakeTimers("modern").setSystemTime(TEST_DATE.getTime()); - mock_pgQuery.mockReturnValue({ rows: [] }); - - mock_matomoApi.mockImplementation((options, cb) => { - return cb(null, [ - { - ...matomoVisit, - idVisit: 123, - }, - ]); - }); - - await run(); - - expect(mock_matomoApi.mock.calls.length).toEqual(6); - - expect(mock_pgQuery.mock.calls.length).toEqual(NB_REQUEST_TO_INIT_DB + 1 + 6 * 4); // NB_REQUEST_TO_INIT_DB + initial select + inserts. -}); diff --git a/src/__tests__/run.test.ts b/src/__tests__/run.test.ts new file mode 100644 index 0000000..1b146f0 --- /dev/null +++ b/src/__tests__/run.test.ts @@ -0,0 +1,95 @@ +process.env.MATOMO_SITE = "42"; +process.env.PROJECT_NAME = "some-project"; +process.env.RESULTPERPAGE = "10"; + +import { Client, Pool } from "pg"; + +import matomoVisit from "./visit.json"; + +import run from "../index"; + +const TEST_DATE = new Date(2023, 3, 1); + +let queries: any[] = []; + +let result: Record = { + command: "string", + rowCount: 0, +}; + +jest.mock("pg", () => { + const client = { + query: (query: string, values: any) => { + queries.push([query, values]); + return result; + }, + release: jest.fn(), + }; + const methods = { + connect: () => client, + on: jest.fn(), + query: jest.fn(), + }; + return { Pool: jest.fn(() => methods) }; +}); + +let pool: any; +beforeEach(() => { + pool = new Pool(); + queries = []; + piwikApiCalls = []; +}); +afterEach(() => { + jest.clearAllMocks(); +}); + +let piwikApiCalls: any[] = []; + +jest.mock("piwik-client", () => { + const matomoVisits = [ + { + ...matomoVisit, + idVisit: 123, + }, + { + ...matomoVisit, + idVisit: 124, + }, + ]; + class PiwikMock { + options: any; + constructor(options: any) { + this.options = options; + } + api(options: any, cb: Function) { + piwikApiCalls.push(options); + cb(null, matomoVisits); + } + } + + return PiwikMock; +}); + +test("run: should fetch the latest 5 days on matomo", async () => { + jest.useFakeTimers().setSystemTime(TEST_DATE.getTime()); + await run(); + expect(piwikApiCalls).toMatchSnapshot(); +}); + +test("run: should fetch the latest event date if no date provided", async () => { + jest.useFakeTimers().setSystemTime(TEST_DATE.getTime()); + await run(); + expect(queries[0]).toMatchSnapshot(); +}); + +test("run: should run based on existing data if any", async () => { + // ensure we use the latest entry in DB + expect(1).toEqual(1); +}); + +test("run: should run SQL queries", async () => { + jest.useFakeTimers().setSystemTime(TEST_DATE.getTime()); + await run(); + expect(queries).toMatchSnapshot(); + expect(queries.length).toEqual(1 + 5 * (6 + 1)); +}); diff --git a/src/config.js b/src/config.js deleted file mode 100644 index ccfd434..0000000 --- a/src/config.js +++ /dev/null @@ -1,9 +0,0 @@ -const MATOMO_KEY = process.env.MATOMO_KEY || ""; -const MATOMO_URL = process.env.MATOMO_URL || "https://matomo.fabrique.social.gouv.fr/"; -const MATOMO_SITE = process.env.MATOMO_SITE || 0; -const PGDATABASE = process.env.PGDATABASE || ""; -const DESTINATION_TABLE = process.env.DESTINATION_TABLE || "matomo"; -const OFFSET = process.env.OFFSET || "3"; -const RESULTPERPAGE = process.env.RESULTPERPAGE || "500"; - -module.exports = { MATOMO_KEY, MATOMO_URL, MATOMO_SITE, PGDATABASE, DESTINATION_TABLE, OFFSET, RESULTPERPAGE }; diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..03860a4 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,9 @@ +import { MatomoTableName } from "types"; + +export const MATOMO_KEY = process.env.MATOMO_KEY || ""; +export const MATOMO_URL = process.env.MATOMO_URL || "https://matomo.fabrique.social.gouv.fr/"; +export const MATOMO_SITE = process.env.MATOMO_SITE || 0; +export const PGDATABASE = process.env.PGDATABASE || ""; +export const DESTINATION_TABLE: MatomoTableName = process.env.DESTINATION_TABLE || "matomo"; +export const INITIAL_OFFSET = process.env.INITIAL_OFFSET || "3"; +export const RESULTPERPAGE = process.env.RESULTPERPAGE || "500"; diff --git a/src/createTable.js b/src/createTable.js deleted file mode 100644 index c32426e..0000000 --- a/src/createTable.js +++ /dev/null @@ -1,83 +0,0 @@ -const { Client } = require("pg"); - -const { DESTINATION_TABLE } = require("./config"); - -/** - * - * @param {Client} client - */ -async function createTable(client) { - const table = client.escapeIdentifier(DESTINATION_TABLE); - const text = ` - -CREATE SCHEMA IF NOT EXISTS partman; -CREATE EXTENSION IF NOT EXISTS pg_partman SCHEMA partman; -CREATE TABLE IF NOT EXISTS ${table} -( - idsite text, - idvisit text, - actions text, - country text, - region text, - city text, - operatingsystemname text, - devicemodel text, - devicebrand text, - visitduration text, - dayssincefirstvisit text, - visitortype text, - sitename text, - userid text, - serverdateprettyfirstaction date, - action_id text, - action_type text, - action_eventcategory text, - action_eventaction text, - action_eventname text, - action_eventvalue decimal, - action_timespent text, - action_timestamp timestamp with time zone DEFAULT now(), - usercustomproperties json, - usercustomdimensions json, - dimension1 text, - dimension2 text, - dimension3 text, - dimension4 text, - dimension5 text, - dimension6 text, - dimension7 text, - dimension8 text, - dimension9 text, - dimension10 text, - action_url text, - sitesearchkeyword text, - action_title text, - visitorid text, - referrertype text, - referrername text -) PARTITION BY RANGE (action_timestamp); -`; - - await client.query(text, []); - - const migrations = [ - `CREATE INDEX IF NOT EXISTS idx_dimension1 ON ${table}(dimension1); - CREATE INDEX IF NOT EXISTS idx_dimension2 ON ${table}(dimension2); - CREATE INDEX IF NOT EXISTS idx_dimension3 ON ${table}(dimension3); - CREATE INDEX IF NOT EXISTS idx_dimension4 ON ${table}(dimension4); - CREATE INDEX IF NOT EXISTS idx_dimension5 ON ${table}(dimension5); - CREATE INDEX IF NOT EXISTS idx_userid ON ${table}(userid); - CREATE INDEX IF NOT EXISTS idx_actionurl ON ${table}(action_url); - CREATE INDEX IF NOT EXISTS idx_region ON ${table}(region);`, - `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS visitorid text; - ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS referrertype text; - ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS referrername text; - CREATE INDEX IF NOT EXISTS idx_visitorid ON ${table}(visitorid);`, - ]; - - for (const query of migrations) { - await client.query(query, []); - } -} - -module.exports = { createTable }; diff --git a/src/db.ts b/src/db.ts new file mode 100644 index 0000000..7749cee --- /dev/null +++ b/src/db.ts @@ -0,0 +1,25 @@ +import { Pool } from "pg"; +import { Kysely, PostgresDialect } from "kysely"; +import { MatomoTable } from "types"; +import startDebug from "debug"; +import { PGDATABASE } from "./config"; + +const debug = startDebug("db"); + +export interface Database { + [key: string]: MatomoTable; +} + +export const db = new Kysely({ + dialect: new PostgresDialect({ + pool: new Pool({ + connectionString: PGDATABASE, + }), + }), + log(event) { + if (event.level === "query") { + // debug(event.query.sql); + // debug(event.query.parameters); + } + }, +}); diff --git a/src/importDate.js b/src/importDate.js deleted file mode 100644 index 3e27b49..0000000 --- a/src/importDate.js +++ /dev/null @@ -1,105 +0,0 @@ -const { Client } = require("pg"); -const pAll = require("p-all"); -const debug = require("debug")("importDate"); -const formatISO = require("date-fns/formatISO"); - -const { importEvent, getEventsFromMatomoVisit } = require("./importEvent"); - -const { RESULTPERPAGE, MATOMO_SITE, DESTINATION_TABLE } = require("./config"); - -/** - * return date as ISO yyyy-mm-dd - * - * @param {Date} date date - * - * @returns {string} - */ -// @ts-ignore -const isoDate = (date) => formatISO(date, { representation: "date" }); - -/** - * check count if imported rows for given date - * - * @param {Client} client PG client - * @param {Date} date datetime as ISO string - * - * @returns {Promise} - */ -const getRecordsCount = async (client, date) => { - const text = `SELECT COUNT(distinct idvisit) FROM ${client.escapeIdentifier( - DESTINATION_TABLE - )} WHERE action_timestamp::date='${isoDate(date)}';`; - const result = await client.query(text); - return parseInt((result && result.rows && result.rows.length && result.rows[0].count) || 0); -}; - -/** - * import all matomo data for a given date - * - * @param {Client} client PG client - * @param {any} piwikApi piwik.api instance - * @param {Date} date datetime as ISO string - * - * @returns {Promise} - */ -const importDate = async (client, piwikApi, date, filterOffset = 0) => { - const limit = parseInt(RESULTPERPAGE); - const offset = filterOffset || (await getRecordsCount(client, date)); - if (!offset) { - debug(`${isoDate(date)}: load ${limit} visits`); - } else { - debug(`${isoDate(date)}: load ${limit} more visits after ${offset}`); - } - // fetch visits details - const visits = await new Promise((resolve) => - piwikApi( - { - method: "Live.getLastVisitsDetails", - period: "day", - date: isoDate(date), - filter_limit: limit, - filter_offset: offset, - filter_sort_order: "asc", - idSite: MATOMO_SITE, - }, - (err, responseObject = []) => { - if (err) { - console.error("err", err); - resolve([]); - } - return resolve(responseObject || []); - } - ) - ); - - debug(`fetched ${visits.length} visits`); - - // flatten events - const allEvents = visits.flatMap(getEventsFromMatomoVisit); - - if (!allEvents.length) { - debug(`no more valid events after ${isoDate(date)}`); - return []; - } - - debug(`import ${allEvents.length} events`); - - // serial-import events into PG - const importedEvents = await pAll( - allEvents.map((event) => () => importEvent(client, event)), - { concurrency: 10, stopOnError: true } - ); - - // continue to next page if necessary - if (visits.length === limit) { - const nextOffset = offset + limit; - const nextEvents = await importDate(client, piwikApi, date, nextOffset); - return [...importedEvents, ...(nextEvents || [])]; - } - - debug(`finished importing ${isoDate(date)}, offset ${offset}`); - - return importedEvents || []; -}; - -module.exports = { importDate }; diff --git a/src/importDate.ts b/src/importDate.ts new file mode 100644 index 0000000..e5cb92f --- /dev/null +++ b/src/importDate.ts @@ -0,0 +1,96 @@ +import pAll from "p-all"; +import startDebug from "debug"; +import formatISO from "date-fns/formatISO"; +import { sql } from "kysely"; + +import { db } from "./db"; +import { Visit, Visits } from "../types/matomo-api"; +import { importEvent, getEventsFromMatomoVisit } from "./importEvent"; +import { RESULTPERPAGE, MATOMO_SITE, DESTINATION_TABLE } from "./config"; + +const debug = startDebug("importDate"); + +/** return date as ISO yyyy-mm-dd */ +const isoDate = (date: Date) => formatISO(date, { representation: "date" }); + +/** check how many visits complete for a given date */ +const getRecordsCount = async (date: string): Promise => { + const result = await db + .selectFrom(DESTINATION_TABLE) + .select(db.fn.count("idvisit").distinct().as("count")) + // UTC to be iso with matomo matomo data + .where(sql`date(timezone('UTC', action_timestamp))`, "=", date) + .executeTakeFirst(); + // start at previous visit in case action didnt finished to record + const count = Math.max(0, (result && parseInt(result.count) - 1) || 0); + return count; +}; + +/** import all event from givent date */ +export const importDate = async (piwikApi: any, date: Date, filterOffset = 0): Promise => { + const limit = parseInt(RESULTPERPAGE); + const offset = filterOffset || (await getRecordsCount(isoDate(date))); + if (!offset) { + debug(`${isoDate(date)}: load ${limit} visits`); + } else { + debug(`${isoDate(date)}: load ${limit} more visits after ${offset}`); + } + + // fetch visits details + const visits: Visits = await new Promise((resolve) => + piwikApi( + { + method: "Live.getLastVisitsDetails", + period: "day", + date: isoDate(date), + // minTimestamp: isoDate(new Date()) === isoDate(date) ? date.getTime() / 1000 : undefined, // if today, dont go further (??) + filter_limit: limit, + filter_offset: offset, + filter_sort_order: "asc", + idSite: MATOMO_SITE, + }, + (err: Error, visits: Visit[] = []) => { + if (err) { + console.error("err", err); + resolve([]); + } + return resolve(visits); + } + ) + ); + + debug(`fetched ${visits.length} visits`); + + // flatten all events + const eventsFromVisits = visits.flatMap(getEventsFromMatomoVisit); + + const allEvents = eventsFromVisits.filter((event) => { + return true; + }); + + if (!allEvents.length) { + debug(`no more valid events after ${isoDate(date)}`); + return []; + } + + debug(`import ${allEvents.length} events`); + + // serial-import events into PG + const importedEvents = await pAll( + allEvents.map((event: any) => () => importEvent(event)), + { concurrency: 10, stopOnError: true } + ); + + // continue to next page if necessary + if (visits.length === limit) { + const nextOffset = offset + limit; + const nextEvents = await importDate(piwikApi, date, nextOffset); + return [...importedEvents, ...(nextEvents || [])]; + } + + debug(`finished importing ${isoDate(date)}, offset ${offset}`); + + return importedEvents || []; +}; + +module.exports = { importDate }; diff --git a/src/importEvent.js b/src/importEvent.js deleted file mode 100644 index ace7d5b..0000000 --- a/src/importEvent.js +++ /dev/null @@ -1,108 +0,0 @@ -const { Client } = require("pg"); - -const { DESTINATION_TABLE } = require("./config"); - -/** - * - * @param {Client} client - * @param {import("types").Event} event - * - * @return {Promise>} - */ -const importEvent = (client, event) => { - const eventKeys = Object.keys(event); - const text = `insert into ${client.escapeIdentifier(DESTINATION_TABLE)} - (${eventKeys.join(", ")}) - values (${eventKeys.map((k, i) => `\$${i + 1}`).join(", ")}) - ON CONFLICT DO NOTHING`; - const values = [...eventKeys.map((k) => event[k])]; - return client.query(text, values).catch((e) => { - console.log("QUERY error", e); - return { rows: [] }; - }); -}; - -const matomoProps = [ - "idSite", - "idVisit", - "actions", - "country", - "region", - "city", - "operatingSystemName", - "deviceModel", - "deviceBrand", - "visitDuration", - "daysSinceFirstVisit", - "visitorType", - "visitorId", - "referrerType", - "referrerName", - "siteName", - "userId", -]; - -/** @type Record string | number> */ -const actionProps = { - action_type: (action) => action.type, - action_title: (action) => action.title, - action_eventcategory: (action) => action.eventCategory, - action_eventaction: (action) => action.eventAction, - action_eventname: (action) => action.eventName, - action_eventvalue: (action) => action.eventValue, - action_timespent: (action) => action.timeSpent, - action_timestamp: (action) => new Date(action.timestamp * 1000).toISOString(), - action_url: (action) => action.url, - siteSearchKeyword: (action) => action.siteSearchKeyword, -}; - -/** - * Convert a single matomo visit {} matomoVisit - * - * @return {import("types").Event[]} list of events - * - */ -const getEventsFromMatomoVisit = (matomoVisit) => { - return matomoVisit.actionDetails.map((actionDetail, actionIndex) => { - /** @type {Record} */ - const usercustomproperties = {}; - for (let k = 1; k < 10; k++) { - const property = actionDetail.customVariables && actionDetail.customVariables[k]; - if (!property) continue; // max 10 custom variables - usercustomproperties[property[`customVariableName${k}`]] = property[`customVariableValue${k}`]; - } - - /** @type {Record} */ - const usercustomdimensions = {}; - for (let k = 1; k < 11; k++) { - const dimension = `dimension${k}`; - const value = actionDetail[dimension] || matomoVisit[dimension]; - if (!value) continue; // max 10 custom variables - usercustomdimensions[dimension] = value; - } - - /** @type {import("types").Event} */ - // @ts-ignore - const event = { - // default matomo visit properties - ...matomoProps.reduce((a, prop) => ({ ...a, [prop.toLowerCase()]: matomoVisit[prop] }), {}), - serverdateprettyfirstaction: new Date((matomoVisit.firstActionTimestamp || 0) * 1000).toISOString(), - // action specific properties - ...Object.keys(actionProps).reduce((a, prop) => ({ ...a, [prop]: actionProps[prop](actionDetail) }), { - action_id: `${matomoVisit.idVisit}_${actionIndex}`, - }), - // custom variables - usercustomproperties, - // custom dimensions - // We keep both for backwards compatibility. - // Current implementation is flat with one column for each dimension. - usercustomdimensions, - ...usercustomdimensions, - }; - return event; - }); -}; - -module.exports = { getEventsFromMatomoVisit, importEvent }; diff --git a/src/importEvent.ts b/src/importEvent.ts new file mode 100644 index 0000000..c6643fb --- /dev/null +++ b/src/importEvent.ts @@ -0,0 +1,127 @@ +import { InsertResult } from "kysely"; +import { ActionDetail, Visit } from "types/matomo-api"; + +import { DESTINATION_TABLE } from "./config"; +import { db } from "./db"; + +/** + * + * @param {Client} client + * @param {import("types").Event} event + * + * @return {Promise>} + */ +export const importEvent = (event: MatomoActionDetail): Promise => + // @ts-ignore // TODO + db + .insertInto(DESTINATION_TABLE) + .values([{ ...event }]) + .onConflict((oc) => oc.doNothing()) + .execute(); + +const matomoProps = [ + "idSite", + "idVisit", + "actions", + "country", + "region", + "city", + "operatingSystemName", + "deviceModel", + "deviceBrand", + "visitDuration", + "daysSinceFirstVisit", + "visitorType", + "visitorId", + "referrerType", + "referrerName", + "siteName", + "userId", +] as const; + +/** @type Record string | number> */ +const actionProps = { + action_type: (action: ActionDetail) => action.type, + action_title: (action: ActionDetail) => action.title, + action_eventcategory: (action: ActionDetail) => action.eventCategory, + action_eventaction: (action: ActionDetail) => action.eventAction, + action_eventname: (action: ActionDetail) => action.eventName, + action_eventvalue: (action: ActionDetail) => action.eventValue, + action_timespent: (action: ActionDetail) => action.timeSpent, + action_timestamp: (action: ActionDetail) => new Date(action.timestamp * 1000).toISOString(), + action_url: (action: ActionDetail) => action.url, + sitesearchkeyword: (action: ActionDetail) => action.siteSearchKeyword, +}; + +export const getEventsFromMatomoVisit = (matomoVisit: Visit): MatomoActionDetail[] => { + return matomoVisit.actionDetails.map((actionDetail, actionIndex) => { + const usercustomproperties: Record = {}; + for (let k = 1; k < 10; k++) { + const property = actionDetail.customVariables && actionDetail.customVariables[k]; + if (!property) continue; // max 10 custom variables + //@ts-ignore + usercustomproperties[property[`customVariableName${k}`]] = property[`customVariableValue${k}`]; + } + + /** @type {Record} */ + const usercustomdimensions = {}; + for (let k = 1; k < 11; k++) { + const dimension = `dimension${k}`; + //@ts-ignore + const value = actionDetail[dimension] || matomoVisit[dimension]; + if (!value) continue; // max 10 custom variables + //@ts-ignore + usercustomdimensions[dimension] = value; + } + + const event = { + // default matomo visit properties + ...matomoProps.reduce((a, prop) => ({ ...a, [prop.toLowerCase()]: matomoVisit[prop] }), {}), + serverdateprettyfirstaction: new Date((matomoVisit.firstActionTimestamp || 0) * 1000).toISOString(), + // action specific properties + ...Object.keys(actionProps).reduce( + (a, prop) => ({ + ...a, + [prop.toLowerCase()]: actionProps[prop as ActionPropsKeys](actionDetail), + }), + { + action_id: `${matomoVisit.idVisit}_${actionIndex}`, + } + ), + // custom variables + usercustomproperties, + // custom dimensions + // We keep both for backwards compatibility. + // Current implementation is flat with one column for each dimension. + usercustomdimensions, + ...usercustomdimensions, + }; + return event; + }); +}; + +type ActionPropsKeys = keyof typeof actionProps; + +type AllMatomoActionDetailKeys = + | Lowercase + | Lowercase + | "dimension1" + | "dimension2" + | "dimension3" + | "dimension4" + | "dimension5" + | "dimension6" + | "dimension7" + | "dimension8" + | "dimension9" + | "dimension10" + | "action_id" + | "usercustomproperties" + | "usercustomdimensions" + | "serverdateprettyfirstaction"; + +type MatomoActionDetail = Partial< + Record & { usercustomproperties: any } & { + usercustomdimensions: any; + } +>; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index c6abc07..0000000 --- a/src/index.js +++ /dev/null @@ -1,79 +0,0 @@ -const pAll = require("p-all"); -const debug = require("debug")("index"); -const eachDayOfInterval = require("date-fns/eachDayOfInterval"); -const PiwikClient = require("piwik-client"); -const { Client } = require("pg"); - -const { MATOMO_KEY, MATOMO_URL, MATOMO_SITE, PGDATABASE, DESTINATION_TABLE, OFFSET } = require("./config"); - -const { createTable } = require("./createTable"); -const { importDate } = require("./importDate"); - -// run a sync with a 3-days range -/** - * - * @param {string} [date] - * @returns - */ -async function run(date) { - debug("run, date=" + date); - const client = new Client({ connectionString: PGDATABASE }); - await client.connect(); - - const piwik = new PiwikClient(MATOMO_URL, MATOMO_KEY); - - await createTable(client); - - // priority: - // - optional parameter date - // - last event in the table - // - optional env.STARTDATE - // - today - - let referenceDate; - if (!referenceDate && date) referenceDate = new Date(date); - if (!referenceDate) referenceDate = await findLastEventInMatomo(client); - if (!referenceDate && process.env.STARTDATE) referenceDate = new Date(process.env.STARTDATE); - if (!referenceDate) referenceDate = new Date(); - - // @ts-ignore - const dates = eachDayOfInterval({ - start: referenceDate, - end: new Date(), - }); - - debug(`import : ${dates.join(", ")}`); - - // for each date, serial-import data - const res = await pAll( - dates.map((date) => () => importDate(client, piwik.api.bind(piwik), date)), - { concurrency: 1, stopOnError: true } - ); - - await client.end(); - debug("close"); - - return res; -} - -module.exports = run; - -if (require.main === module) { - (async () => { - if (!MATOMO_SITE) return console.error("Missing env MATOMO_SITE"); - if (!MATOMO_KEY) return console.error("Missing env MATOMO_KEY"); - if (!PGDATABASE) return console.error("Missing env PGDATABASE"); - await run(); - debug("run finished"); - })(); -} - -async function findLastEventInMatomo(client) { - const a = await client.query( - `select action_timestamp from ${client.escapeIdentifier(DESTINATION_TABLE)} order by action_timestamp desc limit 1` - ); - if (!a.rows.length || !a.rows[0].action_timestamp) return null; - const d = new Date(a.rows[0].action_timestamp); - d.setDate(d.getDate() - +OFFSET); - return d; -} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..4832fc9 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,82 @@ +import { Kysely, sql } from "kysely"; + +import pAll from "p-all"; + +import startDebug from "debug"; + +import eachDayOfInterval from "date-fns/eachDayOfInterval"; +import PiwikClient from "piwik-client"; + +import { Database, db } from "./db"; + +import { MATOMO_KEY, MATOMO_URL, MATOMO_SITE, PGDATABASE, DESTINATION_TABLE, INITIAL_OFFSET } from "./config"; + +import { importDate } from "./importDate"; + +const debug = startDebug("index"); + +async function run(date?: string) { + debug("run, date=" + date); + + const piwik = new PiwikClient(MATOMO_URL, MATOMO_KEY); + + // priority: + // - optional parameter date + // - last event in the table + // - optional env.STARTDATE + // - today + + let referenceDate; + if (!referenceDate && date) referenceDate = new Date(date); + if (!referenceDate) referenceDate = await findLastEventInMatomo(db); + if (!referenceDate && process.env.STARTDATE) referenceDate = new Date(process.env.STARTDATE); + if (!referenceDate) referenceDate = new Date(new Date().getTime() - +INITIAL_OFFSET * 24 * 60 * 60 * 1000); + + const dates = eachDayOfInterval({ + start: referenceDate, + end: new Date(new Date().getTime() + 24 * 60 * 60 * 1000), + }); + + debug(`import starting at : ${dates[0].toISOString()}`); + + // for each date, serial-import data + const res = await pAll( + dates.map((date) => () => importDate(piwik.api.bind(piwik), date)), + { concurrency: 1, stopOnError: true } + ); + + debug("close"); + + return res; +} + +export default run; + +if (require.main === module) { + (async () => { + if (!MATOMO_SITE) return console.error("Missing env MATOMO_SITE"); + if (!MATOMO_KEY) return console.error("Missing env MATOMO_KEY"); + if (!PGDATABASE) return console.error("Missing env PGDATABASE"); + await run(); + debug("run finished"); + db.destroy(); + })(); +} + +async function findLastEventInMatomo(db: Kysely) { + const latest = await db + .selectFrom(DESTINATION_TABLE) + .select(sql`action_timestamp at time zone 'UTC'`.as("action_timestamp")) + .orderBy("action_timestamp", "desc") + .limit(1) + .executeTakeFirst(); + + if (latest) { + // check from the day before just to be sure we haev all events + const date = new Date(new Date(latest.action_timestamp).getTime() - 2 * 24 * 60 * 60 * 1000); + + return date; + } + + return null; +} diff --git a/src/migrate-down.ts b/src/migrate-down.ts new file mode 100644 index 0000000..713d2a0 --- /dev/null +++ b/src/migrate-down.ts @@ -0,0 +1,35 @@ +import * as path from "path"; +import { promises as fs } from "fs"; +import { Migrator, FileMigrationProvider } from "kysely"; +import { db } from "./db"; + +async function migrateDown() { + const migrator = new Migrator({ + db, + provider: new FileMigrationProvider({ + fs, + path, + migrationFolder: __dirname + "/migrations", + }), + }); + + const { error, results } = await migrator.migrateDown(); + + results?.forEach((it) => { + if (it.status === "Success") { + console.log(`down migration "${it.migrationName}" was executed successfully`); + } else if (it.status === "Error") { + console.error(`failed to execute down migration "${it.migrationName}"`); + } + }); + + if (error) { + console.error("failed to down migrate"); + console.error(error); + process.exit(1); + } + + await db.destroy(); +} + +migrateDown(); diff --git a/src/migrate-latest.ts b/src/migrate-latest.ts new file mode 100644 index 0000000..2fec58b --- /dev/null +++ b/src/migrate-latest.ts @@ -0,0 +1,50 @@ +import * as path from "path"; +import { promises as fs } from "fs"; +import { Migrator, FileMigrationProvider } from "kysely"; +import { db } from "./db"; +import { DESTINATION_TABLE } from "./config"; + +async function migrateToLatest() { + const migrator = new Migrator({ + db, + provider: new FileMigrationProvider({ + fs, + path, + migrationFolder: __dirname + "/migrations", + }), + // allow to have mutliple migratable instances in a single schema + migrationTableName: `${DESTINATION_TABLE}_migration`, + migrationLockTableName: `${DESTINATION_TABLE}_migration_lock`, + }); + + const { error, results } = await migrator.migrateToLatest(); + + results?.forEach((it) => { + if (it.status === "Success") { + console.log(`migration "${it.migrationName}" was executed successfully`); + } else if (it.status === "Error") { + console.error(`failed to execute migration "${it.migrationName}"`); + } + }); + + if (error) { + console.error("failed to migrate"); + console.error(error); + process.exit(1); + } else { + if (!results?.length) { + console.log("No migration to run"); + } + } +} + +export default migrateToLatest; + +async function start() { + await migrateToLatest(); + await db.destroy(); +} + +if (require.main === module) { + start(); +} diff --git a/src/migrations/20230301-01-initial.ts b/src/migrations/20230301-01-initial.ts new file mode 100644 index 0000000..c36e5d5 --- /dev/null +++ b/src/migrations/20230301-01-initial.ts @@ -0,0 +1,55 @@ +import { Kysely, sql } from "kysely"; + +const DESTINATION_TABLE = process.env.DESTINATION_TABLE || "matomo"; + +export async function up(db: Kysely): Promise { + await db.schema + .createTable(DESTINATION_TABLE) + .ifNotExists() + .addColumn("action_id", "text", (col) => col.unique().notNull()) + .addColumn("idsite", "text") + .addColumn("idvisit", "text") + .addColumn("actions", "text") + .addColumn("country", "text") + .addColumn("region", "text") + .addColumn("city", "text") + .addColumn("operatingsystemname", "text") + .addColumn("devicemodel", "text") + .addColumn("devicebrand", "text") + .addColumn("visitduration", "text") + .addColumn("dayssincefirstvisit", "text") + .addColumn("visitortype", "text") + .addColumn("sitename", "text") + .addColumn("userid", "text") + .addColumn("serverdateprettyfirstaction", "date") + .addColumn("action_type", "text") + .addColumn("action_eventcategory", "text") + .addColumn("action_eventaction", "text") + .addColumn("action_eventname", "text") + .addColumn("action_eventvalue", "numeric") + .addColumn("action_timespent", "text") + .addColumn("action_timestamp", "timestamptz", (col) => col.defaultTo(sql`now()`)) + .addColumn("usercustomproperties", "json") + .addColumn("usercustomdimensions", "json") + .addColumn("dimension1", "text") + .addColumn("dimension2", "text") + .addColumn("dimension3", "text") + .addColumn("dimension4", "text") + .addColumn("dimension5", "text") + .addColumn("dimension6", "text") + .addColumn("dimension7", "text") + .addColumn("dimension8", "text") + .addColumn("dimension9", "text") + .addColumn("dimension10", "text") + .addColumn("action_url", "text") + .addColumn("sitesearchkeyword", "text") + .addColumn("action_title", "text") + .addColumn("visitorid", "text") + .addColumn("referrertype", "text") + .addColumn("referrername", "text") + .execute(); +} + +export async function down(db: Kysely): Promise { + await db.schema.dropTable(DESTINATION_TABLE).execute(); +} diff --git a/src/migrations/20230301-02-indexes.ts b/src/migrations/20230301-02-indexes.ts new file mode 100644 index 0000000..05e6433 --- /dev/null +++ b/src/migrations/20230301-02-indexes.ts @@ -0,0 +1,91 @@ +import { Kysely, sql } from "kysely"; + +const DESTINATION_TABLE = process.env.DESTINATION_TABLE || "matomo"; + +const indexes = [ + { + name: "idx_action_eventaction_matomo", + columns: ["action_eventaction"], + }, + { + name: "idx_action_eventcategory_matomo", + columns: ["action_eventcategory"], + }, + { + name: "idx_action_id", + columns: ["action_id"], + }, + { + name: "idx_action_timestamp_matomo", + columns: ["action_timestamp"], + }, + { + name: "idx_action_type_matomo", + columns: ["action_type"], + }, + { + name: "idx_actionurl", + columns: ["action_url"], + }, + { + name: "idx_dimension1", + columns: ["dimension1"], + }, + { + name: "idx_dimension2", + columns: ["dimension2"], + }, + { + name: "idx_dimension3", + columns: ["dimension3"], + }, + { + name: "idx_dimension4", + columns: ["dimension4"], + }, + { + name: "idx_dimension5", + columns: ["dimension5"], + }, + { + name: "idx_idvisit_matomo", + columns: ["idvisit"], + }, + { + name: "idx_region", + columns: ["region"], + }, + { + name: "idx_userid", + columns: ["userid"], + }, + { + name: "idx_visitorid", + columns: ["visitorid"], + }, +]; + +export async function up(db: Kysely): Promise { + indexes.forEach(async (index) => { + await db.schema + .createIndex(index.name) + .ifNotExists() + .on(DESTINATION_TABLE) + .using("btree") + .columns(index.columns) + .execute(); + }); + await db.schema + .createIndex("actions_day") + .ifNotExists() + .on(DESTINATION_TABLE) + .expression(sql`date(timezone('UTC', action_timestamp))`) + .execute(); +} + +export async function down(db: Kysely): Promise { + indexes.forEach(async (index) => { + await db.schema.dropIndex(index.name).execute(); + }); + db.schema.dropIndex("actions_day").execute(); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e78a786 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "module": "CommonJS", + "target": "ES2015", + "types": ["node", "jest"], + "strict": true + }, + "include": ["src/**/*", "types/**/*"] +} diff --git a/types/index.d.ts b/types/index.d.ts index 5f2a727..49b388a 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,31 +1,51 @@ -export * from "./matomo"; +import { ColumnType } from "kysely"; -export type Event = { +import "./missing"; + +export * from "./matomo-api"; + +export type MatomoTableName = "matomo" | string; + +export interface MatomoTable { idsite: string; idvisit: string; - actions: string; - country: string; - region: string; - city: string; - operatingsystemname: string; - devicemodel: string; - devicebrand: string; - visitduration: string; - dayssincefirstvisit: string; - visitortype: string; - sitename: string; - userid: string; - serverdateprettyfirstaction: string; + actions?: string; + country?: string; + region?: string; + city?: string; + operatingsystemname?: string; + devicemodel?: string; + devicebrand?: string; + visitduration?: string; + dayssincefirstvisit?: string; + visitortype?: string; + sitename?: string; + userid?: string; + serverdateprettyfirstaction?: ColumnType; action_id: string; action_type: string; action_eventcategory: string; action_eventaction: string; action_eventname: string; - action_eventvalue: string; + action_eventvalue: number; action_timespent: string; - action_timestamp: string; - action_url: string; - usercustomproperties: Record; - usercustomdimensions: Record; - siteSearchKeyword: string; -}; + action_timestamp: ColumnType; + usercustomproperties?: Record; + usercustomdimensions?: Record; + dimension1?: string; + dimension2?: string; + dimension3?: string; + dimension4?: string; + dimension5?: string; + dimension6?: string; + dimension7?: string; + dimension8?: string; + dimension9?: string; + dimension10?: string; + action_url?: string; + sitesearchkeyword?: string; + action_title?: string; + visitorid?: string; + referrertype?: string; + referrername?: string; +} diff --git a/types/matomo.d.ts b/types/matomo-api.d.ts similarity index 86% rename from types/matomo.d.ts rename to types/matomo-api.d.ts index 05ab095..9d1807c 100644 --- a/types/matomo.d.ts +++ b/types/matomo-api.d.ts @@ -4,7 +4,7 @@ export type Visit = { idSite: string; idVisit: string; visitIp: any; - visitorId: boolean; + visitorId: string; fingerprint: boolean; actionDetails: ActionDetail[]; goalConversions: number; @@ -149,7 +149,7 @@ export interface ActionDetail { timeSpentPretty?: string; eventName?: string; eventValue?: number; - revenue: any; + revenue?: any; items?: string; itemDetails?: ItemDetail[]; customVariables?: CustomVariables; @@ -183,8 +183,7 @@ export interface ItemDetail { } export interface CustomVariables { - "1": N1; - "2": N2; + [key: string]: N1 | N2 | N3 | N4 | N5 | N6 | N7 | N8 | N9; } export interface N1 { @@ -197,6 +196,36 @@ export interface N2 { customVariablePageValue2: string; } +export interface N3 { + customVariablePageName3: string; + customVariablePageValue3: string; +} + +export interface N4 { + customVariablePageName4: string; + customVariablePageValue4: string; +} +export interface N5 { + customVariablePageName5: string; + customVariablePageValue5: string; +} +export interface N6 { + customVariablePageName6: string; + customVariablePageValue6: string; +} +export interface N7 { + customVariablePageName7: string; + customVariablePageValue7: string; +} +export interface N8 { + customVariablePageName8: string; + customVariablePageValue8: string; +} +export interface N9 { + customVariablePageName9: string; + customVariablePageValue9: string; +} + export interface PluginsIcon { pluginIcon: string; pluginName: string; diff --git a/types/missing.d.ts b/types/missing.d.ts new file mode 100644 index 0000000..369456c --- /dev/null +++ b/types/missing.d.ts @@ -0,0 +1 @@ +declare module "piwik-client"; diff --git a/yarn.lock b/yarn.lock index 890543c..352fde4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,177 +2,165 @@ # yarn lockfile v1 -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - -"@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8" - integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.0" - "@babel/helper-module-transforms" "^7.15.0" - "@babel/helpers" "^7.14.8" - "@babel/parser" "^7.15.0" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" +"@ampproject/remapping@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.1.2" + json5 "^2.2.2" semver "^6.3.0" - source-map "^0.5.0" -"@babel/generator@^7.15.0", "@babel/generator@^7.7.2": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" - integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ== +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1", "@babel/generator@^7.7.2": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== dependencies: - "@babel/types" "^7.15.0" + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" - source-map "^0.5.0" -"@babel/helper-compilation-targets@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" - integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" - integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== - dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-get-function-arity@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" - integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-hoist-variables@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" - integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-member-expression-to-functions@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" - integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg== - dependencies: - "@babel/types" "^7.15.0" - -"@babel/helper-module-imports@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" - integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-transforms@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" - integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.0" - "@babel/helper-simple-access" "^7.14.8" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helper-optimise-call-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" - integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-replace-supers@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4" - integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.0" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helper-simple-access@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" - integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== - dependencies: - "@babel/types" "^7.14.8" - -"@babel/helper-split-export-declaration@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" - integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helpers@^7.14.8": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.3.tgz#c96838b752b95dcd525b4e741ed40bb1dc2a1357" - integrity sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g== - dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.21.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + 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-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.15.0", "@babel/parser@^7.7.2": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862" - integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -209,6 +197,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -259,42 +254,44 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/template@^7.14.5", "@babel/template@^7.3.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" - integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.15.0", "@babel/traverse@^7.7.2": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" - integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.15.0" - "@babel/types" "^7.15.0" + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.7.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@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.2" + "@babel/types" "^7.21.2" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" - integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== dependencies: - "@babel/helper-validator-identifier" "^7.14.9" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -302,6 +299,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -318,209 +322,300 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.1.1.tgz#e1eb8ef8a410e75e80bb17429047ed5d43411d20" - integrity sha512-VpQJRsWSeAem0zpBjeRtDbcD6DlbNoK11dNYt+PSQ+DDORh9q2/xyEpErfwgnLjWX0EKkSZmTGx/iH9Inzs6vQ== +"@jest/console@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.3.tgz#1f25a99f7f860e4c46423b5b1038262466fadde1" + integrity sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^29.4.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^27.1.1" - jest-util "^27.1.1" + jest-message-util "^29.4.3" + jest-util "^29.4.3" slash "^3.0.0" -"@jest/core@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.1.1.tgz#d9d42214920cb96c2a6cc48517cf62d4351da3aa" - integrity sha512-oCkKeTgI0emznKcLoq5OCD0PhxCijA4l7ejDnWW3d5bgSi+zfVaLybVqa+EQOxpNejQWtTna7tmsAXjMN9N43Q== +"@jest/core@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.3.tgz#829dd65bffdb490de5b0f69e97de8e3b5eadd94b" + integrity sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ== dependencies: - "@jest/console" "^27.1.1" - "@jest/reporters" "^27.1.1" - "@jest/test-result" "^27.1.1" - "@jest/transform" "^27.1.1" - "@jest/types" "^27.1.1" + "@jest/console" "^29.4.3" + "@jest/reporters" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.8.1" + ci-info "^3.2.0" exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^27.1.1" - jest-config "^27.1.1" - jest-haste-map "^27.1.1" - jest-message-util "^27.1.1" - jest-regex-util "^27.0.6" - jest-resolve "^27.1.1" - jest-resolve-dependencies "^27.1.1" - jest-runner "^27.1.1" - jest-runtime "^27.1.1" - jest-snapshot "^27.1.1" - jest-util "^27.1.1" - jest-validate "^27.1.1" - jest-watcher "^27.1.1" + graceful-fs "^4.2.9" + jest-changed-files "^29.4.3" + jest-config "^29.4.3" + jest-haste-map "^29.4.3" + jest-message-util "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.4.3" + jest-resolve-dependencies "^29.4.3" + jest-runner "^29.4.3" + jest-runtime "^29.4.3" + jest-snapshot "^29.4.3" + jest-util "^29.4.3" + jest-validate "^29.4.3" + jest-watcher "^29.4.3" micromatch "^4.0.4" - p-each-series "^2.1.0" - rimraf "^3.0.0" + pretty-format "^29.4.3" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.1.1.tgz#a1f7a552f7008f773988b9c0e445ede35f77bbb7" - integrity sha512-+y882/ZdxhyqF5RzxIrNIANjHj991WH7jifdcplzMDosDUOyCACFYUyVTBGbSTocbU+s1cesroRzkwi8hZ9SHg== +"@jest/environment@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.3.tgz#9fe2f3169c3b33815dc4bd3960a064a83eba6548" + integrity sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA== dependencies: - "@jest/fake-timers" "^27.1.1" - "@jest/types" "^27.1.1" + "@jest/fake-timers" "^29.4.3" + "@jest/types" "^29.4.3" "@types/node" "*" - jest-mock "^27.1.1" + jest-mock "^29.4.3" -"@jest/fake-timers@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.1.1.tgz#557a1c0d067d33bcda4dfae9a7d8f96a15a954b5" - integrity sha512-u8TJ5VlsVYTsGFatoyIae2l25pku4Bu15QCPTx2Gs5z+R//Ee3tHN85462Vc9yGVcdDvgADbqNkhOLxbEwPjMQ== +"@jest/expect-utils@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.3.tgz#95ce4df62952f071bcd618225ac7c47eaa81431e" + integrity sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ== dependencies: - "@jest/types" "^27.1.1" - "@sinonjs/fake-timers" "^7.0.2" + jest-get-type "^29.4.3" + +"@jest/expect@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.3.tgz#d31a28492e45a6bcd0f204a81f783fe717045c6e" + integrity sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ== + dependencies: + expect "^29.4.3" + jest-snapshot "^29.4.3" + +"@jest/fake-timers@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.3.tgz#31e982638c60fa657d310d4b9d24e023064027b0" + integrity sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw== + dependencies: + "@jest/types" "^29.4.3" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^27.1.1" - jest-mock "^27.1.1" - jest-util "^27.1.1" + jest-message-util "^29.4.3" + jest-mock "^29.4.3" + jest-util "^29.4.3" -"@jest/globals@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.1.1.tgz#cfe5f4d5b37483cef62b79612128ccc7e3c951d8" - integrity sha512-Q3JcTPmY+DAEHnr4MpnBV3mwy50EGrTC6oSDTNnW7FNGGacTJAfpWNk02D7xv422T1OzK2A2BKx+26xJOvHkyw== +"@jest/globals@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.3.tgz#63a2c4200d11bc6d46f12bbe25b07f771fce9279" + integrity sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA== dependencies: - "@jest/environment" "^27.1.1" - "@jest/types" "^27.1.1" - expect "^27.1.1" + "@jest/environment" "^29.4.3" + "@jest/expect" "^29.4.3" + "@jest/types" "^29.4.3" + jest-mock "^29.4.3" -"@jest/reporters@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.1.1.tgz#ee5724092f197bb78c60affb9c6f34b6777990c2" - integrity sha512-cEERs62n1P4Pqox9HWyNOEkP57G95aK2mBjB6D8Ruz1Yc98fKH53b58rlVEnsY5nLmkLNZk65fxNi9C0Yds/8w== +"@jest/reporters@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.3.tgz#0a68a0c0f20554760cc2e5443177a0018969e353" + integrity sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.1.1" - "@jest/test-result" "^27.1.1" - "@jest/transform" "^27.1.1" - "@jest/types" "^27.1.1" + "@jest/console" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" + glob "^7.1.3" + graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^27.1.1" - jest-resolve "^27.1.1" - jest-util "^27.1.1" - jest-worker "^27.1.1" + istanbul-reports "^3.1.3" + jest-message-util "^29.4.3" + jest-util "^29.4.3" + jest-worker "^29.4.3" slash "^3.0.0" - source-map "^0.6.0" string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.0.0" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" -"@jest/source-map@^27.0.6": - version "27.0.6" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.6.tgz#be9e9b93565d49b0548b86e232092491fb60551f" - integrity sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g== +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" + graceful-fs "^4.2.9" -"@jest/test-result@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.1.1.tgz#1086b39af5040b932a55e7f1fa1bc4671bed4781" - integrity sha512-8vy75A0Jtfz9DqXFUkjC5Co/wRla+D7qRFdShUY8SbPqBS3GBx3tpba7sGKFos8mQrdbe39n+c1zgVKtarfy6A== +"@jest/test-result@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.3.tgz#e13d973d16c8c7cc0c597082d5f3b9e7f796ccb8" + integrity sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA== dependencies: - "@jest/console" "^27.1.1" - "@jest/types" "^27.1.1" + "@jest/console" "^29.4.3" + "@jest/types" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.1.1.tgz#cea3722ec6f6330000240fd999ad3123adaf5992" - integrity sha512-l8zD3EdeixvwmLNlJoMX3hhj8iIze95okj4sqmBzOq/zW8gZLElUveH4bpKEMuR+Nweazjlwc7L6g4C26M/y6Q== +"@jest/test-sequencer@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.3.tgz#0862e876a22993385a0f3e7ea1cc126f208a2898" + integrity sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw== dependencies: - "@jest/test-result" "^27.1.1" - graceful-fs "^4.2.4" - jest-haste-map "^27.1.1" - jest-runtime "^27.1.1" + "@jest/test-result" "^29.4.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.3" + slash "^3.0.0" -"@jest/transform@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.1.1.tgz#51a22f5a48d55d796c02757117c02fcfe4da13d7" - integrity sha512-qM19Eu75U6Jc5zosXXVnq900Nl9JDpoGaZ4Mg6wZs7oqbu3heYSMOZS19DlwjlhWdfNRjF4UeAgkrCJCK3fEXg== +"@jest/transform@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.3.tgz#f7d17eac9cb5bb2e1222ea199c7c7e0835e0c037" + integrity sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg== dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.1.1" - babel-plugin-istanbul "^6.0.0" + "@babel/core" "^7.11.6" + "@jest/types" "^29.4.3" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^27.1.1" - jest-regex-util "^27.0.6" - jest-util "^27.1.1" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.3" + jest-regex-util "^29.4.3" + jest-util "^29.4.3" micromatch "^4.0.4" - pirates "^4.0.1" + pirates "^4.0.4" slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + write-file-atomic "^4.0.2" -"@jest/types@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.1.1.tgz#77a3fc014f906c65752d12123a0134359707c0ad" - integrity sha512-yqJPDDseb0mXgKqmNqypCsb85C22K1aY5+LUxh7syIM9n/b0AsaltxNy+o6tt29VcfGDpYEve175bm3uOhcehA== +"@jest/types@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.3.tgz#9069145f4ef09adf10cec1b2901b2d390031431f" + integrity sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA== dependencies: + "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^16.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: - type-detect "4.0.8" + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" -"@sinonjs/fake-timers@^7.0.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: - "@sinonjs/commons" "^1.7.0" + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@tootallnate/once@1": +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.15" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.15.tgz#2ccfb1ad55a02c83f8e0ad327cbc332f55eb1024" - integrity sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" - integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" @@ -532,24 +627,31 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== dependencies: "@babel/types" "^7.3.0" -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== +"@types/debug@^4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" @@ -565,32 +667,37 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^27.0.3": - version "27.0.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.0.3.tgz#0cf9dfe9009e467f70a342f0f94ead19842a783a" - integrity sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg== +"@types/jest@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" + integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== dependencies: - jest-diff "^27.0.0" - pretty-format "^27.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*": - version "16.6.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz#331b7b9f8621c638284787c5559423822fdffc50" - integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA== +"@types/node@*", "@types/node@^18.14.4": + version "18.14.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.4.tgz#0e64ec0b35a772e1e3d849f9a0ff61782d0cb647" + integrity sha512-VhCw7I7qO2X49+jaKcAUwi3rR+hbxT5VcYF493+Z5kMLI0DL568b7JI4IDJaxWFH0D/xwmGJNoXisyX+w7GH/g== -"@types/pg@^8.6.1": - version "8.6.1" - resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.1.tgz#099450b8dc977e8197a44f5229cedef95c8747f9" - integrity sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w== +"@types/pg@^8.6.6": + version "8.6.6" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.6.tgz#21cdf873a3e345a6e78f394677e3b3b1b543cb80" + integrity sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw== dependencies: "@types/node" "*" pg-protocol "*" pg-types "^2.2.0" "@types/prettier@^2.1.5": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" - integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/stack-utils@^2.0.0": version "2.0.1" @@ -598,51 +705,26 @@ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== +"@types/yargs@^17.0.8": + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== dependencies: "@types/yargs-parser" "*" -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4: - version "8.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" - integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" +acorn@^8.4.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== aggregate-error@^3.0.0: version "3.1.0" @@ -659,7 +741,7 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-regex@^5.0.0: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -684,13 +766,18 @@ ansi-styles@^5.0.0: integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -698,44 +785,38 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -babel-jest@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.1.1.tgz#9359c45995d0940b84d2176ab83423f9eed07617" - integrity sha512-JA+dzJl4n2RBvWQEnph6HJaTHrsIPiXGQYatt/D8nR4UpX9UG4GaDzykVVPQBbrdTebZREkRb6SOxyIXJRab6Q== +babel-jest@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.3.tgz#478b84d430972b277ad67dd631be94abea676792" + integrity sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw== dependencies: - "@jest/transform" "^27.1.1" - "@jest/types" "^27.1.1" + "@jest/transform" "^29.4.3" "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^27.0.6" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.4.3" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" slash "^3.0.0" -babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz#f7c6b3d764af21cb4a2a1ab6870117dbde15b456" - integrity sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw== +babel-plugin-jest-hoist@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.3.tgz#ad1dfb5d31940957e00410ef7d9b2aa94b216101" + integrity sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" + "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: @@ -756,12 +837,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz#909ef08e9f24a4679768be2f60a3df0856843f9d" - integrity sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw== +babel-preset-jest@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.3.tgz#bb926b66ae253b69c6e3ef87511b8bb5c53c5b52" + integrity sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw== dependencies: - babel-plugin-jest-hoist "^27.0.6" + babel-plugin-jest-hoist "^29.4.3" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -777,28 +858,29 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.1: +braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browserslist@^4.21.3: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" -browserslist@^4.16.6: - version "4.16.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0" - integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ== +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: - caniuse-lite "^1.0.30001251" - colorette "^1.3.0" - electron-to-chromium "^1.3.811" - escalade "^3.1.1" - node-releases "^1.1.75" + fast-json-stable-stringify "2.x" bser@2.1.1: version "2.1.1" @@ -828,14 +910,14 @@ camelcase@^5.3.1: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001251: - version "1.0.30001251" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz#6853a606ec50893115db660f82c094d18f096d85" - integrity sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A== +caniuse-lite@^1.0.30001449: + version "1.0.30001458" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz#871e35866b4654a7d25eccca86864f411825540c" + integrity sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w== chalk@^2.0.0: version "2.4.2" @@ -859,10 +941,10 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -ci-info@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: version "1.2.2" @@ -874,19 +956,19 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" wrap-ansi "^7.0.0" co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.1" @@ -910,36 +992,32 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af" - integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-spawn@^7.0.3: version "7.0.3" @@ -950,106 +1028,70 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== +date-fns@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -date-fns@^2.23.0: - version "2.23.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9" - integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA== - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== +debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" - integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== -electron-to-chromium@^1.3.811: - version "1.3.813" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.813.tgz#751a007d71c00faed8b5e9edaf3634c14b9c5a1f" - integrity sha512-YcSRImHt6JZZ2sSuQ4Bzajtk98igQ0iKkksqlzZLzbh4p0OIyJRSvUbsgqfcR8txdfsoYCc4ym306t4p2kP/aw== +electron-to-chromium@^1.4.284: + version "1.4.316" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.316.tgz#7f2cfda199ae1a32a69b3eb9046b8b0640086064" + integrity sha512-9urqVpdeJYAwVL/sBjsX2pSlgYI/b4nOqC6UaNa0xlq1VUbXLRhERWlxcQ4FWfUOQQxSSxN/taFtapEcwg5tVA== -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -1058,40 +1100,18 @@ escalade@^3.1.1: escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -1110,34 +1130,28 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.1.1.tgz#020215da67d41cd6ad805fa00bd030985ca7c093" - integrity sha512-JQAzp0CJoFFHF1RnOtrMUNMdsfx/Tl0+FhRzVl8q0fa23N+JyWdPXwb3T5rkHCvyo9uttnK7lVdKCBl1b/9EDw== +expect@^29.0.0, expect@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.3.tgz#5e47757316df744fe3b8926c3ae8a3ebdafff7fe" + integrity sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg== dependencies: - "@jest/types" "^27.1.1" - ansi-styles "^5.0.0" - jest-get-type "^27.0.6" - jest-matcher-utils "^27.1.1" - jest-message-util "^27.1.1" - jest-regex-util "^27.0.6" + "@jest/expect-utils" "^29.4.3" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.4.3" + jest-message-util "^29.4.3" + jest-util "^29.4.3" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" @@ -1156,19 +1170,10 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2: version "2.3.2" @@ -1200,15 +1205,15 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" @@ -1217,15 +1222,15 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" @@ -1239,51 +1244,20 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -1291,7 +1265,7 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -1301,27 +1275,25 @@ indent-string@^4.0.0: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -is-ci@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" - integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== - dependencies: - ci-info "^3.1.1" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-core-module@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" - integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" @@ -1340,39 +1312,30 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: - "@babel/core" "^7.7.5" + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" + istanbul-lib-coverage "^3.2.0" semver "^6.3.0" istanbul-lib-report@^3.0.0: @@ -1385,432 +1348,382 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.1.1.tgz#9b3f67a34cc58e3e811e2e1e21529837653e4200" - integrity sha512-5TV9+fYlC2A6hu3qtoyGHprBwCAn0AuGA77bZdUgYvVlRMjHXo063VcWTEAyx6XAZ85DYHqp0+aHKbPlfRDRvA== +jest-changed-files@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.3.tgz#7961fe32536b9b6d5c28dfa0abcfab31abcf50a7" + integrity sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ== dependencies: - "@jest/types" "^27.1.1" execa "^5.0.0" - throat "^6.0.1" + p-limit "^3.1.0" -jest-circus@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.1.1.tgz#08dd3ec5cbaadce68ce6388ebccbe051d1b34bc6" - integrity sha512-Xed1ApiMFu/yzqGMBToHr8sp2gkX/ARZf4nXoGrHJrXrTUdVIWiVYheayfcOaPdQvQEE/uyBLgW7I7YBLIrAXQ== +jest-circus@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.3.tgz#fff7be1cf5f06224dd36a857d52a9efeb005ba04" + integrity sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw== dependencies: - "@jest/environment" "^27.1.1" - "@jest/test-result" "^27.1.1" - "@jest/types" "^27.1.1" + "@jest/environment" "^29.4.3" + "@jest/expect" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/types" "^29.4.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" - expect "^27.1.1" is-generator-fn "^2.0.0" - jest-each "^27.1.1" - jest-matcher-utils "^27.1.1" - jest-message-util "^27.1.1" - jest-runtime "^27.1.1" - jest-snapshot "^27.1.1" - jest-util "^27.1.1" - pretty-format "^27.1.1" + jest-each "^29.4.3" + jest-matcher-utils "^29.4.3" + jest-message-util "^29.4.3" + jest-runtime "^29.4.3" + jest-snapshot "^29.4.3" + jest-util "^29.4.3" + p-limit "^3.1.0" + pretty-format "^29.4.3" slash "^3.0.0" stack-utils "^2.0.3" - throat "^6.0.1" -jest-cli@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.1.1.tgz#6491a0278231ffee61083ad468809328e96a8eb2" - integrity sha512-LCjfEYp9D3bcOeVUUpEol9Y1ijZYMWVqflSmtw/wX+6Fb7zP4IlO14/6s9v1pxsoM4Pn46+M2zABgKuQjyDpTw== +jest-cli@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.3.tgz#fe31fdd0c90c765f392b8b7c97e4845071cd2163" + integrity sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg== dependencies: - "@jest/core" "^27.1.1" - "@jest/test-result" "^27.1.1" - "@jest/types" "^27.1.1" + "@jest/core" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/types" "^29.4.3" chalk "^4.0.0" exit "^0.1.2" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^27.1.1" - jest-util "^27.1.1" - jest-validate "^27.1.1" + jest-config "^29.4.3" + jest-util "^29.4.3" + jest-validate "^29.4.3" prompts "^2.0.1" - yargs "^16.0.3" + yargs "^17.3.1" -jest-config@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.1.1.tgz#cde823ad27f7ec0b9440035eabc75d4ac1ea024c" - integrity sha512-2iSd5zoJV4MsWPcLCGwUVUY/j6pZXm4Qd3rnbCtrd9EHNTg458iHw8PZztPQXfxKBKJxLfBk7tbZqYF8MGtxJA== +jest-config@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.3.tgz#fca9cdfe6298ae6d04beef1624064d455347c978" + integrity sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ== dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^27.1.1" - "@jest/types" "^27.1.1" - babel-jest "^27.1.1" + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.4.3" + "@jest/types" "^29.4.3" + babel-jest "^29.4.3" chalk "^4.0.0" + ci-info "^3.2.0" deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - is-ci "^3.0.0" - jest-circus "^27.1.1" - jest-environment-jsdom "^27.1.1" - jest-environment-node "^27.1.1" - jest-get-type "^27.0.6" - jest-jasmine2 "^27.1.1" - jest-regex-util "^27.0.6" - jest-resolve "^27.1.1" - jest-runner "^27.1.1" - jest-util "^27.1.1" - jest-validate "^27.1.1" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.4.3" + jest-environment-node "^29.4.3" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.4.3" + jest-runner "^29.4.3" + jest-util "^29.4.3" + jest-validate "^29.4.3" micromatch "^4.0.4" - pretty-format "^27.1.1" + parse-json "^5.2.0" + pretty-format "^29.4.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" -jest-diff@^27.0.0, jest-diff@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.1.1.tgz#1d1629ca2e3933b10cb27dc260e28e3dba182684" - integrity sha512-m/6n5158rqEriTazqHtBpOa2B/gGgXJijX6nsEgZfbJ/3pxQcdpVXBe+FP39b1dxWHyLVVmuVXddmAwtqFO4Lg== +jest-diff@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.3.tgz#42f4eb34d0bf8c0fb08b0501069b87e8e84df347" + integrity sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA== dependencies: chalk "^4.0.0" - diff-sequences "^27.0.6" - jest-get-type "^27.0.6" - pretty-format "^27.1.1" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.4.3" -jest-docblock@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz#cc78266acf7fe693ca462cbbda0ea4e639e4e5f3" - integrity sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA== +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== dependencies: detect-newline "^3.0.0" -jest-each@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.1.1.tgz#caa1e7eed77144be346eb18712885b990389348a" - integrity sha512-r6hOsTLavUBb1xN0uDa89jdDeBmJ+K49fWpbyxeGRA2pLY46PlC4z551/cWNQzrj+IUa5/gSRsCIV/01HdNPug== +jest-each@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.3.tgz#a434c199a2f6151c5e3dc80b2d54586bdaa72819" + integrity sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^29.4.3" chalk "^4.0.0" - jest-get-type "^27.0.6" - jest-util "^27.1.1" - pretty-format "^27.1.1" - -jest-environment-jsdom@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.1.1.tgz#e53e98a16e6a764b8ee8db3b29b3a8c27db06f66" - integrity sha512-6vOnoZ6IaExuw7FvnuJhA1qFYv1DDSnN0sQowzolNwxQp7bG1YhLxj2YU1sVXAYA3IR3MbH2mbnJUsLUWfyfzw== - dependencies: - "@jest/environment" "^27.1.1" - "@jest/fake-timers" "^27.1.1" - "@jest/types" "^27.1.1" - "@types/node" "*" - jest-mock "^27.1.1" - jest-util "^27.1.1" - jsdom "^16.6.0" - -jest-environment-node@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.1.1.tgz#97425d4762b2aeab15892ffba08c6cbed7653e75" - integrity sha512-OEGeZh0PwzngNIYWYgWrvTcLygopV8OJbC9HNb0j70VBKgEIsdZkYhwcFnaURX83OHACMqf1pa9Tv5Pw5jemrg== - dependencies: - "@jest/environment" "^27.1.1" - "@jest/fake-timers" "^27.1.1" - "@jest/types" "^27.1.1" + jest-get-type "^29.4.3" + jest-util "^29.4.3" + pretty-format "^29.4.3" + +jest-environment-node@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.3.tgz#579c4132af478befc1889ddc43c2413a9cdbe014" + integrity sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg== + dependencies: + "@jest/environment" "^29.4.3" + "@jest/fake-timers" "^29.4.3" + "@jest/types" "^29.4.3" "@types/node" "*" - jest-mock "^27.1.1" - jest-util "^27.1.1" + jest-mock "^29.4.3" + jest-util "^29.4.3" -jest-get-type@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" - integrity sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg== +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== -jest-haste-map@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.1.1.tgz#f7c646b0e417ec29b80b96cf785b57b581384adf" - integrity sha512-NGLYVAdh5C8Ezg5QBFzrNeYsfxptDBPlhvZNaicLiZX77F/rS27a9M6u9ripWAaaD54xnWdZNZpEkdjD5Eo5aQ== +jest-haste-map@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.3.tgz#085a44283269e7ace0645c63a57af0d2af6942e2" + integrity sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ== dependencies: - "@jest/types" "^27.1.1" - "@types/graceful-fs" "^4.1.2" + "@jest/types" "^29.4.3" + "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^27.0.6" - jest-serializer "^27.0.6" - jest-util "^27.1.1" - jest-worker "^27.1.1" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.4.3" + jest-worker "^29.4.3" micromatch "^4.0.4" - walker "^1.0.7" + walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-jasmine2@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.1.1.tgz#efb9e7b70ce834c35c91e1a2f01bb41b462fad43" - integrity sha512-0LAzUmcmvQwjIdJt0cXUVX4G5qjVXE8ELt6nbMNDzv2yAs2hYCCUtQq+Eje70GwAysWCGcS64QeYj5VPHYVxPg== +jest-leak-detector@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.3.tgz#2b35191d6b35aa0256e63a9b79b0f949249cf23a" + integrity sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA== dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^27.1.1" - "@jest/source-map" "^27.0.6" - "@jest/test-result" "^27.1.1" - "@jest/types" "^27.1.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.1.1" - is-generator-fn "^2.0.0" - jest-each "^27.1.1" - jest-matcher-utils "^27.1.1" - jest-message-util "^27.1.1" - jest-runtime "^27.1.1" - jest-snapshot "^27.1.1" - jest-util "^27.1.1" - pretty-format "^27.1.1" - throat "^6.0.1" - -jest-leak-detector@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.1.1.tgz#8e05ec4b339814fc4202f07d875da65189e3d7d4" - integrity sha512-gwSgzmqShoeEsEVpgObymQPrM9P6557jt1EsFW5aCeJ46Cme0EdjYU7xr6llQZ5GpWDl56eOstUaPXiZOfiTKw== - dependencies: - jest-get-type "^27.0.6" - pretty-format "^27.1.1" - -jest-matcher-utils@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.1.1.tgz#1f444d7491ccf9edca746336b056178789a59651" - integrity sha512-Q1a10w9Y4sh0wegkdP6reQOa/Dtz7nAvDqBgrat1ItZAUvk4jzXAqyhXPu/ZuEtDaXaNKpdRPRQA8bvkOh2Eaw== + jest-get-type "^29.4.3" + pretty-format "^29.4.3" + +jest-matcher-utils@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz#ea68ebc0568aebea4c4213b99f169ff786df96a0" + integrity sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg== dependencies: chalk "^4.0.0" - jest-diff "^27.1.1" - jest-get-type "^27.0.6" - pretty-format "^27.1.1" + jest-diff "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.4.3" -jest-message-util@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.1.1.tgz#980110fb72fcfa711cd9a95e8f10d335207585c6" - integrity sha512-b697BOJV93+AVGvzLRtVZ0cTVRbd59OaWnbB2D75GRaIMc4I+Z9W0wHxbfjW01JWO+TqqW4yevT0aN7Fd0XWng== +jest-message-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.3.tgz#65b5280c0fdc9419503b49d4f48d4999d481cb5b" + integrity sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.1.1" + "@jest/types" "^29.4.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^27.1.1" + pretty-format "^29.4.3" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.1.1.tgz#c7a2e81301fdcf3dab114931d23d89ec9d0c3a82" - integrity sha512-SClsFKuYBf+6SSi8jtAYOuPw8DDMsTElUWEae3zq7vDhH01ayVSIHUSIa8UgbDOUalCFp6gNsaikN0rbxN4dbw== +jest-mock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.3.tgz#23d84a20a74cdfff0510fdbeefb841ed57b0fe7e" + integrity sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^29.4.3" "@types/node" "*" + jest-util "^29.4.3" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5" - integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ== +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== -jest-resolve-dependencies@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.1.1.tgz#6f3e0916c1764dd1853c6111ed9d66c66c792e40" - integrity sha512-sYZR+uBjFDCo4VhYeazZf/T+ryYItvdLKu9vHatqkUqHGjDMrdEPOykiqC2iEpaCFTS+3iL/21CYiJuKdRbniw== +jest-resolve-dependencies@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.3.tgz#9ad7f23839a6d88cef91416bda9393a6e9fd1da5" + integrity sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw== dependencies: - "@jest/types" "^27.1.1" - jest-regex-util "^27.0.6" - jest-snapshot "^27.1.1" + jest-regex-util "^29.4.3" + jest-snapshot "^29.4.3" -jest-resolve@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.1.1.tgz#3a86762f9affcad9697bc88140b0581b623add33" - integrity sha512-M41YFmWhvDVstwe7XuV21zynOiBLJB5Sk0GrIsYYgTkjfEWNLVXDjAyq1W7PHseaYNOxIc0nOGq/r5iwcZNC1A== +jest-resolve@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.3.tgz#3c5b5c984fa8a763edf9b3639700e1c7900538e2" + integrity sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw== dependencies: - "@jest/types" "^27.1.1" chalk "^4.0.0" - escalade "^3.1.1" - graceful-fs "^4.2.4" - jest-haste-map "^27.1.1" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.3" jest-pnp-resolver "^1.2.2" - jest-util "^27.1.1" - jest-validate "^27.1.1" + jest-util "^29.4.3" + jest-validate "^29.4.3" resolve "^1.20.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.1.1.tgz#1991fdf13a8fe6e49cef47332db33300649357cd" - integrity sha512-lP3MBNQhg75/sQtVkC8dsAQZumvy3lHK/YIwYPfEyqGIX1qEcnYIRxP89q0ZgC5ngvi1vN2P5UFHszQxguWdng== +jest-runner@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.3.tgz#68dc82c68645eda12bea42b5beece6527d7c1e5e" + integrity sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA== dependencies: - "@jest/console" "^27.1.1" - "@jest/environment" "^27.1.1" - "@jest/test-result" "^27.1.1" - "@jest/transform" "^27.1.1" - "@jest/types" "^27.1.1" + "@jest/console" "^29.4.3" + "@jest/environment" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" "@types/node" "*" chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-docblock "^27.0.6" - jest-environment-jsdom "^27.1.1" - jest-environment-node "^27.1.1" - jest-haste-map "^27.1.1" - jest-leak-detector "^27.1.1" - jest-message-util "^27.1.1" - jest-resolve "^27.1.1" - jest-runtime "^27.1.1" - jest-util "^27.1.1" - jest-worker "^27.1.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.1.1.tgz#bd0a0958a11c2f7d94d2e5f6f71864ad1c65fe44" - integrity sha512-FEwy+tSzmsvuKaQpyYsUyk31KG5vMmA2r2BSTHgv0yNfcooQdm2Ke91LM9Ud8D3xz8CLDHJWAI24haMFTwrsPg== - dependencies: - "@jest/console" "^27.1.1" - "@jest/environment" "^27.1.1" - "@jest/fake-timers" "^27.1.1" - "@jest/globals" "^27.1.1" - "@jest/source-map" "^27.0.6" - "@jest/test-result" "^27.1.1" - "@jest/transform" "^27.1.1" - "@jest/types" "^27.1.1" - "@types/yargs" "^16.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.4.3" + jest-haste-map "^29.4.3" + jest-leak-detector "^29.4.3" + jest-message-util "^29.4.3" + jest-resolve "^29.4.3" + jest-runtime "^29.4.3" + jest-util "^29.4.3" + jest-watcher "^29.4.3" + jest-worker "^29.4.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.3.tgz#f25db9874dcf35a3ab27fdaabca426666cc745bf" + integrity sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q== + dependencies: + "@jest/environment" "^29.4.3" + "@jest/fake-timers" "^29.4.3" + "@jest/globals" "^29.4.3" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - execa "^5.0.0" - exit "^0.1.2" glob "^7.1.3" - graceful-fs "^4.2.4" - jest-haste-map "^27.1.1" - jest-message-util "^27.1.1" - jest-mock "^27.1.1" - jest-regex-util "^27.0.6" - jest-resolve "^27.1.1" - jest-snapshot "^27.1.1" - jest-util "^27.1.1" - jest-validate "^27.1.1" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.3" + jest-message-util "^29.4.3" + jest-mock "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.4.3" + jest-snapshot "^29.4.3" + jest-util "^29.4.3" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^16.0.3" - -jest-serializer@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz#93a6c74e0132b81a2d54623251c46c498bb5bec1" - integrity sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" -jest-snapshot@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.1.1.tgz#3b816e0ca4352fbbd1db48dc692e3d9641d2531b" - integrity sha512-Wi3QGiuRFo3lU+EbQmZnBOks0CJyAMPHvYoG7iJk00Do10jeOyuOEO0Jfoaoun8+8TDv+Nzl7Aswir/IK9+1jg== +jest-snapshot@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.3.tgz#183d309371450d9c4a3de7567ed2151eb0e91145" + integrity sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw== dependencies: - "@babel/core" "^7.7.2" + "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" - "@babel/parser" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.1.1" - "@jest/types" "^27.1.1" - "@types/babel__traverse" "^7.0.4" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^27.1.1" - graceful-fs "^4.2.4" - jest-diff "^27.1.1" - jest-get-type "^27.0.6" - jest-haste-map "^27.1.1" - jest-matcher-utils "^27.1.1" - jest-message-util "^27.1.1" - jest-resolve "^27.1.1" - jest-util "^27.1.1" + expect "^29.4.3" + graceful-fs "^4.2.9" + jest-diff "^29.4.3" + jest-get-type "^29.4.3" + jest-haste-map "^29.4.3" + jest-matcher-utils "^29.4.3" + jest-message-util "^29.4.3" + jest-util "^29.4.3" natural-compare "^1.4.0" - pretty-format "^27.1.1" - semver "^7.3.2" + pretty-format "^29.4.3" + semver "^7.3.5" -jest-util@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.1.1.tgz#2b06db1391d779ec2bd406ab3690ddc56ac728b9" - integrity sha512-zf9nEbrASWn2mC/L91nNb0K+GkhFvi4MP6XJG2HqnHzHvLYcs7ou/In68xYU1i1dSkJlrWcYfWXQE8nVR+nbOA== +jest-util@^29.0.0, jest-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.3.tgz#851a148e23fc2b633c55f6dad2e45d7f4579f496" + integrity sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^29.4.3" "@types/node" "*" chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^3.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.1.1.tgz#0783733af02c988d503995fc0a07bbdc58c7dd50" - integrity sha512-N5Er5FKav/8m2dJwn7BGnZwnoD1BSc8jx5T+diG2OvyeugvZDhPeAt5DrNaGkkaKCrSUvuE7A5E4uHyT7Vj0Mw== +jest-validate@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.3.tgz#a13849dec4f9e95446a7080ad5758f58fa88642f" + integrity sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^29.4.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^27.0.6" + jest-get-type "^29.4.3" leven "^3.1.0" - pretty-format "^27.1.1" + pretty-format "^29.4.3" -jest-watcher@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.1.1.tgz#a8147e18703b5d753ada4b287451f2daf40f4118" - integrity sha512-XQzyHbxziDe+lZM6Dzs40fEt4q9akOGwitJnxQasJ9WG0bv3JGiRlsBgjw13znGapeMtFaEsyhL0Cl04IbaoWQ== +jest-watcher@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.3.tgz#e503baa774f0c2f8f3c8db98a22ebf885f19c384" + integrity sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA== dependencies: - "@jest/test-result" "^27.1.1" - "@jest/types" "^27.1.1" + "@jest/test-result" "^29.4.3" + "@jest/types" "^29.4.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^27.1.1" + emittery "^0.13.1" + jest-util "^29.4.3" string-length "^4.0.1" -jest-worker@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.1.1.tgz#eb5f05c4657fdcb702c36c48b20d785bd4599378" - integrity sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA== +jest-worker@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.3.tgz#9a4023e1ea1d306034237c7133d7da4240e8934e" + integrity sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA== dependencies: "@types/node" "*" + jest-util "^29.4.3" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.1.1.tgz#49f0497fa0fb07dc78898318cc1b737b5fbf72d8" - integrity sha512-LFTEZOhoZNR/2DQM3OCaK5xC6c55c1OWhYh0njRsoHX0qd6x4nkcgenkSH0JKjsAGMTmmJAoL7/oqYHMfwhruA== +jest@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.3.tgz#1b8be541666c6feb99990fd98adac4737e6e6386" + integrity sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA== dependencies: - "@jest/core" "^27.1.1" + "@jest/core" "^29.4.3" + "@jest/types" "^29.4.3" import-local "^3.0.2" - jest-cli "^27.1.1" + jest-cli "^29.4.3" js-tokens@^4.0.0: version "4.0.0" @@ -1825,68 +1738,40 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kysely@^0.23.4: + version "0.23.4" + resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.23.4.tgz#1975bfc37fb5074d60a415e8db73d5698528199a" + integrity sha512-3icLnj1fahUtZsP9zzOvF4DcdhekGsLX4ZaoBaIz0ZeHegyRDdbwpJD7zezAJ+KwQZNDeKchel6MikFNLsSZIA== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-path@^5.0.0: version "5.0.0" @@ -1895,10 +1780,17 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" @@ -1914,12 +1806,17 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - tmpl "1.0.x" + tmpl "1.0.5" merge-stream@^2.0.0: version "2.0.0" @@ -1927,42 +1824,25 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.49.0: - version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" - integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== - -mime-types@^2.1.12: - version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== - dependencies: - mime-db "1.49.0" + braces "^3.0.2" + picomatch "^2.3.1" mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -1971,22 +1851,17 @@ ms@2.1.2: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-releases@^1.1.75: - version "1.1.75" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" - integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== normalize-path@^3.0.0: version "3.0.0" @@ -2000,15 +1875,10 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -2019,30 +1889,13 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -p-all@^3.0.0: +p-all@^3: version "3.0.0" resolved "https://registry.yarnpkg.com/p-all/-/p-all-3.0.0.tgz#077c023c37e75e760193badab2bad3ccd5782bfb" integrity sha512-qUZbvbBFVXm6uJ7U/WDiO0fv6waBMbjlCm4E66oZdRR+egswICarIdHyVSZZHudH8T5SF8x/JG0q0duFzPnlBw== dependencies: p-map "^4.0.0" -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -2050,6 +1903,13 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -2074,10 +1934,15 @@ packet-reader@1.0.0: resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" path-exists@^4.0.0: version "4.0.0" @@ -2087,14 +1952,14 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -2109,15 +1974,15 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.4.1.tgz#0e71ce2c67b442a5e862a9c182172c37eda71e9c" - integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ== +pg-pool@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.5.2.tgz#ed1bed1fb8d79f1c6fd5fb1c99e990fbf9ddf178" + integrity sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w== -pg-protocol@*, pg-protocol@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0" - integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ== +pg-protocol@*, pg-protocol@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== pg-types@^2.1.0, pg-types@^2.2.0: version "2.2.0" @@ -2130,42 +1995,45 @@ pg-types@^2.1.0, pg-types@^2.2.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^8.7.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.1.tgz#9ea9d1ec225980c36f94e181d009ab9f4ce4c471" - integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== +pg@^8.9.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.9.0.tgz#73c5d77a854d36b0e185450dacb8b90c669e040b" + integrity sha512-ZJM+qkEbtOHRuXjmvBtOgNOXOtLSbxiMiUVMgE4rV6Zwocy03RicCVvDXgx8l4Biwo8/qORUnEqn2fdQzV7KCg== dependencies: buffer-writer "2.0.0" packet-reader "1.0.0" pg-connection-string "^2.5.0" - pg-pool "^3.4.1" - pg-protocol "^1.5.0" + pg-pool "^3.5.2" + pg-protocol "^1.6.0" pg-types "^2.1.0" pgpass "1.x" pgpass@1.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c" - integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w== + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== dependencies: - split2 "^3.1.1" + split2 "^4.1.0" -picomatch@^2.0.4, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== piwik-client@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/piwik-client/-/piwik-client-0.2.2.tgz#e9426ba4ba92787b61ece1d95bce4d9ca3971816" - integrity sha1-6UJrpLqSeHth7OHZW85NnKOXGBY= + integrity sha512-KXT7s8+zod+sEEUhyeUVXXzJgdwXVORohPlOPyJRkDeKnOVYUriMSNL9cZDvNtoCF3X+gzYJyaCrGv2MsG6DGQ== pkg-dir@^4.2.0: version "4.2.0" @@ -2182,7 +2050,7 @@ postgres-array@~2.0.0: postgres-bytea@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" - integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== postgres-date@~1.0.4: version "1.0.7" @@ -2196,57 +2064,32 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -pretty-format@^27.0.0, pretty-format@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.1.1.tgz#cbaf9ec6cd7cfc3141478b6f6293c0ccdbe968e0" - integrity sha512-zdBi/xlstKJL42UH7goQti5Hip/B415w1Mfj+WWWYMBylAYtKESnXGUtVVcMVid9ReVjypCotUV6CEevYPHv2g== +pretty-format@^29.0.0, pretty-format@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" + integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== dependencies: - "@jest/types" "^27.1.1" - ansi-regex "^5.0.0" + "@jest/schemas" "^29.4.3" ansi-styles "^5.0.0" - react-is "^17.0.1" + react-is "^18.0.0" prompts@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" -psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -readable-stream@^3.0.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== resolve-cwd@^3.0.0: version "3.0.0" @@ -2260,55 +2103,32 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" +resolve.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== +resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - glob "^7.1.3" - -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== +semver@7.x, semver@^7.3.5: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: - xmlchars "^2.2.0" + lru-cache "^6.0.0" semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2321,10 +2141,10 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sisteransi@^1.0.5: version "1.0.5" @@ -2336,45 +2156,33 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -split2@^3.1.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" +split2@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" + integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stack-utils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" @@ -2386,28 +2194,21 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^4.0.0: version "4.0.0" @@ -2419,6 +2220,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -2426,7 +2232,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -2440,26 +2246,10 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== test-exclude@^6.0.0: version "6.0.0" @@ -2470,12 +2260,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - -tmpl@1.0.x: +tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== @@ -2483,7 +2268,7 @@ tmpl@1.0.x: to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" @@ -2492,28 +2277,38 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" +ts-jest@^29.0.5: + version "29.0.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.5.tgz#c5557dcec8fe434fcb8b70c3e21c6b143bfce066" + integrity sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" type-detect@4.0.8: version "4.0.8" @@ -2525,88 +2320,39 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -typescript@^4.4.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -v8-to-istanbul@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz#4229f2a99e367f3f018fa1d5c2b8ec684667c69c" - integrity sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg== +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" - source-map "^0.7.3" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" + makeerror "1.0.12" which@^2.0.1: version "2.0.2" @@ -2615,11 +2361,6 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -2632,32 +2373,15 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.4.6: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + signal-exit "^3.0.7" xtend@^4.0.0: version "4.0.2" @@ -2669,25 +2393,40 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.0.3: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^17.3.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==