diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/brave-hairs-tan.md b/.changeset/brave-hairs-tan.md new file mode 100644 index 0000000..798679b --- /dev/null +++ b/.changeset/brave-hairs-tan.md @@ -0,0 +1,6 @@ +--- +'@powersync/mysql-zongji': minor +--- + +Initial release of the powersync-mysql-zongji fork + - Added custom gtid binlog event diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..91b6a95 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index b418bd8..0000000 --- a/.eslintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "env": { - "node": true, - "es2020": true - }, - "extends": "eslint:recommended", - "rules": { - "comma-dangle": ["warn", "only-multiline"], - "eol-last": ["error"], - "keyword-spacing": ["error", { "before": true } ], - "no-console": "off", - "no-trailing-spaces": ["error", { "skipBlankLines": true }], - "no-unused-vars": "warn", - "no-var": "warn", - "quotes": ["warn", "single", "avoid-escape"], - "semi": ["error", "always"], - "space-before-blocks": "error" - } -} diff --git a/.github/workflows/dev-packages.yaml b/.github/workflows/dev-packages.yaml new file mode 100644 index 0000000..762c0b3 --- /dev/null +++ b/.github/workflows/dev-packages.yaml @@ -0,0 +1,43 @@ +# Action to publish packages under the `next` tag for testing +# Packages are versioned as `0.0.0-{tag}-DATETIMESTAMP` +name: Create Dev Release + +on: + push: + +jobs: + publish: + name: Publish Dev Packages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Setup NodeJS + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + - uses: pnpm/action-setup@v2 + name: Install pnpm + with: + version: 9 + run_install: false + - name: Add NPM auth + run: echo "//registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}" >> ~/.npmrc + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + - name: Install dependencies + run: pnpm install + - name: Version packages + run: pnpm changeset version --no-git-tag --snapshot dev + - name: Publish + run: pnpm changeset publish --tag dev \ No newline at end of file diff --git a/.github/workflows/release-packages.yaml b/.github/workflows/release-packages.yaml new file mode 100644 index 0000000..bec8a58 --- /dev/null +++ b/.github/workflows/release-packages.yaml @@ -0,0 +1,62 @@ +name: Release Packages + +on: + push: + branches: + - main + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + release-packages: + name: Release Packages + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + version: 9 + run_install: false + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Add NPM auth + run: | + echo "//registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}" >> ~/.npmrc + + - name: Install dependencies + run: pnpm install + + - name: Create Release Pull Request or Publish to npm + id: changesets + uses: changesets/action@v1 + with: + # This expects you to have a script called release which does a build for your packages and calls changeset publish + publish: pnpm release + version: pnpm changeset version + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Debug Outputs + run: | + echo "Published Packages: ${{ steps.changesets.outputs.publishedPackages }}" \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..69d971a --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,61 @@ +# Ensures packages test correctly +name: Test Packages + +on: + push: + +jobs: + test: + name: Test Packages + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + mysql-version: [ 8.0, 8.4 ] + + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Start MySQL + run: | + docker run \ + --name zongji_test \ + -e MYSQL_ROOT_PASSWORD=my_password \ + -p 3306:3306 \ + -d mysql:${{ matrix.mysql-version }} \ + --server-id=1 \ + --log-bin=/var/lib/mysql/mysql-bin.log \ + --binlog-format=row + + - name: Setup NodeJS + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + + - uses: pnpm/action-setup@v2 + name: Install pnpm + with: + version: 9 + run_install: false + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install + + - name: Test + run: pnpm test \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1d435b2..de0075f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ npm-debug.log .DS_Store node_modules .idea +.tap *.iml *~ .\#* diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..a81deba --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v20.12.2 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..dd651a5 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false, + "printWidth": 120, + "trailingComma": "none" +} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 826217c..0000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: node_js -sudo: required -dist: trusty -node_js: - - "8" - - "12" -services: - - docker -before_script: - - npm run lint - - docker run -p 3355:3306 --name mysql-55 -e MYSQL_ROOT_PASSWORD=numtel -d mysql:5.5 --server-id=1 --log-bin=/var/lib/mysql/mysql-bin.log --binlog-format=row - - docker run -p 3356:3306 --name mysql-56 -e MYSQL_ROOT_PASSWORD=numtel -d mysql:5.6 --server-id=1 --log-bin=/var/lib/mysql/mysql-bin.log --binlog-format=row - - docker run -p 3357:3306 --name mysql-57 -e MYSQL_ROOT_PASSWORD=numtel -d mysql:5.7 --server-id=1 --log-bin=/var/lib/mysql/mysql-bin.log --binlog-format=row -script: - - ./test/travis/runner.sh diff --git a/README.md b/README.md index d34b0d6..a1af4a2 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ A MySQL 8.0-compatible fork of ZongJi - a MySQL binlog listener for Node.js, [or It leverages [`@vlasky/mysql`](https://github.com/vlasky/mysql), a fork of [`mysql`](https://github.com/mysqljs/mysql) with the following enhancements: -* Support for authentication using the caching_sha2_password plugin, the new default authentication method in MySQL 8.0 -* Partial support for the MySQL compressed protocol (reads compressed data sent by server) -* Optional sending of keepalive probe packets to check the state of the connection to the MySQL server and help keep the connection open when the network socket is idle +- Support for authentication using the caching_sha2_password plugin, the new default authentication method in MySQL 8.0 +- Partial support for the MySQL compressed protocol (reads compressed data sent by server) +- Optional sending of keepalive probe packets to check the state of the connection to the MySQL server and help keep the connection open when the network socket is idle # Latest Release @@ -17,10 +17,12 @@ Version 0.4.7 is the last release that supports Node.js version 4.x. ## Quick Start ```javascript -let zongji = new ZongJi({ /* ... MySQL Connection Settings ... */ }); +let zongji = new ZongJi({ + /* ... MySQL Connection Settings ... */ +}); // Each change to the replication log results in an event -zongji.on('binlog', function(evt) { +zongji.on('binlog', function (evt) { evt.dump(); }); @@ -34,13 +36,14 @@ For a complete implementation see [`example.js`](example.js)... ## Installation -* Requires Node.js v8+ +- Requires Node.js v8+ ```bash $ npm install @vlasky/zongji ``` -* Enable MySQL binlog in `my.cnf`, restart MySQL server after making the changes. +- Enable MySQL binlog in `my.cnf`, restart MySQL server after making the changes. + > From [MySQL 5.6](https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html), binlog checksum is enabled by default. Zongji can work with it, but it doesn't really verify it. ``` @@ -56,7 +59,8 @@ For a complete implementation see [`example.js`](example.js)... expire_logs_days = 10 # Optional, purge old logs max_binlog_size = 100M # Optional, limit log size ``` -* Create an account with replication privileges, e.g. given privileges to account `zongji` (or any account that you use to read binary logs) + +- Create an account with replication privileges, e.g. given privileges to account `zongji` (or any account that you use to read binary logs) ```sql GRANT REPLICATION SLAVE, REPLICATION CLIENT, SELECT ON *.* TO 'zongji'@'localhost' @@ -66,8 +70,8 @@ For a complete implementation see [`example.js`](example.js)... The `ZongJi` constructor accepts one argument of either: -* An object containing MySQL connection details in the same format as used by [package mysql](https://npm.im/mysql) -* Or, a [mysql](https://npm.im/mysql) `Connection` or `Pool` object that will be used for querying column information. +- An object containing MySQL connection details in the same format as used by [package mysql](https://npm.im/mysql) +- Or, a [mysql](https://npm.im/mysql) `Connection` or `Pool` object that will be used for querying column information. If a `Connection` or `Pool` object is passed to the constructor, it will not be destroyed/ended by Zongji's `stop()` method. @@ -75,86 +79,87 @@ If there is a `dateStrings` `mysql` configuration option in the connection detai Each instance includes the following methods: -Method Name | Arguments | Description -------------|-----------|------------------------ -`start` | `options` | Start receiving replication events, see options listed below -`stop` | *None* | Disconnect from MySQL server, stop receiving events -`on` | `eventName`, `handler` | Add a listener to the `binlog` or `error` event. Each handler function accepts one argument. +| Method Name | Arguments | Description | +| ----------- | ---------------------- | -------------------------------------------------------------------------------------------- | +| `start` | `options` | Start receiving replication events, see options listed below | +| `stop` | _None_ | Disconnect from MySQL server, stop receiving events | +| `on` | `eventName`, `handler` | Add a listener to the `binlog` or `error` event. Each handler function accepts one argument. | Some events can be emitted in different phases: -Event Name | Description ------------|------------------------ -`ready` | This event is occurred right after ZongJi successfully established a connection, setup slave status, and set binlog position. -`binlog` | Once a binlog is received and passes the filter, it will bubble up with this event. -`error` | Every error will be caught by this event. -`stopped` | Emitted when ZongJi connection is stopped (ZongJi#stop is called). +| Event Name | Description | +| ---------- | ----------------------------------------------------------------------------------------------------------------------------- | +| `ready` | This event is occurred right after ZongJi successfully established a connection, setup slave status, and set binlog position. | +| `binlog` | Once a binlog is received and passes the filter, it will bubble up with this event. | +| `error` | Every error will be caught by this event. | +| `stopped` | Emitted when ZongJi connection is stopped (ZongJi#stop is called). | **Options available:** -Option Name | Type | Description -------------|------|------------------------------- -`serverId` | `integer` | [Unique number (1 - 232)](https://dev.mysql.com/doc/refman/5.0/en/replication-options.html#option_mysqld_server-id) to identify this replication slave instance. Must be specified if running more than one instance of ZongJi. Must be used in `start()` method for effect.
**Default:** `1` -`startAtEnd` | `boolean` | Pass `true` to only emit binlog events that occur after ZongJi's instantiation. Must be used in `start()` method for effect.
**Default:** `false` -`filename` | `string` | Begin reading events from this binlog file. If specified together with `position`, will take precedence over `startAtEnd`. -`position` | `integer` | Begin reading events from this position. Must be included with `filename`. -`includeEvents` | `[string]` | Array of event names to include
**Example:** `['writerows', 'updaterows', 'deleterows']` -`excludeEvents` | `[string]` | Array of event names to exclude
**Example:** `['rotate', 'tablemap']` -`includeSchema` | `object` | Object describing which databases and tables to include (Only for row events). Use database names as the key and pass an array of table names or `true` (for the entire database).
**Example:** ```{ 'my_database': ['allow_table', 'another_table'], 'another_db': true }``` -`excludeSchema` | `object` | Object describing which databases and tables to exclude (Same format as `includeSchema`)
**Example:** ```{ 'other_db': ['disallowed_table'], 'ex_db': true }``` +| Option Name | Type | Description | +| --------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `serverId` | `integer` | [Unique number (1 - 232)](https://dev.mysql.com/doc/refman/5.0/en/replication-options.html#option_mysqld_server-id) to identify this replication slave instance. Must be specified if running more than one instance of ZongJi. Must be used in `start()` method for effect.
**Default:** `1` | +| `startAtEnd` | `boolean` | Pass `true` to only emit binlog events that occur after ZongJi's instantiation. Must be used in `start()` method for effect.
**Default:** `false` | +| `filename` | `string` | Begin reading events from this binlog file. If specified together with `position`, will take precedence over `startAtEnd`. | +| `position` | `integer` | Begin reading events from this position. Must be included with `filename`. | +| `includeEvents` | `[string]` | Array of event names to include
**Example:** `['writerows', 'updaterows', 'deleterows']` | +| `excludeEvents` | `[string]` | Array of event names to exclude
**Example:** `['rotate', 'tablemap']` | +| `includeSchema` | `object` | Object describing which databases and tables to include (Only for row events). Use database names as the key and pass an array of table names or `true` (for the entire database).
**Example:** `{ 'my_database': ['allow_table', 'another_table'], 'another_db': true }` | +| `excludeSchema` | `object` | Object describing which databases and tables to exclude (Same format as `includeSchema`)
**Example:** `{ 'other_db': ['disallowed_table'], 'ex_db': true }` | -* By default, all events and schema are emitted. -* `excludeSchema` and `excludeEvents` take precedence over `includeSchema` and `includeEvents`, respectively. +- By default, all events and schema are emitted. +- `excludeSchema` and `excludeEvents` take precedence over `includeSchema` and `includeEvents`, respectively. **Supported Binlog Events:** -Event name | Description -------------|--------------- -`unknown` | Catch any other events -`query` | [Insert/Update/Delete Query](https://dev.mysql.com/doc/internals/en/query-event.html) -`intvar` | [Autoincrement and LAST_INSERT_ID](https://dev.mysql.com/doc/internals/en/intvar-event.html) -`rotate` | [New Binlog file](https://dev.mysql.com/doc/internals/en/rotate-event.html) Not required to be included to rotate to new files, but it is required to be included in order to keep the `filename` and `position` properties updated with current values for [graceful restarting on errors](https://gist.github.com/numtel/5b37b2a7f47b380c1a099596c6f3db2f). -`format` | [Format Description](https://dev.mysql.com/doc/internals/en/format-description-event.html) -`xid` | [Transaction ID](https://dev.mysql.com/doc/internals/en/xid-event.html) -`tablemap` | Before any row event (must be included for any other row events) -`writerows` | Rows inserted, row data array available as `rows` property on event object -`updaterows` | Rows changed, row data array available as `rows` property on event object -`deleterows` | Rows deleted, row data array available as `rows` property on event object +| Event name | Description | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `unknown` | Catch any other events | +| `query` | [Insert/Update/Delete Query](https://dev.mysql.com/doc/internals/en/query-event.html) | +| `intvar` | [Autoincrement and LAST_INSERT_ID](https://dev.mysql.com/doc/internals/en/intvar-event.html) | +| `rotate` | [New Binlog file](https://dev.mysql.com/doc/internals/en/rotate-event.html) Not required to be included to rotate to new files, but it is required to be included in order to keep the `filename` and `position` properties updated with current values for [graceful restarting on errors](https://gist.github.com/numtel/5b37b2a7f47b380c1a099596c6f3db2f). | +| `format` | [Format Description](https://dev.mysql.com/doc/internals/en/format-description-event.html) | +| `xid` | [Transaction ID](https://dev.mysql.com/doc/internals/en/xid-event.html) | +| `tablemap` | Before any row event (must be included for any other row events) | +| `writerows` | Rows inserted, row data array available as `rows` property on event object | +| `updaterows` | Rows changed, row data array available as `rows` property on event object | +| `deleterows` | Rows deleted, row data array available as `rows` property on event object | **Event Methods** Neither method requires any arguments. -Name | Description --------|--------------------------- -`dump` | Log a description of the event to the console -`getEventName` | Return the name of the event +| Name | Description | +| -------------- | --------------------------------------------- | +| `dump` | Log a description of the event to the console | +| `getEventName` | Return the name of the event | ## Important Notes -* :star2: [All types allowed by `mysql`](https://github.com/mysqljs/mysql#type-casting) are supported by this package. -* :speak_no_evil: 64-bit integer is supported via package big-integer(see #108). If an integer is within the safe range of JS number (-2^53, 2^53), a Number object will returned, otherwise, will return as String. -* :point_right: `TRUNCATE` statement does not cause corresponding `DeleteRows` event. Use unqualified `DELETE FROM` for same effect. -* When using fractional seconds with `DATETIME` and `TIMESTAMP` data types in MySQL > 5.6.4, only millisecond precision is available due to the limit of Javascript's `Date` object. +- :star2: [All types allowed by `mysql`](https://github.com/mysqljs/mysql#type-casting) are supported by this package. +- :speak_no_evil: 64-bit integer is supported via package big-integer(see #108). If an integer is within the safe range of JS number (-2^53, 2^53), a Number object will returned, otherwise, will return as String. +- :point_right: `TRUNCATE` statement does not cause corresponding `DeleteRows` event. Use unqualified `DELETE FROM` for same effect. +- When using fractional seconds with `DATETIME` and `TIMESTAMP` data types in MySQL > 5.6.4, only millisecond precision is available due to the limit of Javascript's `Date` object. ## Run Tests -* install [Docker](https://www.docker.com/community-edition#download) -* run `docker-compose up` and then `./docker-test.sh` +- install [Docker](https://www.docker.com/community-edition#download) +- run `docker-compose up` and then `./docker-test.sh` ## References The following resources provided valuable information that greatly assisted in creating ZongJi: -* https://github.com/mysqljs/mysql -* https://github.com/felixge/faster-than-c/ -* https://web.archive.org/web/20130117004733/https://intuitive-search.blogspot.co.uk/2011/07/binary-log-api-and-replication-listener.html -* https://github.com/Sannis/node-mysql-libmysqlclient -* https://kkaefer.com/node-cpp-modules/ -* https://dev.mysql.com/doc/internals/en/replication-protocol.html -* https://web.archive.org/web/20200201195450/https://www.cs.wichita.edu/~chang/lecture/cs742/program/how-mysql-c-api.html -* https://github.com/jeremycole/mysql_binlog (Ruby implemenation of MySQL binlog parser) -* https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html +- https://github.com/mysqljs/mysql +- https://github.com/felixge/faster-than-c/ +- https://web.archive.org/web/20130117004733/https://intuitive-search.blogspot.co.uk/2011/07/binary-log-api-and-replication-listener.html +- https://github.com/Sannis/node-mysql-libmysqlclient +- https://kkaefer.com/node-cpp-modules/ +- https://dev.mysql.com/doc/internals/en/replication-protocol.html +- https://web.archive.org/web/20200201195450/https://www.cs.wichita.edu/~chang/lecture/cs742/program/how-mysql-c-api.html +- https://github.com/jeremycole/mysql_binlog (Ruby implemenation of MySQL binlog parser) +- https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html ## License + MIT diff --git a/docker-compose.yml b/docker-compose.yml index 23b0817..c473421 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,32 +1,21 @@ ---- -version: '2' services: - mysql55: - image: mysql:5.5 - command: [ "--server-id=1", "--log-bin=/var/lib/mysql/mysql-bin.log", "--binlog-format=row"] - networks: - default: - aliases: - - mysql55 - environment: - MYSQL_ROOT_PASSWORD: numtel - mysql56: - image: mysql:5.6 - command: [ "--server-id=1", "--log-bin=/var/lib/mysql/mysql-bin.log", "--binlog-format=row"] + mysql80: + image: mysql:8.0 + command: [ '--server-id=1', '--log-bin=/var/lib/mysql/mysql-bin.log'] networks: default: aliases: - - mysql56 + - mysql80 environment: - MYSQL_ROOT_PASSWORD: numtel + MYSQL_ROOT_PASSWORD: my_password - mysql57: - image: mysql:5.7 - command: [ "--server-id=1", "--log-bin=/var/lib/mysql/mysql-bin.log", "--binlog-format=row"] + mysql84: + image: mysql:8.4 + command: [ '--server-id=1', '--log-bin=/var/lib/mysql/mysql-bin.log'] networks: default: aliases: - - mysql57 + - mysql84 environment: - MYSQL_ROOT_PASSWORD: numtel + MYSQL_ROOT_PASSWORD: my_password diff --git a/docker-test.sh b/docker-test.sh index 3b21fc5..46d5445 100755 --- a/docker-test.sh +++ b/docker-test.sh @@ -1,11 +1,7 @@ #!/bin/bash -MYSQL_HOSTS="mysql55 mysql56 mysql57" +MYSQL_HOSTS="mysql80 mysql84" for hostname in ${MYSQL_HOSTS}; do - echo $hostname + node 8 - docker run -it --network=zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:8 npm test - echo $hostname + node 10 - docker run -it --network=zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:10 npm test - echo $hostname + node 12 - docker run -it --network=zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:12 npm test + echo $hostname + node 20 + docker run -it --network=powersync-mysql-zongji_default -e MYSQL_HOST=$hostname -w /build -v $PWD:/build node:20 npm test done diff --git a/example.js b/example.js index 361e11f..b4ea822 100644 --- a/example.js +++ b/example.js @@ -2,13 +2,13 @@ const ZongJi = require('./'); const zongji = new ZongJi({ - host : 'localhost', - user : 'zongji', - password : 'zongji', + host: 'localhost', + user: 'zongji', + password: 'zongji' // debug: true }); -zongji.on('binlog', function(evt) { +zongji.on('binlog', function (evt) { evt.dump(); }); @@ -16,7 +16,7 @@ zongji.start({ includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'] }); -process.on('SIGINT', function() { +process.on('SIGINT', function () { console.log('Got SIGINT.'); zongji.stop(); process.exit(); diff --git a/index.js b/index.js index 7f3ca87..02d7cbc 100644 --- a/index.js +++ b/index.js @@ -4,8 +4,8 @@ const EventEmitter = require('events').EventEmitter; const initBinlogClass = require('./lib/sequence/binlog'); const ConnectionConfigMap = { - 'Connection': obj => obj.config, - 'Pool': obj => obj.config.connectionConfig, + Connection: (obj) => obj.config, + Pool: (obj) => obj.config.connectionConfig }; const TableInfoQueryTemplate = `SELECT @@ -30,7 +30,7 @@ function ZongJi(dsn) { util.inherits(ZongJi, EventEmitter); // dsn - can be one instance of Connection or Pool / object / url string -ZongJi.prototype._establishConnection = function(dsn) { +ZongJi.prototype._establishConnection = function (dsn) { const createConnection = (options) => { let connection = mysql.createConnection(options); connection.on('error', this.emit.bind(this, 'error')); @@ -62,29 +62,26 @@ ZongJi.prototype._establishConnection = function(dsn) { this.connection = createConnection(binlogDsn); }; -ZongJi.prototype._isChecksumEnabled = function(next) { +ZongJi.prototype._isChecksumEnabled = function (next) { const SelectChecksumParamSql = 'select @@GLOBAL.binlog_checksum as checksum'; const SetChecksumSql = 'set @master_binlog_checksum=@@global.binlog_checksum'; const query = (conn, sql) => { - return new Promise( - (resolve, reject) => { - conn.query(sql, (err, result) => { - if (err) { - reject(err); - } - else { - resolve(result); - } - }); - } - ); + return new Promise((resolve, reject) => { + conn.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + }); }; let checksumEnabled = true; query(this.ctrlConnection, SelectChecksumParamSql) - .then(rows => { + .then((rows) => { if (rows[0].checksum === 'NONE') { checksumEnabled = false; return query(this.connection, 'SELECT 1'); @@ -94,13 +91,12 @@ ZongJi.prototype._isChecksumEnabled = function(next) { return query(this.connection, SetChecksumSql); } }) - .catch(err => { + .catch((err) => { if (err.toString().match(/ER_UNKNOWN_SYSTEM_VARIABLE/)) { checksumEnabled = false; // a simple query to open this.connection return query(this.connection, 'SELECT 1'); - } - else { + } else { next(err); } }) @@ -109,21 +105,19 @@ ZongJi.prototype._isChecksumEnabled = function(next) { }); }; -ZongJi.prototype._findBinlogEnd = function(next) { +ZongJi.prototype._findBinlogEnd = function (next) { this.ctrlConnection.query('SHOW BINARY LOGS', (err, rows) => { if (err) { // Errors should be emitted next(err); - } - else { + } else { next(null, rows.length > 0 ? rows[rows.length - 1] : null); } }); }; -ZongJi.prototype._fetchTableInfo = function(tableMapEvent, next) { - const sql = util.format(TableInfoQueryTemplate, - tableMapEvent.schemaName, tableMapEvent.tableName); +ZongJi.prototype._fetchTableInfo = function (tableMapEvent, next) { + const sql = util.format(TableInfoQueryTemplate, tableMapEvent.schemaName, tableMapEvent.tableName); this.ctrlConnection.query(sql, (err, rows) => { if (err) { @@ -135,9 +129,10 @@ ZongJi.prototype._fetchTableInfo = function(tableMapEvent, next) { } if (rows.length === 0) { - this.emit('error', new Error( - 'Insufficient permissions to access: ' + - tableMapEvent.schemaName + '.' + tableMapEvent.tableName)); + this.emit( + 'error', + new Error('Insufficient permissions to access: ' + tableMapEvent.schemaName + '.' + tableMapEvent.tableName) + ); // This is a fatal error, no additional binlog events will be // processed since next() will never be called return; @@ -154,48 +149,34 @@ ZongJi.prototype._fetchTableInfo = function(tableMapEvent, next) { }; // #_options will reset all the options. -ZongJi.prototype._options = function({ - serverId, - filename, - position, - startAtEnd, -}) { +ZongJi.prototype._options = function ({ serverId, filename, position, startAtEnd }) { this.options = { serverId, filename, position, - startAtEnd, + startAtEnd }; }; // #_filters will reset all the filters. -ZongJi.prototype._filters = function({ - includeEvents, - excludeEvents, - includeSchema, - excludeSchema, -}) { +ZongJi.prototype._filters = function ({ includeEvents, excludeEvents, includeSchema, excludeSchema }) { this.filters = { includeEvents, excludeEvents, includeSchema, - excludeSchema, + excludeSchema }; }; -ZongJi.prototype.get = function(name) { +ZongJi.prototype.get = function (name) { let result; if (typeof name === 'string') { result = this.options[name]; - } - else if (Array.isArray(name)) { - result = name.reduce( - (acc, cur) => { - acc[cur] = this.options[cur]; - return acc; - }, - {} - ); + } else if (Array.isArray(name)) { + result = name.reduce((acc, cur) => { + acc[cur] = this.options[cur]; + return acc; + }, {}); } return result; @@ -206,8 +187,7 @@ ZongJi.prototype.get = function(name) { // - `filename`, `position` the position of binlog to beigin with // - `startAtEnd` if true, will update filename / postion automatically // - `includeEvents`, `excludeEvents`, `includeSchema`, `exludeSchema` filter different binlog events bubbling -ZongJi.prototype.start = function(options = {}) { - +ZongJi.prototype.start = function (options = {}) { this._options(options); this._filters(options); @@ -215,15 +195,13 @@ ZongJi.prototype.start = function(options = {}) { this._isChecksumEnabled((err, checksumEnabled) => { if (err) { reject(err); - } - else { + } else { this.useChecksum = checksumEnabled; resolve(); } }); }; - const findBinlogEnd = (resolve, reject) => { this._findBinlogEnd((err, result) => { if (err) { @@ -234,7 +212,7 @@ ZongJi.prototype.start = function(options = {}) { this._options( Object.assign({}, options, { filename: result.Log_name, - position: result.File_size, + position: result.File_size }) ); } @@ -288,66 +266,47 @@ ZongJi.prototype.start = function(options = {}) { this.ready = true; this.emit('ready'); - this.connection._protocol._enqueue( - new this.BinlogClass(binlogHandler) - ); + this.connection._protocol._enqueue(new this.BinlogClass(binlogHandler)); }) - .catch(err => { + .catch((err) => { this.emit('error', err); }); - }; -ZongJi.prototype.stop = function() { +ZongJi.prototype.stop = function () { // Binary log connection does not end with destroy() this.connection.destroy(); - this.ctrlConnection.query( - 'KILL ' + this.connection.threadId, - () => { - if (this.ctrlConnectionOwner) { - this.ctrlConnection.destroy(); - } - this.emit('stopped'); + this.ctrlConnection.query('KILL ' + this.connection.threadId, () => { + if (this.ctrlConnectionOwner) { + this.ctrlConnection.destroy(); } - ); + this.emit('stopped'); + }); }; // It includes every events by default. -ZongJi.prototype._skipEvent = function(name) { +ZongJi.prototype._skipEvent = function (name) { const includes = this.filters.includeEvents; const excludes = this.filters.excludeEvents; - let included = (includes === undefined) || - (Array.isArray(includes) && (includes.indexOf(name) > -1)); - let excluded = Array.isArray(excludes) && (excludes.indexOf(name) > -1); + let included = includes === undefined || (Array.isArray(includes) && includes.indexOf(name) > -1); + let excluded = Array.isArray(excludes) && excludes.indexOf(name) > -1; return excluded || !included; }; // It doesn't skip any schema by default. -ZongJi.prototype._skipSchema = function(database, table) { +ZongJi.prototype._skipSchema = function (database, table) { const includes = this.filters.includeSchema; const excludes = this.filters.excludeSchema || {}; - let included = (includes === undefined) || - ( - (database in includes) && - ( - includes[database] === true || - ( - Array.isArray(includes[database]) && - includes[database].indexOf(table) > -1 - ) - ) - ); - let excluded = (database in excludes) && - ( - excludes[database] === true || - ( - Array.isArray(excludes[database]) && - excludes[database].indexOf(table) > -1 - ) - ); + let included = + includes === undefined || + (database in includes && + (includes[database] === true || (Array.isArray(includes[database]) && includes[database].indexOf(table) > -1))); + let excluded = + database in excludes && + (excludes[database] === true || (Array.isArray(excludes[database]) && excludes[database].indexOf(table) > -1)); return excluded || !included; }; diff --git a/lib/binlog_event.js b/lib/binlog_event.js index 1a90521..da76892 100644 --- a/lib/binlog_event.js +++ b/lib/binlog_event.js @@ -9,22 +9,22 @@ function BinlogEvent(parser, options) { this.size = options.size; } -BinlogEvent.prototype.getEventName = function() { +BinlogEvent.prototype.getEventName = function () { return this.getTypeName().toLowerCase(); }; -BinlogEvent.prototype.getTypeName = function() { +BinlogEvent.prototype.getTypeName = function () { return this.constructor.name; }; -BinlogEvent.prototype.dump = function() { +BinlogEvent.prototype.dump = function () { console.log('=== %s ===', this.getTypeName()); console.log('Date: %s', new Date(this.timestamp)); console.log('Next log position: %d', this.nextPosition); console.log('Event size:', this.size); }; -BinlogEvent.prototype._readTableId = function(parser) { +BinlogEvent.prototype._readTableId = function (parser) { this.tableId = Common.parseUInt48(parser); }; @@ -41,9 +41,9 @@ function Rotate(parser) { } util.inherits(Rotate, BinlogEvent); -Rotate.prototype.dump = function() { +Rotate.prototype.dump = function () { console.log('=== %s ===', this.getTypeName()); - console.log('Event size: %d', (this.size)); + console.log('Event size: %d', this.size); console.log('Position: %d', this.position); console.log('Next binlog file: %s', this.binlogName); }; @@ -53,6 +53,21 @@ function Format() { } util.inherits(Format, BinlogEvent); +/* A GTID Log event + * Attributes: + * flags: This number contains flags related to the GTID, such as whether the transaction was the last one in a group or if it was a standalone transaction + * serverId: The Server UUID (SID), which is a 16-byte Buffer + * transactionRange: The Global Transaction ID number, which is a 64-bit unsigned integer + */ + +function GtidLog(parser) { + BinlogEvent.apply(this, arguments); + this.flags = parser.parseUnsignedNumber(1); + this.serverId = parser.parseBuffer(16); + this.transactionRange = Common.parseUInt64(parser); +} +util.inherits(GtidLog, BinlogEvent); + /* A COMMIT event * Attributes: * xid: Transaction ID for 2PC @@ -98,7 +113,7 @@ function Query(parser) { } util.inherits(Query, BinlogEvent); -Query.prototype.dump = function() { +Query.prototype.dump = function () { console.log('=== %s ===', this.getTypeName()); console.log('Date: %s', new Date(this.timestamp)); console.log('Next log position: %d', this.nextPosition); @@ -121,11 +136,11 @@ function IntVar(parser) { util.inherits(IntVar, BinlogEvent); const INTVAR_TYPES = ['INVALID_INT', 'LAST_INSERT_ID', 'INSERT_ID']; -IntVar.prototype.getIntTypeName = function() { - return INTVAR_TYPES[this.type] || 'INVALID_INT'; +IntVar.prototype.getIntTypeName = function () { + return INTVAR_TYPES[this.type] || 'INVALID_INT'; }; -IntVar.prototype.dump = function() { +IntVar.prototype.dump = function () { console.log('=== %s ===', this.getTypeName()); console.log('Date: %s', new Date(this.timestamp)); console.log('Next log position: %d', this.nextPosition); @@ -134,9 +149,9 @@ IntVar.prototype.dump = function() { }; /** - * This evenement describe the structure of a table. - * It's send before a change append on a table. - * A end user of the lib should have no usage of this + * This event describes the structure of a table. + * It's sent before a change append on a table. + * An end user of the lib should have no usage of this * * see http://dev.mysql.com/doc/internals/en/table-map-event.html **/ @@ -163,8 +178,7 @@ function TableMap(parser, options, zongji) { this._filtered = true; // Removed cached data so that row events do not emit either delete this.tableMap[this.tableId]; - } - else { + } else { parser.parseUnsignedNumber(1); this.columnCount = parser.parseLengthCodedNumber(); @@ -178,7 +192,7 @@ function TableMap(parser, options, zongji) { util.inherits(TableMap, BinlogEvent); -TableMap.prototype.updateColumnInfo = function() { +TableMap.prototype.updateColumnInfo = function () { const columnsMetadata = this.columnsMetadata; for (let i = 0; i < this.columnCount; i++) { if (columnsMetadata[i] && columnsMetadata[i].type) { @@ -203,8 +217,8 @@ TableMap.prototype.updateColumnInfo = function() { tableMap.columns = columns; }; -TableMap.prototype._readColumnMetadata = function(parser) { - this.columnsMetadata = this.columnTypes.map(function(code) { +TableMap.prototype._readColumnMetadata = function (parser) { + this.columnsMetadata = this.columnTypes.map(function (code) { let result; switch (code) { @@ -216,7 +230,7 @@ TableMap.prototype._readColumnMetadata = function(parser) { break; case Common.MysqlTypes.VARCHAR: result = { - 'max_length': parser.parseUnsignedNumber(2) + max_length: parser.parseUnsignedNumber(2) }; break; case Common.MysqlTypes.BIT: { @@ -230,14 +244,14 @@ TableMap.prototype._readColumnMetadata = function(parser) { case Common.MysqlTypes.NEWDECIMAL: result = { precision: parser.parseUnsignedNumber(1), - decimals: parser.parseUnsignedNumber(1), + decimals: parser.parseUnsignedNumber(1) }; break; case Common.MysqlTypes.BLOB: case Common.MysqlTypes.GEOMETRY: case Common.MysqlTypes.JSON: result = { - 'length_size': parser.parseUnsignedNumber(1) + length_size: parser.parseUnsignedNumber(1) }; break; case Common.MysqlTypes.STRING: @@ -249,16 +263,14 @@ TableMap.prototype._readColumnMetadata = function(parser) { // provided 'type' here. const metadata = (parser.parseUnsignedNumber(1) << 8) + parser.parseUnsignedNumber(1); const realType = metadata >> 8; - if (realType === Common.MysqlTypes.ENUM - || realType === Common.MysqlTypes.SET) { + if (realType === Common.MysqlTypes.ENUM || realType === Common.MysqlTypes.SET) { result = { type: realType, size: metadata & 0x00ff }; } else { result = { - 'max_length': (( - (metadata >> 4) & 0x300) ^ 0x300) + (metadata & 0x00ff) + max_length: (((metadata >> 4) & 0x300) ^ 0x300) + (metadata & 0x00ff) }; } break; @@ -276,7 +288,7 @@ TableMap.prototype._readColumnMetadata = function(parser) { }); }; -TableMap.prototype.dump = function() { +TableMap.prototype.dump = function () { BinlogEvent.prototype.dump.apply(this); console.log('Table id: %d', this.tableId); console.log('Schema: %s', this.schemaName); @@ -298,3 +310,4 @@ exports.IntVar = IntVar; exports.Xid = Xid; exports.TableMap = TableMap; exports.Unknown = Unknown; +exports.GtidLog = GtidLog; diff --git a/lib/code_map.js b/lib/code_map.js index 1e66b88..4ca1d20 100644 --- a/lib/code_map.js +++ b/lib/code_map.js @@ -47,6 +47,7 @@ const EventClass = { ROTATE_EVENT: events.Rotate, FORMAT_DESCRIPTION_EVENT: events.Format, XID_EVENT: events.Xid, + GTID_LOG_EVENT: events.GtidLog, TABLE_MAP_EVENT: events.TableMap, DELETE_ROWS_EVENT_V1: rowsEvents.DeleteRows, @@ -54,9 +55,9 @@ const EventClass = { WRITE_ROWS_EVENT_V1: rowsEvents.WriteRows, WRITE_ROWS_EVENT_V2: rowsEvents.WriteRows, UPDATE_ROWS_EVENT_V2: rowsEvents.UpdateRows, - DELETE_ROWS_EVENT_V2: rowsEvents.DeleteRows, + DELETE_ROWS_EVENT_V2: rowsEvents.DeleteRows }; -exports.getEventClass = function(code) { +exports.getEventClass = function (code) { return EventClass[CodeEvent[code]] || events.Unknown; }; diff --git a/lib/common.js b/lib/common.js index 19471f8..6b4dbe2 100644 --- a/lib/common.js +++ b/lib/common.js @@ -3,7 +3,7 @@ const decodeJson = require('./json_decode'); const dtDecode = require('./datetime_decode'); const bigInt = require('big-integer'); -const MysqlTypes = exports.MysqlTypes = { +const MysqlTypes = (exports.MysqlTypes = { DECIMAL: 0, TINY: 1, SHORT: 2, @@ -36,38 +36,39 @@ const MysqlTypes = exports.MysqlTypes = { BLOB: 252, VAR_STRING: 253, STRING: 254, - GEOMETRY: 255, -}; + GEOMETRY: 255 +}); const TWO_TO_POWER_THIRTY_TWO = Math.pow(2, 32); const TWO_TO_POWER_SIXTY_THREE = '9223372036854775808'; // Math.pow(2, 63) or 1 << 63 // This function will return a Number // if the reuslt < Math.MAX_SAFE_INTEGER or reuslt > Math.MIN_SAFE_INTEGER, // otherwise, will return a string. -const parseUInt64 = exports.parseUInt64 = function(parser) { +const parseUInt64 = (exports.parseUInt64 = function (parser) { const low = parser.parseUnsignedNumber(4); const high = parser.parseUnsignedNumber(4); - if (high >>> 21) { // using bigint here + if (high >>> 21) { + // using bigint here return bigInt(TWO_TO_POWER_THIRTY_TWO).multiply(high).add(low).toString(); } - return (high * Math.pow(2,32)) + low; -}; + return high * Math.pow(2, 32) + low; +}); -exports.parseUInt48 = function(parser) { +exports.parseUInt48 = function (parser) { const low = parser.parseUnsignedNumber(4); const high = parser.parseUnsignedNumber(2); - return (high * Math.pow(2, 32)) + low; + return high * Math.pow(2, 32) + low; }; -const parseUInt24 = exports.parseUInt24 = function(parser) { +const parseUInt24 = (exports.parseUInt24 = function (parser) { const low = parser.parseUnsignedNumber(2); const high = parser.parseUnsignedNumber(1); return (high << 16) + low; -}; +}); -exports.parseBytesArray = function(parser, length) { +exports.parseBytesArray = function (parser, length) { const result = new Array(length); for (let i = 0; i < length; i++) { result[i] = parser.parseUnsignedNumber(1); @@ -79,30 +80,31 @@ exports.parseBytesArray = function(parser, length) { // @param type String Definition of column 'set(...)' or 'enum(...)' // @param prefixLen Integer Number of characters before list starts // (e.g. 'set(': 4, 'enum(': 5) -const parseSetEnumTypeDef = function(type, prefixLen) { +const parseSetEnumTypeDef = function (type, prefixLen) { // listed distinct elements should not include commas - return type.substr(prefixLen, type.length - prefixLen - 1) - .split(',').map(function(opt) { - return (opt[0] === '"' || opt[0] === "'") ? - opt.substr(1, opt.length - 2) : opt; + return type + .substr(prefixLen, type.length - prefixLen - 1) + .split(',') + .map(function (opt) { + return opt[0] === '"' || opt[0] === "'" ? opt.substr(1, opt.length - 2) : opt; }); }; -const zeroPad = exports.zeroPad = function(num, size) { +const zeroPad = (exports.zeroPad = function (num, size) { // Max 32 digits const s = '00000000000000000000000000000000' + num; - return s.substr(s.length-size); -}; + return s.substr(s.length - size); +}); -const sliceBits = exports.sliceBits = function(input, start, end) { +const sliceBits = (exports.sliceBits = function (input, start, end) { // ex: start: 10, end: 15 = "111110000000000" - const match = (((1 << end) - 1) ^ ((1 << start) - 1)); + const match = ((1 << end) - 1) ^ ((1 << start) - 1); return (input & match) >> start; -}; +}); // Use Typed Arrays to convert IEEE 754 numbers // Pass only high for 32-bit float, pass high and low for 64-bit double -const parseIEEE754Float = exports.parseIEEE754Float = function(high, low) { +const parseIEEE754Float = (exports.parseIEEE754Float = function (high, low) { if (low !== undefined) { let value = new DataView(new ArrayBuffer(8)); value.setUint32(0, high); @@ -113,15 +115,15 @@ const parseIEEE754Float = exports.parseIEEE754Float = function(high, low) { value.setUint32(0, high); return value.getFloat32(0); } -}; +}); -const getUInt32Value = exports.getUInt32Value = function(input) { +const getUInt32Value = (exports.getUInt32Value = function (input) { // Last bit is not sign, it is part of value! - if (input & (1 << 31)) return Math.pow(2, 31) + (input & ((1 << 31) -1)); + if (input & (1 << 31)) return Math.pow(2, 31) + (input & ((1 << 31) - 1)); else return input; -}; +}); -const parseAnyInt = function(parser, column, columnSchema) { +const parseAnyInt = function (parser, column, columnSchema) { let result, size; switch (column.type) { case MysqlTypes.TINY: @@ -147,10 +149,10 @@ const parseAnyInt = function(parser, column, columnSchema) { } if (columnSchema.COLUMN_TYPE.indexOf('unsigned') === -1) { const length = size * 8; - const int64 = (length == 64); + const int64 = length == 64; // Flip bits on negative signed integer - if (!int64 && (result & (1 << (length - 1)))) { - result = ((result ^ (Math.pow(2, length) - 1)) * -1) - 1; + if (!int64 && result & (1 << (length - 1))) { + result = (result ^ (Math.pow(2, length) - 1)) * -1 - 1; } else if (int64 && bigInt(result).greaterOrEquals(bigInt(TWO_TO_POWER_SIXTY_THREE))) { const Max64BitNumber = bigInt('18446744073709551615'); // 2^64 - 1 result = bigInt(result).xor(Max64BitNumber).add(1).multiply(-1); @@ -167,17 +169,20 @@ const parseAnyInt = function(parser, column, columnSchema) { return result; }; -const readInt24BE = function(buf, offset, noAssert) { - return (buf.readInt8(offset, noAssert) << 16) + - buf.readUInt16BE(offset + 1, noAssert); +const readInt24BE = function (buf, offset, noAssert) { + return (buf.readInt8(offset, noAssert) << 16) + buf.readUInt16BE(offset + 1, noAssert); }; -const readIntBE = function(buf, offset, length, noAssert) { +const readIntBE = function (buf, offset, length, noAssert) { switch (length) { - case 1: return buf.readInt8(offset, noAssert); - case 2: return buf.readInt16BE(offset, noAssert); - case 3: return readInt24BE(buf, offset, noAssert); - case 4: return buf.readInt32BE(offset, noAssert); + case 1: + return buf.readInt8(offset, noAssert); + case 2: + return buf.readInt16BE(offset, noAssert); + case 3: + return readInt24BE(buf, offset, noAssert); + case 4: + return buf.readInt32BE(offset, noAssert); } }; @@ -185,7 +190,7 @@ const readIntBE = function(buf, offset, length, noAssert) { // https://github.com/jeremycole/mysql_binlog/blob/master/lib/mysql_binlog/binlog_field_parser.rb // Some more information about DECIMAL types: // http://dev.mysql.com/doc/refman/5.5/en/precision-math-decimal-characteristics.html -const parseNewDecimal = function(parser, column) { +const parseNewDecimal = function (parser, column) { // Constants of format const digitsPerInteger = 9; const compressedBytes = [0, 1, 1, 2, 2, 3, 3, 4, 4, 4]; @@ -194,12 +199,12 @@ const parseNewDecimal = function(parser, column) { const integral = column.metadata.precision - scale; const uncompIntegral = Math.floor(integral / digitsPerInteger); const uncompFractional = Math.floor(scale / digitsPerInteger); - const compIntegral = integral - (uncompIntegral * digitsPerInteger); - const compFractional = scale - (uncompFractional * digitsPerInteger); + const compIntegral = integral - uncompIntegral * digitsPerInteger; + const compFractional = scale - uncompFractional * digitsPerInteger; // Grab buffer portion - const size = (uncompIntegral * 4) + compressedBytes[compIntegral] + - (uncompFractional * 4) + compressedBytes[compFractional]; + const size = + uncompIntegral * 4 + compressedBytes[compIntegral] + uncompFractional * 4 + compressedBytes[compFractional]; const buffer = parser._buffer.slice(parser._offset, parser._offset + size); parser._offset += size; // Move binlog parser position forward @@ -250,7 +255,7 @@ const parseNewDecimal = function(parser, column) { // Did not work in place. Function cribbed from lines 311-363 of // https://github.com/felixge/node-mysql/blob/cfd0ce3572d75c3c82103418d1d03cbe67eaf8a1/lib/protocol/Parser.js -const parseGeometryValue = function(buffer) { +const parseGeometryValue = function (buffer) { let offset = 4; if (buffer === null || !buffer.length) { @@ -259,35 +264,47 @@ const parseGeometryValue = function(buffer) { function parseGeometry() { let result = null; - const byteOrder = buffer.readUInt8(offset); offset += 1; - const wkbType = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + const byteOrder = buffer.readUInt8(offset); + offset += 1; + const wkbType = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); + offset += 4; let x, y, numPoints, i; switch (wkbType) { case 1: // WKBPoint - x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - result = {x: x, y: y}; + x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); + offset += 8; + y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); + offset += 8; + result = { x: x, y: y }; break; case 2: // WKBLineString - numPoints = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + numPoints = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); + offset += 4; result = []; for (i = numPoints; i > 0; i--) { - x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - result.push({x: x, y: y}); + x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); + offset += 8; + y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); + offset += 8; + result.push({ x: x, y: y }); } break; - case 3: {// WKBPolygon - const numRings = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + case 3: { + // WKBPolygon + const numRings = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); + offset += 4; result = []; for (i = numRings; i > 0; i--) { - numPoints = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + numPoints = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); + offset += 4; const line = []; for (let j = numPoints; j > 0; j--) { - x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - line.push({x: x, y: y}); + x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); + offset += 8; + y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); + offset += 8; + line.push({ x: x, y: y }); } result.push(line); } @@ -296,8 +313,10 @@ const parseGeometryValue = function(buffer) { case 4: // WKBMultiPoint case 5: // WKBMultiLineString case 6: // WKBMultiPolygon - case 7: {// WKBGeometryCollection - const num = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + case 7: { + // WKBGeometryCollection + const num = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); + offset += 4; result = []; for (i = num; i > 0; i--) { result.push(parseGeometry()); @@ -312,7 +331,7 @@ const parseGeometryValue = function(buffer) { // Returns false, or an object describing the fraction of a second part of a // TIME, DATETIME, or TIMESTAMP. -const readTemporalFraction = function(parser, fractionPrecision) { +const readTemporalFraction = function (parser, fractionPrecision) { if (!fractionPrecision) return false; let fractionSize = Math.ceil(fractionPrecision / 2); let fraction = readIntBE(parser._buffer, parser._offset, fractionSize); @@ -330,9 +349,9 @@ const readTemporalFraction = function(parser, fractionPrecision) { } return { - value: fraction, // the integer after the decimal place + value: fraction, // the integer after the decimal place precision: fractionPrecision, // the number of digits after the decimal - milliseconds: milliseconds // the unrounded 3 digits after the decimal + milliseconds: milliseconds // the unrounded 3 digits after the decimal }; }; @@ -340,14 +359,13 @@ const readTemporalFraction = function(parser, fractionPrecision) { // The parser object contains the raw value, and functions useful for value // interpretation, but not the underlying column type or how the value ought to // be interpreted based on that column type. -exports.readMysqlValue = function( - parser, // node-mysql parser instance, from mysql/lib/protocol/Parser - column, // tableMap.columns[columnNumber] - columnSchema, // tableMap.columnSchemas[columnNumber] - tableMap, // used directly only to get extra info for error messages - zongji // the ZongJi instance, used to read options and emit errors - ) -{ +exports.readMysqlValue = function ( + parser, // node-mysql parser instance, from mysql/lib/protocol/Parser + column, // tableMap.columns[columnNumber] + columnSchema, // tableMap.columnSchemas[columnNumber] + tableMap, // used directly only to get extra info for error messages + zongji // the ZongJi instance, used to read options and emit errors +) { let result; let high, low; let raw; @@ -469,9 +487,9 @@ exports.readMysqlValue = function( raw = parseUInt24(parser); result = dtDecode.getDate( zongji.connection.config.dateStrings, // node-mysql dateStrings option - sliceBits(raw, 9, 24), // year - sliceBits(raw, 5, 9), // month - sliceBits(raw, 0, 5) // day + sliceBits(raw, 9, 24), // year + sliceBits(raw, 5, 9), // month + sliceBits(raw, 0, 5) // day ); break; case MysqlTypes.TIME: @@ -485,10 +503,13 @@ exports.readMysqlValue = function( second = raw % 100; if (isNegative) second += 1; - result = (isNegative ? '-' : '') + - zeroPad(hour, hour > 99 ? 3 : 2) + ':' + - zeroPad(minute, 2) + ':' + - zeroPad(second, 2); + result = + (isNegative ? '-' : '') + + zeroPad(hour, hour > 99 ? 3 : 2) + + ':' + + zeroPad(minute, 2) + + ':' + + zeroPad(second, 2); break; case MysqlTypes.TIME2: raw = readIntBE(parser._buffer, parser._offset, 3); @@ -506,10 +527,13 @@ exports.readMysqlValue = function( second++; } - result = (isNegative ? '-' : '') + - zeroPad(hour, hour > 99 ? 3 : 2) + ':' + - zeroPad(minute, 2) + ':' + - zeroPad(second, 2); + result = + (isNegative ? '-' : '') + + zeroPad(hour, hour > 99 ? 3 : 2) + + ':' + + zeroPad(minute, 2) + + ':' + + zeroPad(second, 2); if (fraction !== false) { result += dtDecode.getFractionString(fraction); @@ -520,13 +544,13 @@ exports.readMysqlValue = function( date = Math.floor(raw / 1000000); time = raw % 1000000; result = dtDecode.getDateTime( - zongji.connection.config.dateStrings, // node-mysql dateStrings option - Math.floor(date / 10000), // year - Math.floor((date % 10000) / 100), // month - date % 100, // day - Math.floor(time / 10000), // hour - Math.floor((time % 10000) / 100), // minutes - time % 100 // seconds + zongji.connection.config.dateStrings, // node-mysql dateStrings option + Math.floor(date / 10000), // year + Math.floor((date % 10000) / 100), // month + date % 100, // day + Math.floor(time / 10000), // hour + Math.floor((time % 10000) / 100), // minutes + time % 100 // seconds ); break; case MysqlTypes.DATETIME2: { @@ -540,12 +564,12 @@ exports.readMysqlValue = function( result = dtDecode.getDateTime( zongji.connection.config.dateStrings, // node-mysql dateStrings option Math.floor(yearMonth / 13), // year - (yearMonth % 13), // month - sliceBits(rawLow, 17, 22), // day - sliceBits(rawLow, 12, 17), // hour - sliceBits(rawLow, 6, 12), // minutes - sliceBits(rawLow, 0, 6), // seconds - fraction // fraction of a second object + yearMonth % 13, // month + sliceBits(rawLow, 17, 22), // day + sliceBits(rawLow, 12, 17), // hour + sliceBits(rawLow, 6, 12), // minutes + sliceBits(rawLow, 0, 6), // seconds + fraction // fraction of a second object ); break; } @@ -557,9 +581,11 @@ exports.readMysqlValue = function( raw = readIntBE(parser._buffer, parser._offset, 4); parser._offset += 4; fraction = readTemporalFraction(parser, column.metadata.decimals); - result = dtDecode.getTimeStamp(zongji.connection.config.dateStrings, - raw, // seconds from epoch - fraction); // fraction of a second object + result = dtDecode.getTimeStamp( + zongji.connection.config.dateStrings, + raw, // seconds from epoch + fraction + ); // fraction of a second object break; case MysqlTypes.YEAR: raw = parser.parseUnsignedNumber(1); @@ -575,11 +601,20 @@ exports.readMysqlValue = function( case MysqlTypes.NEWDATE: // Not used default: result = undefined; - zongji.emit('error', - new Error('Unsupported type "' + column.type + - '" on column "' + column.name + - '" of the table "' + tableMap.tableName + - '" in the database "' + tableMap.parentSchema + '"')); + zongji.emit( + 'error', + new Error( + 'Unsupported type "' + + column.type + + '" on column "' + + column.name + + '" of the table "' + + tableMap.tableName + + '" in the database "' + + tableMap.parentSchema + + '"' + ) + ); } return result; }; diff --git a/lib/datetime_decode.js b/lib/datetime_decode.js index c0e9d30..c7bb56e 100644 --- a/lib/datetime_decode.js +++ b/lib/datetime_decode.js @@ -8,35 +8,29 @@ const common = require('./common'); // used only for common.zeroPad // dateStrings are used only if the dateStrings option is true, or is an array // containing the sql type name string, 'DATE', 'DATETIME', or 'TIMESTAMP'. // This follows the documentation of the dateStrings option in node-mysql. -const useDateStringsForType = function(dateStrings, sqlTypeString) { - return dateStrings && - (dateStrings === true || - dateStrings.indexOf && dateStrings.indexOf(sqlTypeString) > -1); +const useDateStringsForType = function (dateStrings, sqlTypeString) { + return dateStrings && (dateStrings === true || (dateStrings.indexOf && dateStrings.indexOf(sqlTypeString) > -1)); }; // fraction is the fractional second object from readTemporalFraction(). // returns '' or a '.' followed by fraction.precision digits, like '.123' -const getFractionString = exports.getFractionString = function(fraction) { - return fraction ? - '.' + common.zeroPad(fraction.value, fraction.precision) : - ''; -}; +const getFractionString = (exports.getFractionString = function (fraction) { + return fraction ? '.' + common.zeroPad(fraction.value, fraction.precision) : ''; +}); // 1950-00-00 and the like are perfectly valid Mysql dateStrings. A 0 portion // of a date is essentially a null part of the date, so we should keep it. // year, month, and date must be integers >= 0. January is month === 1. -const getDateString = exports.getDateString = function(year, month, date) { - return common.zeroPad(year, 4) + '-' + - common.zeroPad(month, 2) + '-' + - common.zeroPad(date, 2); -}; +const getDateString = (exports.getDateString = function (year, month, date) { + return common.zeroPad(year, 4) + '-' + common.zeroPad(month, 2) + '-' + common.zeroPad(date, 2); +}); // Date object months are 1 less than Mysql months, and we need to filter 0. // If we don't filter 0, 2017-00-01 will become the javascript Date 2016-12-01, // which is not what it means. It means 2017-NULL-01, but the Date object // cannot handle it, so we want to return an invalid month, rather than a // subtracted month. -const jsMonthFromMysqlMonth = function(month) { +const jsMonthFromMysqlMonth = function (month) { return month > 0 ? month - 1 : undefined; }; @@ -44,16 +38,14 @@ const jsMonthFromMysqlMonth = function(month) { // option. With the dateStrings option, it can output valid Mysql DATE strings // representing values that cannot be represented by a Date object, such as // values with a null part like '1950-00-04', or a zero date '0000-00-00'. -exports.getDate = function(dateStrings, // node-mysql dateStrings option - year, - month, // January === 1 - date - ) -{ +exports.getDate = function ( + dateStrings, // node-mysql dateStrings option + year, + month, // January === 1 + date +) { if (!useDateStringsForType(dateStrings, 'DATE')) { - return new Date(year, - jsMonthFromMysqlMonth(month), - date); + return new Date(Date.UTC(year, jsMonthFromMysqlMonth(month), date)); } return getDateString(year, month, date); }; @@ -62,30 +54,31 @@ exports.getDate = function(dateStrings, // node-mysql dateStrings option // option. Fraction is an optional parameter that comes from // readTemporalFraction(). Mysql dateStrings are needed for microsecond // precision, or to represent '0000-00-00 00:00:00'. -exports.getDateTime = function(dateStrings, // node-mysql dateStrings option - year, - month, // January === 1 - date, - hour, - minute, - second, - fraction // optional fractional second object - ) -{ +exports.getDateTime = function ( + dateStrings, // node-mysql dateStrings option + year, + month, // January === 1 + date, + hour, + minute, + second, + fraction // optional fractional second object +) { if (!useDateStringsForType(dateStrings, 'DATETIME')) { - return new Date(year, - jsMonthFromMysqlMonth(month), - date, - hour, - minute, - second, - fraction ? fraction.milliseconds : 0); + return new Date( + Date.UTC(year, jsMonthFromMysqlMonth(month), date, hour, minute, second, fraction ? fraction.milliseconds : 0) + ); } - return getDateString(year, month, date) + ' ' + - common.zeroPad(hour, 2) + ':' + - common.zeroPad(minute, 2) + ':' + - common.zeroPad(second, 2) + - getFractionString(fraction); + return ( + getDateString(year, month, date) + + ' ' + + common.zeroPad(hour, 2) + + ':' + + common.zeroPad(minute, 2) + + ':' + + common.zeroPad(second, 2) + + getFractionString(fraction) + ); }; // Returns a new Date object or Mysql dateString, following the dateStrings @@ -93,11 +86,11 @@ exports.getDateTime = function(dateStrings, // node-mysql dateStrings option // readTemporalFraction(). With the dateStrings option from node-mysql, // this returns a mysql TIMESTAMP string, like '1975-03-01 23:03:20.38945' or // '1975-03-01 00:03:20'. Mysql strings are needed for precision beyond ms. -exports.getTimeStamp = function(dateStrings, // node-mysql dateStrings option - secondsFromEpoch, // an integer - fraction // optional fraction of second object - ) -{ +exports.getTimeStamp = function ( + dateStrings, // node-mysql dateStrings option + secondsFromEpoch, // an integer + fraction // optional fraction of second object +) { const milliseconds = fraction ? fraction.milliseconds : 0; const dateObject = new Date(secondsFromEpoch * 1000 + milliseconds); if (!useDateStringsForType(dateStrings, 'TIMESTAMP')) { @@ -106,11 +99,14 @@ exports.getTimeStamp = function(dateStrings, // node-mysql dateStrings option if (secondsFromEpoch === 0 && (!fraction || fraction.value === 0)) { return '0000-00-00 00:00:00' + getFractionString(fraction); } - return getDateString(dateObject.getFullYear(), - dateObject.getMonth() + 1, - dateObject.getDate()) + ' ' + - common.zeroPad(dateObject.getHours(), 2) + ':' + - common.zeroPad(dateObject.getMinutes(), 2) + ':' + - common.zeroPad(dateObject.getSeconds(), 2) + - getFractionString(fraction); + return ( + getDateString(dateObject.getFullYear(), dateObject.getMonth() + 1, dateObject.getDate()) + + ' ' + + common.zeroPad(dateObject.getHours(), 2) + + ':' + + common.zeroPad(dateObject.getMinutes(), 2) + + ':' + + common.zeroPad(dateObject.getSeconds(), 2) + + getFractionString(fraction) + ); }; diff --git a/lib/json_decode.js b/lib/json_decode.js index 96de019..c79b9e4 100644 --- a/lib/json_decode.js +++ b/lib/json_decode.js @@ -3,25 +3,25 @@ const Parser = require('@vlasky/mysql/lib/protocol/Parser'); const JSONB_TYPE_SMALL_OBJECT = 0; const JSONB_TYPE_LARGE_OBJECT = 1; -const JSONB_TYPE_SMALL_ARRAY = 2; -const JSONB_TYPE_LARGE_ARRAY = 3; -const JSONB_TYPE_LITERAL = 4; -const JSONB_TYPE_INT16 = 5; -const JSONB_TYPE_UINT16 = 6; -const JSONB_TYPE_INT32 = 7; -const JSONB_TYPE_UINT32 = 8; -const JSONB_TYPE_INT64 = 9; -const JSONB_TYPE_UINT64 = 10; -const JSONB_TYPE_DOUBLE = 11; -const JSONB_TYPE_STRING = 12; -const JSONB_TYPE_OPAQUE = 15; +const JSONB_TYPE_SMALL_ARRAY = 2; +const JSONB_TYPE_LARGE_ARRAY = 3; +const JSONB_TYPE_LITERAL = 4; +const JSONB_TYPE_INT16 = 5; +const JSONB_TYPE_UINT16 = 6; +const JSONB_TYPE_INT32 = 7; +const JSONB_TYPE_UINT32 = 8; +const JSONB_TYPE_INT64 = 9; +const JSONB_TYPE_UINT64 = 10; +const JSONB_TYPE_DOUBLE = 11; +const JSONB_TYPE_STRING = 12; +const JSONB_TYPE_OPAQUE = 15; -const JSONB_LITERALS = [ null, true, false ]; +const JSONB_LITERALS = [null, true, false]; // node-mysql prefixes binary string values const VAR_STRING_PREFIX = 'base64:type253:'; -module.exports = function(input) { +module.exports = function (input) { // Value must be JSON string to match node-mysql results // Related to this node-mysql PR: // https://github.com/felixge/node-mysql/pull/1299 @@ -48,8 +48,7 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt, isLarge) // Only used for types which use the value stored at a pointer position // If object is root (offset 0), the value is not offset by pointer - const valueOffset = offset === 0 ? 0 : - readUInt(offset + 1) + parentValueOffset; + const valueOffset = offset === 0 ? 0 : readUInt(offset + 1) + parentValueOffset; let result = null; const jsonType = input.readUInt8(offset); @@ -69,7 +68,9 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt, isLarge) } // All other types are retrieved from pointer case JSONB_TYPE_STRING: { - let strLen, strLenSize = 0, curStrLenByte; + let strLen, + strLenSize = 0, + curStrLenByte; // If the high bit is 1, the string length continues to the next byte while (strLenSize === 0 || (curStrLenByte & 128) === 128) { strLenSize++; @@ -77,13 +78,10 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt, isLarge) if (strLenSize === 1) { strLen = curStrLenByte; } else { - strLen = (strLen ^ Math.pow(128, strLenSize - 1)) - + (curStrLenByte * Math.pow(2, 7 * (strLenSize - 1))); + strLen = (strLen ^ Math.pow(128, strLenSize - 1)) + curStrLenByte * Math.pow(2, 7 * (strLenSize - 1)); } } - result = input.toString('utf8', - valueOffset + strLenSize + 1, - valueOffset + strLenSize + 1 + strLen); + result = input.toString('utf8', valueOffset + strLenSize + 1, valueOffset + strLenSize + 1 + strLen); break; } case JSONB_TYPE_LARGE_OBJECT: @@ -120,22 +118,23 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt, isLarge) const mask = Math.pow(2, 32) - 1; high = common.sliceBits(high ^ mask, 0, 21); low = low ^ mask; - result = - ((high * Math.pow(2, 32)) * - 1) - common.getUInt32Value(low) - 1; + result = high * Math.pow(2, 32) * -1 - common.getUInt32Value(low) - 1; } else { - result = (high * Math.pow(2,32)) + low; + result = high * Math.pow(2, 32) + low; } break; } case JSONB_TYPE_UINT64: { const low = input.readUInt32LE(valueOffset + 1); const high = input.readUInt32LE(valueOffset + 5); - result = (high * Math.pow(2,32)) + low; + result = high * Math.pow(2, 32) + low; break; } case JSONB_TYPE_OPAQUE: { const customType = input.readUInt8(valueOffset + 1); - let dataLen, dataLenSize = 0, curDataLenByte; + let dataLen, + dataLenSize = 0, + curDataLenByte; // If the high bit is 1, the string length continues to the next byte while (dataLenSize === 0 || (curDataLenByte & 128) === 128) { dataLenSize++; @@ -143,8 +142,7 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt, isLarge) if (dataLenSize === 1) { dataLen = curDataLenByte; } else { - dataLen = (dataLen ^ Math.pow(128, dataLenSize - 1)) - + (curDataLenByte * Math.pow(2, 7 * (dataLenSize - 1))); + dataLen = (dataLen ^ Math.pow(128, dataLenSize - 1)) + curDataLenByte * Math.pow(2, 7 * (dataLenSize - 1)); } } @@ -154,18 +152,18 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt, isLarge) let metadata = {}; const parseType = customType; - parser.append(input.slice( - valueOffset + dataLenSize + 2, - valueOffset + dataLenSize + 2 + dataLen)); + parser.append(input.slice(valueOffset + dataLenSize + 2, valueOffset + dataLenSize + 2 + dataLen)); switch (customType) { case common.MysqlTypes.DATE: { const raw = parser._buffer.readInt32LE(4); const yearMonth = common.sliceBits(raw, 14, 31); result = - common.zeroPad(Math.floor(yearMonth / 13), 4) + '-' + // year - common.zeroPad(yearMonth % 13, 2) + '-' + // month - common.zeroPad(common.sliceBits(raw, 9, 14), 2); // day + common.zeroPad(Math.floor(yearMonth / 13), 4) + + '-' + // year + common.zeroPad(yearMonth % 13, 2) + + '-' + // month + common.zeroPad(common.sliceBits(raw, 9, 14), 2); // day break; } case common.MysqlTypes.TIME: { @@ -186,11 +184,15 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt, isLarge) const minute = common.sliceBits(raw, 6, 12); const second = common.sliceBits(raw, 0, 6); - result = (isNegative ? '-' : '') + - common.zeroPad(hour, hour > 99 ? 3 : 2) + ':' + - common.zeroPad(minute, 2) + ':' + - common.zeroPad(second, 2) + - '.' + common.zeroPad(fraction, 6); + result = + (isNegative ? '-' : '') + + common.zeroPad(hour, hour > 99 ? 3 : 2) + + ':' + + common.zeroPad(minute, 2) + + ':' + + common.zeroPad(second, 2) + + '.' + + common.zeroPad(fraction, 6); break; } case common.MysqlTypes.DATETIME: { @@ -201,19 +203,25 @@ function parseBinaryBuffer(input, offset, parentValueOffset, readUInt, isLarge) const yearMonth = common.sliceBits(rawLow, 14, 31); result = - common.zeroPad(Math.floor(yearMonth / 13), 4) + '-' + // year - common.zeroPad(yearMonth % 13, 2) + '-' + // month - common.zeroPad(common.sliceBits(rawLow, 9, 14), 2) + ' ' + // day - common.zeroPad(common.sliceBits(rawHigh, 12, 17), 2) + ':' + // hour - common.zeroPad(common.sliceBits(rawHigh, 6, 12), 2) + ':' + // minutes - common.zeroPad(common.sliceBits(rawHigh, 0, 6), 2) + '.' + // seconds + common.zeroPad(Math.floor(yearMonth / 13), 4) + + '-' + // year + common.zeroPad(yearMonth % 13, 2) + + '-' + // month + common.zeroPad(common.sliceBits(rawLow, 9, 14), 2) + + ' ' + // day + common.zeroPad(common.sliceBits(rawHigh, 12, 17), 2) + + ':' + // hour + common.zeroPad(common.sliceBits(rawHigh, 6, 12), 2) + + ':' + // minutes + common.zeroPad(common.sliceBits(rawHigh, 0, 6), 2) + + '.' + // seconds common.zeroPad(fraction, 6); break; } case common.MysqlTypes.NEWDECIMAL: metadata = { precision: parser.parseUnsignedNumber(1), - decimals: parser.parseUnsignedNumber(1), + decimals: parser.parseUnsignedNumber(1) }; break; case common.MysqlTypes.VAR_STRING: @@ -255,23 +263,23 @@ function readObject(input, valueOffset, isLarge) { // Position where key entries start // Key entry: Key offset (int16/32) + Key length (int16) const memberKeyStart = - valueOffset + 1 + // Beginning of definition - (intSize * 2); // memberCount + binarySize + valueOffset + + 1 + // Beginning of definition + intSize * 2; // memberCount + binarySize // Value entries (or pointers to such) begin after key entries - const memberValueStart = memberKeyStart + (memberCount * (intSize + 2)); + const memberValueStart = memberKeyStart + memberCount * (intSize + 2); for (let pointerPos = 0; pointerPos < memberCount; pointerPos++) { - const keyEntryPos = memberKeyStart + (pointerPos * (intSize + 2)); + const keyEntryPos = memberKeyStart + pointerPos * (intSize + 2); const keyStart = valueOffset + 1 + readUInt(keyEntryPos); const keyEnd = keyStart + input.readUInt16LE(keyEntryPos + intSize); const thisKey = input.toString('utf8', keyStart, keyEnd); - const memberValueOffset = memberValueStart + (pointerPos * (intSize + 1)); + const memberValueOffset = memberValueStart + pointerPos * (intSize + 1); - result[thisKey] = - parseBinaryBuffer(input, memberValueOffset, valueOffset, readUInt, isLarge); + result[thisKey] = parseBinaryBuffer(input, memberValueOffset, valueOffset, readUInt, isLarge); } return result; @@ -292,12 +300,12 @@ function readArray(input, valueOffset, isLarge) { for (let pointerPos = 0; pointerPos < memberCount; pointerPos++) { let memberValueOffset = - valueOffset + 1 + // Beginning of definition - (intSize * 2) + // memberCount + binarySize - (pointerPos * (1 + intSize)); // value type + value offset + valueOffset + + 1 + // Beginning of definition + intSize * 2 + // memberCount + binarySize + pointerPos * (1 + intSize); // value type + value offset - result.push( - parseBinaryBuffer(input, memberValueOffset, valueOffset, readUInt, isLarge)); + result.push(parseBinaryBuffer(input, memberValueOffset, valueOffset, readUInt, isLarge)); } return result; } diff --git a/lib/packet/binlog.js b/lib/packet/binlog.js index 1db4d53..f20fb65 100644 --- a/lib/packet/binlog.js +++ b/lib/packet/binlog.js @@ -2,9 +2,7 @@ const getEventClass = require('../code_map').getEventClass; //TODO Don't depend on zongji instance here module.exports = function initBinlogPacketClass(zongji) { - class BinlogPacket { - *_process(parser) { // uint8_t marker; // always 0 or 0xFF // uint32_t timestamp; @@ -26,7 +24,7 @@ module.exports = function initBinlogPacketClass(zongji) { timestamp: timestamp, nextPosition: nextPosition, size: eventLength - BinlogPacket.Length, - eventType: eventType, + eventType: eventType }; const EventClass = getEventClass(eventType); diff --git a/lib/packet/combinlog.js b/lib/packet/combinlog.js index f6d7361..a704974 100644 --- a/lib/packet/combinlog.js +++ b/lib/packet/combinlog.js @@ -10,7 +10,7 @@ function ComBinlog({ serverId, nonBlock, filename, position }) { this.filename = filename || ''; } -ComBinlog.prototype.write = function(writer) { +ComBinlog.prototype.write = function (writer) { writer.writeUnsignedNumber(1, this.command); writer.writeUnsignedNumber(4, this.position); writer.writeUnsignedNumber(2, this.flags); @@ -18,7 +18,7 @@ ComBinlog.prototype.write = function(writer) { writer.writeNullTerminatedString(this.filename); }; -ComBinlog.prototype.parse = function() { +ComBinlog.prototype.parse = function () { throw new Error('should never be callede here'); }; diff --git a/lib/packet/index.js b/lib/packet/index.js index 3f9f7da..495429e 100644 --- a/lib/packet/index.js +++ b/lib/packet/index.js @@ -2,21 +2,21 @@ function EofPacket(options) { options = options || {}; - this.fieldCount = undefined; + this.fieldCount = undefined; this.warningCount = options.warningCount; this.serverStatus = options.serverStatus; - this.protocol41 = options.protocol41; + this.protocol41 = options.protocol41; } -EofPacket.prototype.parse = function(parser) { - this.fieldCount = parser.parseUnsignedNumber(1); +EofPacket.prototype.parse = function (parser) { + this.fieldCount = parser.parseUnsignedNumber(1); if (this.protocol41) { this.warningCount = parser.parseUnsignedNumber(2); this.serverStatus = parser.parseUnsignedNumber(2); } }; -EofPacket.prototype.write = function(writer) { +EofPacket.prototype.write = function (writer) { writer.writeUnsignedNumber(1, 0xfe); if (this.protocol41) { writer.writeUnsignedNumber(2, this.warningCount); @@ -28,27 +28,27 @@ EofPacket.prototype.write = function(writer) { function ErrorPacket(options) { options = options || {}; - this.fieldCount = options.fieldCount; - this.errno = options.errno; + this.fieldCount = options.fieldCount; + this.errno = options.errno; this.sqlStateMarker = options.sqlStateMarker; - this.sqlState = options.sqlState; - this.message = options.message; + this.sqlState = options.sqlState; + this.message = options.message; } -ErrorPacket.prototype.parse = function(parser) { +ErrorPacket.prototype.parse = function (parser) { this.fieldCount = parser.parseUnsignedNumber(1); - this.errno = parser.parseUnsignedNumber(2); + this.errno = parser.parseUnsignedNumber(2); // sqlStateMarker ('#' = 0x23) indicates error packet format if (parser.peak() === 0x23) { this.sqlStateMarker = parser.parseString(1); - this.sqlState = parser.parseString(5); + this.sqlState = parser.parseString(5); } this.message = parser.parsePacketTerminatedString(); }; -ErrorPacket.prototype.write = function(writer) { +ErrorPacket.prototype.write = function (writer) { writer.writeUnsignedNumber(1, 0xff); writer.writeUnsignedNumber(2, this.errno); diff --git a/lib/reader.js b/lib/reader.js index e9a2403..514363e 100644 --- a/lib/reader.js +++ b/lib/reader.js @@ -10,64 +10,63 @@ function BufferReader(buffer) { this.position = 0; } -BufferReader.prototype.readUInt8 = function() { +BufferReader.prototype.readUInt8 = function () { const pos = this.position; this.position += 1; return this.buffer.readUInt8(pos); }; -BufferReader.prototype.readUInt16 = function() { +BufferReader.prototype.readUInt16 = function () { const pos = this.position; this.position += 2; return this.buffer.readUInt16LE(pos); }; -BufferReader.prototype.readUInt32 = function() { +BufferReader.prototype.readUInt32 = function () { const pos = this.position; this.position += 4; return this.buffer.readUInt32LE(pos); }; -BufferReader.prototype.readUInt24 = function() { +BufferReader.prototype.readUInt24 = function () { const low = this.readUInt16(); const high = this.readUInt8(); return (high << 16) + low; }; -BufferReader.prototype.readUInt64 = function() { +BufferReader.prototype.readUInt64 = function () { const pos = this.position; this.position += 8; // from http://stackoverflow.com/questions/17687307/convert-a-64bit-little-endian-integer-to-number - return this.buffer.readInt32LE(pos) + - 0x100000000 * this.buffer.readUInt32LE(pos + 4); + return this.buffer.readInt32LE(pos) + 0x100000000 * this.buffer.readUInt32LE(pos + 4); }; -BufferReader.prototype.readString = function() { +BufferReader.prototype.readString = function () { const strBuf = this.buffer.slice(this.position); this.position = this.buffer.length; return strBuf.toString('ascii'); }; -BufferReader.prototype.readStringInBytes = function(length) { +BufferReader.prototype.readStringInBytes = function (length) { const strBuf = this.buffer.slice(this.position, this.position + length); this.position += length; return strBuf.toString('ascii'); }; -BufferReader.prototype.readHexInBytes = function(length) { +BufferReader.prototype.readHexInBytes = function (length) { const buf = this.buffer.slice(this.position, this.position + length); this.position += length; return buf.toString('hex'); }; -BufferReader.prototype.readBytesArray = function(length) { +BufferReader.prototype.readBytesArray = function (length) { const result = []; const hexString = this.readHexInBytes(length); for (let i = 0; i < hexString.length; i = i + 2) { @@ -82,7 +81,7 @@ BufferReader.prototype.readBytesArray = function(length) { // integer values <= 250, or to encode the number of following bytes // used to store the actual value, which can be 2, 3, or 8. It also // includes support for SQL NULL as a special case. -BufferReader.prototype.readVariant = function() { +BufferReader.prototype.readVariant = function () { let result = null; const firstByte = this.readUInt8(); @@ -103,7 +102,7 @@ BufferReader.prototype.readVariant = function() { return result; }; -const padWith = function(val, length) { +const padWith = function (val, length) { const bits = val.split(''); if (bits.length < length) { const left = length - bits.length; @@ -118,7 +117,7 @@ const padWith = function(val, length) { // Read an arbitrary-length bitmap, provided its length. // Returns an array of true/false values. -BufferReader.prototype.readBitArray = function(length) { +BufferReader.prototype.readBitArray = function (length) { const size = Math.floor((length + 7) / 8); const bytes = []; @@ -127,9 +126,11 @@ BufferReader.prototype.readBitArray = function(length) { } const bitmap = []; - const bitmapStr = bytes.map(function(aByte) { - return padWith(aByte.toString(2), 8); - }).join(''); + const bitmapStr = bytes + .map(function (aByte) { + return padWith(aByte.toString(2), 8); + }) + .join(''); for (let k = bitmapStr.length - 1; k >= 0; k--) { bitmap.push(bitmapStr[k] === '1'); diff --git a/lib/rows_event.js b/lib/rows_event.js index 3ad35c3..c93100f 100644 --- a/lib/rows_event.js +++ b/lib/rows_event.js @@ -5,7 +5,7 @@ const Common = require('./common'); const Version2Events = [ 0x1e, // WRITE_ROWS_EVENT_V2, 0x1f, // UPDATE_ROWS_EVENT_V2, - 0x20, // DELETE_ROWS_EVENT_V2 + 0x20 // DELETE_ROWS_EVENT_V2 ]; const CHECKSUM_SIZE = 4; @@ -13,22 +13,13 @@ const CHECKSUM_SIZE = 4; // A quick way to know how many bits set in a given byte // e.g. Given 3 => 0000 0011, it has 2 bits set const BIT_COUNT_MAP_IN_ONE_BYTE = [ - 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, + 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, + 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, + 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, + 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, + 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, + 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 ]; /** @@ -91,29 +82,29 @@ function RowsEvent(parser, options, zongji) { util.inherits(RowsEvent, BinlogEvent); -RowsEvent.prototype.setTableMap = function(tableMap) { +RowsEvent.prototype.setTableMap = function (tableMap) { this.tableMap = tableMap; }; -RowsEvent.prototype.dump = function() { +RowsEvent.prototype.dump = function () { BinlogEvent.prototype.dump.apply(this); console.log('Affected columns:', this.numberOfColumns); console.log('Changed rows:', this.rows.length); console.log('Values:'); - this.rows.forEach(function(row) { + this.rows.forEach(function (row) { console.log('--'); - Object.keys(row).forEach(function(name) { + Object.keys(row).forEach(function (name) { console.log('Column: %s, Value: %s', name, row[name]); }); }); }; -RowsEvent.prototype._fetchOneRow = function(parser) { +RowsEvent.prototype._fetchOneRow = function (parser) { const tablemap = this.tableMap[this.tableId]; return readRow(parser, tablemap, this.columns_present_bitmap, this._zongji); }; -const countBits = function(buff) { +const countBits = function (buff) { let bits = 0; for (let i = 0; i < buff.length; i++) { bits += BIT_COUNT_MAP_IN_ONE_BYTE[buff[i]]; @@ -121,12 +112,12 @@ const countBits = function(buff) { return bits; }; -const getBit = function(buff, position) { +const getBit = function (buff, position) { let byte = buff[Math.floor(position / 8)]; - return byte & (1 << (position % 8)); + return byte & (1 << position % 8); }; -const readRow = function(parser, tablemap, bitmap, zongji) { +const readRow = function (parser, tablemap, bitmap, zongji) { const nullBitmapSize = Math.floor((countBits(bitmap) + 7) / 8); const nullBitmap = parser.parseBuffer(nullBitmapSize); @@ -143,9 +134,7 @@ const readRow = function(parser, tablemap, bitmap, zongji) { row[column.name] = null; } else { let columnSchema = tablemap.columnSchemas[i]; - row[column.name] = Common.readMysqlValue( - parser, column, columnSchema, tablemap, zongji - ); + row[column.name] = Common.readMysqlValue(parser, column, columnSchema, tablemap, zongji); } nullBitIndex += 1; @@ -154,42 +143,45 @@ const readRow = function(parser, tablemap, bitmap, zongji) { }; // Subclasses -function WriteRows(parser, options) { // eslint-disable-line +function WriteRows(parser, options) { + // eslint-disable-line RowsEvent.apply(this, arguments); } util.inherits(WriteRows, RowsEvent); // eslint -function DeleteRows(parser, options) { // eslint-disable-line +function DeleteRows(parser, options) { + // eslint-disable-line RowsEvent.apply(this, arguments); } util.inherits(DeleteRows, RowsEvent); -function UpdateRows(parser, options) { // eslint-disable-line +function UpdateRows(parser, options) { + // eslint-disable-line this._hasTwoRows = true; RowsEvent.apply(this, arguments); } util.inherits(UpdateRows, RowsEvent); -UpdateRows.prototype._fetchOneRow = function(parser) { +UpdateRows.prototype._fetchOneRow = function (parser) { const tablemap = this.tableMap[this.tableId]; return { before: readRow(parser, tablemap, this.columns_present_bitmap, this._zongji), - after: readRow(parser, tablemap, this.columns_present_bitmap2, this._zongji), + after: readRow(parser, tablemap, this.columns_present_bitmap2, this._zongji) }; }; -UpdateRows.prototype.dump = function() { +UpdateRows.prototype.dump = function () { BinlogEvent.prototype.dump.apply(this); console.log('Affected columns:', this.numberOfColumns); console.log('Changed rows:', this.rows.length); console.log('Values:'); - this.rows.forEach(function(row) { + this.rows.forEach(function (row) { console.log('--'); - Object.keys(row.before).forEach(function(name) { + Object.keys(row.before).forEach(function (name) { console.log('Column: %s, Value: %s => %s', name, row.before[name], row.after[name]); }); }); diff --git a/lib/sequence/binlog.js b/lib/sequence/binlog.js index b144e36..35ac018 100644 --- a/lib/sequence/binlog.js +++ b/lib/sequence/binlog.js @@ -2,7 +2,7 @@ const Util = require('util'); const { EofPacket, ErrorPacket, ComBinlog, initBinlogPacketClass } = require('../packet'); const Sequence = require('@vlasky/mysql/lib/protocol/sequences').Sequence; -module.exports = function(zongji) { +module.exports = function (zongji) { const BinlogPacket = initBinlogPacketClass(zongji); function Binlog(callback) { @@ -11,32 +11,29 @@ module.exports = function(zongji) { Util.inherits(Binlog, Sequence); - Binlog.prototype.start = function() { + Binlog.prototype.start = function () { // options include: position / nonBlock / serverId / filename - let options = zongji.get([ - 'serverId', 'position', 'filename', 'nonBlock', - ]); + let options = zongji.get(['serverId', 'position', 'filename', 'nonBlock']); this.emit('packet', new ComBinlog(options)); }; - Binlog.prototype.determinePacket = function(firstByte) { + Binlog.prototype.determinePacket = function (firstByte) { switch (firstByte) { - case 0xfe: - return EofPacket; - case 0xff: - return ErrorPacket; - default: - return BinlogPacket; + case 0xfe: + return EofPacket; + case 0xff: + return ErrorPacket; + default: + return BinlogPacket; } }; - Binlog.prototype['OkPacket'] = function() { + Binlog.prototype['OkPacket'] = function () { console.log('Received one OkPacket ...'); }; - Binlog.prototype['BinlogPacket'] = function(packet) { + Binlog.prototype['BinlogPacket'] = function (packet) { if (this._callback) { - // Check event filtering if (zongji._skipEvent(packet.eventName.toLowerCase())) { return this._callback.call(this); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b8fb749..0000000 --- a/package-lock.json +++ /dev/null @@ -1,4086 +0,0 @@ -{ - "name": "@vlasky/zongji", - "version": "0.5.9", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", - "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", - "dev": true, - "requires": { - "@babel/types": "^7.9.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz", - "integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A==", - "dev": true - }, - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, - "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@vlasky/mysql": { - "version": "2.18.6", - "resolved": "https://registry.npmjs.org/@vlasky/mysql/-/mysql-2.18.6.tgz", - "integrity": "sha512-c+qz/zzqecteQLchoje0E0rjLla935d6hHPpMKmfyQJnHlycLpR49ekS6s/zUAt8w0Um5hFglKXm4+PeJTVhaQ==", - "requires": { - "bignumber.js": "9.1.1", - "readable-stream": "2.3.7", - "safe-buffer": "5.2.1", - "sqlstring": "2.3.3" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true - }, - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async-hook-domain": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-1.1.3.tgz", - "integrity": "sha512-ZovMxSbADV3+biB7oR1GL5lGyptI24alp0LWHlmz1OFc5oL47pz3EiIF6nXOkDW7yLqih4NtsiYduzdDW0i+Wg==", - "dev": true, - "requires": { - "source-map-support": "^0.5.11" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" - }, - "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "bind-obj-methods": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", - "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - }, - "dependencies": { - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "coveralls": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.11.tgz", - "integrity": "sha512-LZPWPR2NyGKyaABnc49dR0fpeP6UqhvGq4B5nUrTQ1UBy55z96+ga7r+/ChMdMJUwBgyJDXBi88UBgz2rs9IiQ==", - "dev": true, - "requires": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.5", - "request": "^2.88.0" - } - }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-frag": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/diff-frag/-/diff-frag-1.0.1.tgz", - "integrity": "sha512-6/v2PC/6UTGcWPPetb9acL8foberUg/CtPdALeJUdD1B/weHNvzftoo00gYznqHGRhHEbykUGzqfG9RWOSr5yw==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", - "integrity": "sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4=", - "dev": true - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "flow-parser": { - "version": "0.121.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", - "integrity": "sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==", - "dev": true - }, - "flow-remove-types": { - "version": "2.121.0", - "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.121.0.tgz", - "integrity": "sha512-DbHgYJLD88fMK6CF3Z6wvoZuMb2sqKYP9WLzrZ0SPWbQf61+XyNq6vC8HAJeWJf2DD8z7XhrFHUCH2cJvpAAIQ==", - "dev": true, - "requires": { - "flow-parser": "^0.121.0", - "pirates": "^3.0.2", - "vlq": "^0.2.1" - } - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "function-loop": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", - "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "html-escaper": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.1.tgz", - "integrity": "sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "istanbul-lib-processinfo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-1.0.0.tgz", - "integrity": "sha512-FY0cPmWa4WoQNlvB8VOcafiRoB5nB+l2Pz2xGuXHRSy1KM8QFOYfz/rN+bGMCAeejrY3mrpF5oJHcN0s/garCg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^6.0.5", - "istanbul-lib-coverage": "^2.0.3", - "rimraf": "^2.6.3", - "uuid": "^3.3.2" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jackspeak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.0.tgz", - "integrity": "sha512-VDcSunT+wcccoG46FtzuBAyQKlzhHjli4q31e1fIHGOsRspqNUFjVzGb+7eIFDlTvqLygxapDHPHS0ouT2o/tw==", - "dev": true, - "requires": { - "cliui": "^4.1.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "lcov-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "requires": { - "mime-db": "1.43.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", - "dev": true - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "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" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "own-or": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", - "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", - "dev": true - }, - "own-or-env": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", - "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", - "dev": true, - "requires": { - "own-or": "^1.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pirates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-3.0.2.tgz", - "integrity": "sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spawn-wrap": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", - "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "tap": { - "version": "14.10.7", - "resolved": "https://registry.npmjs.org/tap/-/tap-14.10.7.tgz", - "integrity": "sha512-DVx00lfiMxFhofwFDP77pitRCruVQJn8Dcj/6auIU3dErJQWsKT94oG6Yj0MQRuYANhSec8ruIPyUjH/RI9Hrw==", - "dev": true, - "requires": { - "@types/react": "^16.9.16", - "async-hook-domain": "^1.1.3", - "bind-obj-methods": "^2.0.0", - "browser-process-hrtime": "^1.0.0", - "chokidar": "^3.3.0", - "color-support": "^1.1.0", - "coveralls": "^3.0.8", - "diff": "^4.0.1", - "esm": "^3.2.25", - "findit": "^2.0.0", - "flow-remove-types": "^2.112.0", - "foreground-child": "^1.3.3", - "fs-exists-cached": "^1.0.0", - "function-loop": "^1.0.2", - "glob": "^7.1.6", - "import-jsx": "^3.1.0", - "ink": "^2.6.0", - "isexe": "^2.0.0", - "istanbul-lib-processinfo": "^1.0.0", - "jackspeak": "^1.4.0", - "minipass": "^3.1.1", - "mkdirp": "^0.5.1", - "nyc": "^14.1.1", - "opener": "^1.5.1", - "own-or": "^1.0.0", - "own-or-env": "^1.0.1", - "react": "^16.12.0", - "rimraf": "^2.7.1", - "signal-exit": "^3.0.0", - "source-map-support": "^0.5.16", - "stack-utils": "^1.0.2", - "tap-mocha-reporter": "^5.0.0", - "tap-parser": "^10.0.1", - "tap-yaml": "^1.0.0", - "tcompare": "^3.0.0", - "treport": "^1.0.2", - "trivial-deferred": "^1.0.1", - "ts-node": "^8.5.2", - "typescript": "^3.7.2", - "which": "^2.0.2", - "write-file-atomic": "^3.0.1", - "yaml": "^1.7.2", - "yapool": "^1.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.7", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.7", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "bundled": true, - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.8", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.8.7", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "bundled": true, - "dev": true - } - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "bundled": true, - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "bundled": true, - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.8", - "bundled": true, - "dev": true - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.8.8", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - } - }, - "@babel/runtime": { - "version": "7.8.7", - "bundled": true, - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.8.6", - "bundled": true, - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, - "@babel/traverse": { - "version": "7.8.6", - "bundled": true, - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.6", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.7", - "bundled": true, - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "@types/prop-types": { - "version": "15.7.3", - "bundled": true, - "dev": true - }, - "@types/react": { - "version": "16.9.23", - "bundled": true, - "dev": true, - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/yoga-layout": { - "version": "1.9.1", - "bundled": true, - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "bundled": true, - "dev": true, - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "auto-bind": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "cardinal": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "chalk": { - "version": "2.4.2", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "ci-info": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-truncate": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "color-convert": { - "version": "1.9.3", - "bundled": true, - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - } - } - }, - "csstype": { - "version": "2.6.9", - "bundled": true, - "dev": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true, - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "esprima": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "esutils": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "events-to-array": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "bundled": true, - "dev": true - }, - "globals": { - "version": "11.12.0", - "bundled": true, - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "import-jsx": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "@babel/core": "^7.5.5", - "@babel/plugin-proposal-object-rest-spread": "^7.5.5", - "@babel/plugin-transform-destructuring": "^7.5.0", - "@babel/plugin-transform-react-jsx": "^7.3.0", - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "ink": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "arrify": "^2.0.1", - "auto-bind": "^4.0.0", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "is-ci": "^2.0.0", - "lodash.throttle": "^4.1.1", - "log-update": "^3.0.0", - "prop-types": "^15.6.2", - "react-reconciler": "^0.24.0", - "scheduler": "^0.18.0", - "signal-exit": "^3.0.2", - "slice-ansi": "^3.0.0", - "string-length": "^3.1.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0", - "yoga-layout-prebuilt": "^1.9.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "is-ci": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "bundled": true, - "dev": true - }, - "json5": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "lodash": { - "version": "4.17.15", - "bundled": true, - "dev": true - }, - "lodash.throttle": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "log-update": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "cli-cursor": "^2.1.0", - "wrap-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "bundled": true, - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "onetime": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } - } - }, - "loose-envify": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "bundled": true, - "dev": true - } - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "onetime": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "path-parse": { - "version": "1.0.6", - "bundled": true, - "dev": true - }, - "prop-types": { - "version": "15.7.2", - "bundled": true, - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "punycode": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "react-is": { - "version": "16.13.1", - "bundled": true, - "dev": true - }, - "react-reconciler": { - "version": "0.24.0", - "bundled": true, - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.18.0" - } - }, - "redeyed": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "regenerator-runtime": { - "version": "0.13.5", - "bundled": true, - "dev": true - }, - "resolve": { - "version": "1.15.1", - "bundled": true, - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "scheduler": { - "version": "0.18.0", - "bundled": true, - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - } - } - }, - "string-length": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "string-width": { - "version": "4.2.0", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tap-parser": { - "version": "10.0.1", - "bundled": true, - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "minipass": "^3.0.0", - "tap-yaml": "^1.0.0" - } - }, - "tap-yaml": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "yaml": "^1.5.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "treport": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "cardinal": "^2.1.1", - "chalk": "^3.0.0", - "import-jsx": "^3.1.0", - "ink": "^2.6.0", - "ms": "^2.1.2", - "string-length": "^3.1.0", - "tap-parser": "^10.0.1", - "unicode-length": "^2.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "type-fest": { - "version": "0.11.0", - "bundled": true, - "dev": true - }, - "unicode-length": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "punycode": "^2.0.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "widest-line": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - } - } - }, - "yaml": { - "version": "1.8.2", - "bundled": true, - "dev": true, - "requires": { - "@babel/runtime": "^7.8.7" - } - }, - "yoga-layout-prebuilt": { - "version": "1.9.5", - "bundled": true, - "dev": true, - "requires": { - "@types/yoga-layout": "1.9.1" - } - } - } - }, - "tap-mocha-reporter": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.1.tgz", - "integrity": "sha512-1knFWOwd4khx/7uSEnUeaP9IPW3w+sqTgJMhrwah6t46nZ8P25atOKAjSvVDsT67lOPu0nfdOqUwoyKn+3E5pA==", - "dev": true, - "requires": { - "color-support": "^1.1.0", - "debug": "^4.1.1", - "diff": "^4.0.1", - "escape-string-regexp": "^2.0.0", - "glob": "^7.0.5", - "tap-parser": "^10.0.0", - "tap-yaml": "^1.0.0", - "unicode-length": "^2.0.2" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "tap-parser": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.0.1.tgz", - "integrity": "sha512-qdT15H0DoJIi7zOqVXDn9X0gSM68JjNy1w3VemwTJlDnETjbi6SutnqmBfjDJAwkFS79NJ97gZKqie00ZCGmzg==", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "minipass": "^3.0.0", - "tap-yaml": "^1.0.0" - } - }, - "tap-yaml": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.0.tgz", - "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==", - "dev": true, - "requires": { - "yaml": "^1.5.0" - } - }, - "tcompare": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-3.0.4.tgz", - "integrity": "sha512-Q3TitMVK59NyKgQyFh+857wTAUE329IzLDehuPgU4nF5e8g+EUQ+yUbjUy1/6ugiNnXztphT+NnqlCXolv9P3A==", - "dev": true, - "requires": { - "diff-frag": "^1.0.1" - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "trivial-deferred": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", - "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", - "dev": true - }, - "ts-node": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.8.1.tgz", - "integrity": "sha512-10DE9ONho06QORKAaCBpPiFCdW+tZJuY/84tyypGtl6r+/C7Asq0dhqbRZURuUlLQtZxxDvT8eoj8cGW0ha6Bg==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", - "dev": true - }, - "unicode-length": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.0.2.tgz", - "integrity": "sha512-Ph/j1VbS3/r77nhoY2WU0GWGjVYOHL3xpKp0y/Eq2e5r0mT/6b649vm7KFO6RdAdrZkYLdxphYVgvODxPB+Ebg==", - "dev": true, - "requires": { - "punycode": "^2.0.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yaml": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", - "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.7" - } - }, - "yapool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", - "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index b6d2c61..6e07cc0 100644 --- a/package.json +++ b/package.json @@ -1,40 +1,46 @@ { - "name": "@vlasky/zongji", - "version": "0.5.9", - "description": "A MySQL 8.0-compatible fork of ZongJi - a MySQL binlog listener for Node.js.", + "name": "@powersync/mysql-zongji", + "version": "0.0.1", + "description": "A MySQL 8.0 >= compatible fork of ZongJi - a MySQL binlog listener for Node.js.", "main": "index.js", "directories": { "test": "test" }, + "publishConfig": { + "access": "public" + }, "scripts": { - "test": "tap --bail --no-coverage --jobs=1 test/*.js", - "lint": "eslint ." + "release": "pnpm changeset publish", + "test": "tap run --disable-coverage --allow-incomplete-coverage -- --sequential test/suites.js", + "format": "prettier --write ." }, "repository": { "type": "git", - "url": "https://github.com/vlasky/zongji" + "url": "powersync-ja/powersync-mysql-zongji" }, "keywords": [ "mysql", "binlog" ], - "author": "Vlad Lasky (https://github.com/vlasky)", + "author": "Vlad Lasky (https://github.com/vlasky)", "contributors": [ - "Nevill (https://github.com/nevill)", - "numtel (https://github.com/numtel)", - "rfanth (https://github.com/rfanth)", - "Alexander Radyushin (https://github.com/fjedi)", - "Yousef El-Dardiry (https://github.com/YousefED)", - "Roopendra Talekar (https://github.com/roopen219)", - "Juan Ferrer Toribio (https://github.com/juan-ferrer-toribio)" + "Nevill (https://github.com/nevill)", + "numtel (https://github.com/numtel)", + "rfanth (https://github.com/rfanth)", + "Alexander Radyushin (https://github.com/fjedi)", + "Yousef El-Dardiry (https://github.com/YousefED)", + "Roopendra Talekar (https://github.com/roopen219)", + "Juan Ferrer Toribio (https://github.com/juan-ferrer-toribio)", + "JourneyApps" ], "license": "MIT", "engines": { - "node": ">= 8.0" + "node": ">=20.0.0" }, "devDependencies": { - "eslint": "6.8.0", - "tap": "14.10.7" + "@changesets/cli": "^2.27.3", + "prettier": "^2.8.8", + "tap": "^21.0.1" }, "dependencies": { "big-integer": "1.6.51", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..6d0e5b2 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3446 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@vlasky/mysql': + specifier: ^2.18.6 + version: 2.18.6 + big-integer: + specifier: 1.6.51 + version: 1.6.51 + iconv-lite: + specifier: 0.6.3 + version: 0.6.3 + devDependencies: + '@changesets/cli': + specifier: ^2.27.3 + version: 2.27.8 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + tap: + specifier: ^21.0.1 + version: 21.0.1(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) + +packages: + + '@alcalzone/ansi-tokenize@0.1.3': + resolution: {integrity: sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==} + engines: {node: '>=14.13.1'} + + '@babel/runtime@7.9.2': + resolution: {integrity: sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==} + + '@base2/pretty-print-object@1.0.1': + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@changesets/apply-release-plan@7.0.5': + resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + + '@changesets/assemble-release-plan@6.0.4': + resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.8': + resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} + hasBin: true + + '@changesets/config@3.0.3': + resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.2': + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + + '@changesets/get-release-plan@4.0.4': + resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.1': + resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.1': + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + + '@changesets/read@0.6.1': + resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + + '@changesets/should-skip-package@0.1.1': + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.2': + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7': + resolution: {integrity: sha512-9f0bhUr9TnwwpgUhEpr3FjxSaH/OHaARkE2F9fM0lS4nIs2GNerrvGwQz493dk0JKlTaGYVrKbq36vA/whZ34g==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=4.2' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/agent@2.2.2': + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/fs@3.1.1': + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/installed-package-contents@2.1.0': + resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + '@npmcli/node-gyp@3.0.0': + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.2.0': + resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/redact@2.0.1': + resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/run-script@8.1.0': + resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@sigstore/bundle@2.3.2': + resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/core@1.1.0': + resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/protobuf-specs@0.3.2': + resolution: {integrity: sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/sign@2.3.2': + resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/tuf@2.3.4': + resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/verify@1.2.1': + resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tapjs/after-each@4.0.0': + resolution: {integrity: sha512-RrkYMB3SpXKFJAijbgNkOexiClX5aygkCIHKHPIfnfqsPozkwjYbtVQs6d1/tG8ytiJtH5rvybuNJMRRNDcfBQ==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/after@3.0.0': + resolution: {integrity: sha512-BCGq+YocD0xxeGC4mMym2tg6qtgFJJdCrji8N1HbF55d55nxQrA8R/w6+D9b4N7t/4dfpbI+LW5FgdBATohFPw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/asserts@4.0.0': + resolution: {integrity: sha512-V1YmOLMhyITi75e0u8vS+x1S0sDwISWk643C4a9XiY2RDin1nEueE8Nzwp2ZBP+N4HtgzKVfzJ1AYvpwaTKwUA==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/before-each@4.0.0': + resolution: {integrity: sha512-zJwDLLH+3+qmpE8Pr1fAEeqZNvbok7yYKKKE/7IDMi3zdvM0Rjk7Y4JXGbVI8IreuRK0rXaSL1ZZqbFMsZGHrg==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/before@4.0.0': + resolution: {integrity: sha512-d1k6lTSzqTcq4pjGsCPUxNP5NFWZBxwHLmgVxy2RHfZwKM20eXXAOPgAw3LgPVgkoehwi+nwWUGTJDcL3AS8YQ==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/chdir@3.0.0': + resolution: {integrity: sha512-yljg4CX2/UinFytD50LaRhBVTDaW3vBcUwzYnXzJcuFLoPEpq0svlyIwzcCXfLLGP8/AgkS3MRt58AisBtz4zw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/config@5.0.0': + resolution: {integrity: sha512-AAHbK30FwnGC3FcFACnXEGZ+uFtkpxsF2bwvgAzHND2tIE9ld2LwGMiGq3rM9EwcZ1AAnU8ibbUC0WbnS5FcCQ==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + '@tapjs/test': 4.0.0 + + '@tapjs/core@4.0.0': + resolution: {integrity: sha512-COWMNbGBjf0qbsbKw+2911rrt+oXXOkIXpoMpIsz0/UN2rxqAAvDyrriObVfc4v+O2auabnWfdrxwNm3Vy01yw==} + engines: {node: 20 || >=22} + + '@tapjs/error-serdes@4.0.0': + resolution: {integrity: sha512-jO0CvhL7lyGcDzyPeumyXirBv/vxRuhg8SdyLwjNqO7aelckxZzY/dCchtov7PfKK7wc/iB55W2++PE9waFaWw==} + engines: {node: 20 || >=22} + + '@tapjs/filter@4.0.0': + resolution: {integrity: sha512-VCqwRB+GJKDavOtoCU6K3skR6b/Qv7vo5YwuwgTUzRDmeNJQwI4S/s0l4cRbaMVJxuXeR3o5JwBsH0Ppjwzgkw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/fixture@4.0.0': + resolution: {integrity: sha512-h8qZwzQqNd0aLU+oU+0uhBSSlU4+5a8kkFfPrwlNQr9Vde2CyW5vMMVWvX2do+5wFyiFwKHAjbtBS7BSkfH7Kw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/intercept@4.0.0': + resolution: {integrity: sha512-MSPvOcwVKZjtb2KVY6JB/dBD54mGkzaJHCdzkIAJdcUAAbZQz5pMppQkEwPw/Zs+JFPJjGzZyITrDfh9if7maw==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/mock@4.0.0': + resolution: {integrity: sha512-6GyQm61wSCmfxKb7GRY24cdnO92mV7mZ0hmdbOko881FIEmjeAsLQaNKUaatnGWpzBUoqw+JCzbASee4/AfaMQ==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/node-serialize@4.0.0': + resolution: {integrity: sha512-cFHcyEZHd4SQPSoZ4tGHfo/p1+4r24G0K0jiAb28WotdE2kbjkf7TVEiKOA5IEOmjQtdJ4+gVcuErZUchjpQZg==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/processinfo@3.1.8': + resolution: {integrity: sha512-FIriEB+qqArPhmVYc1PZwRHD99myRdl7C9Oe/uts04Q2LOxQ5MEmqP9XOP8vVYzpDOYwmL8OmL6eOYt9eZlQKQ==} + engines: {node: '>=16.17'} + + '@tapjs/reporter@4.0.1': + resolution: {integrity: sha512-bS7pOGV99GAhYY/LxNxL4Qq0Ldi4k8DZDC25gonVQrNUW2zYpSBerhrnsz1KDXdaD2OKDtSR8oW2FxUyL6n83A==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/run@4.0.1': + resolution: {integrity: sha512-jll1tiMhxFajfHIGBF/eK+Ob0uEqXBnQq/ONNc9heqcCtcXhC4iYGzhoK+sw03MxwrbRtNomQ7dRqiT0IOjS6w==} + engines: {node: 20 || >=22} + hasBin: true + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/snapshot@4.0.0': + resolution: {integrity: sha512-1d2IOOpbra6VMDypft8NGylkIypgk2VgMRrEeSsipOyeku81STlcdzm8mS0COCqVtX6+si+tkERuqFrCVy/xSg==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/spawn@4.0.0': + resolution: {integrity: sha512-K+kn4wCIMiOfHtjt5lxlxmJMvL4C9txAxapTRyLEm9ul9ZKgzAOQmMD29YEtkKY53v1eAfpJ3agCXnH59uOJ+A==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/stack@4.0.0': + resolution: {integrity: sha512-uj6BvHXvLf1qILvcpYit9D6JX7pg4eSbaxm1MhWpi8wdhSQyUAOe4gxCMTfJpW0ekB48N4QN3S3vaq7rWtFctw==} + engines: {node: 20 || >=22} + + '@tapjs/stdin@4.0.0': + resolution: {integrity: sha512-6QcaKEKH+RB5YPVHytclqzrKoh1d0S8i8lEgGwGAhoaShyawB5CoADnKpCXWjHKsRESUvG7CqiPDGsK39BJEaA==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/test@4.0.0': + resolution: {integrity: sha512-lOU1N0bFCCjJg2UEb8TlLj6+u754Uxi2CSuv3TSkRU+oHRBTEPZ4nJ6MpUqvgyvKm9ilVZ5FLS9/GwXB/XLH3A==} + engines: {node: 20 || >=22} + hasBin: true + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/typescript@3.0.0': + resolution: {integrity: sha512-gKDv+07vdNuplN32sQvkzuEnai9JqJlUX5BuqTrSeWMsoKCoGPdyt8YNwaoebVeyBpt7IgjOBln8YLhfI3AcpA==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tapjs/worker@4.0.0': + resolution: {integrity: sha512-BI5Ttet5HEABPAll8Ou8oFQGIiglen87PYlwTc9yLEB+g4mj8FCZYTGJNIW981CT7lOZzMJICz3C3VTdC9vzuA==} + engines: {node: 20 || >=22} + peerDependencies: + '@tapjs/core': 4.0.0 + + '@tsconfig/node14@14.1.2': + resolution: {integrity: sha512-1vncsbfCZ3TBLPxesRYz02Rn7SNJfbLoDVkcZ7F/ixOV6nwxwgdhD1mdPcc5YQ413qBJ8CvMxXMFfJ7oawjo7Q==} + + '@tsconfig/node16@16.1.3': + resolution: {integrity: sha512-9nTOUBn+EMKO6rtSZJk+DcqsfgtlERGT9XPJ5PRj/HNENPCBY1yu/JEj5wT6GLtbCLBO2k46SeXDaY0pjMqypw==} + + '@tsconfig/node18@18.2.4': + resolution: {integrity: sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==} + + '@tsconfig/node20@20.1.4': + resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==} + + '@tufjs/canonical-json@2.0.0': + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tufjs/models@2.0.1': + resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@vlasky/mysql@2.18.6': + resolution: {integrity: sha512-c+qz/zzqecteQLchoje0E0rjLla935d6hHPpMKmfyQJnHlycLpR49ekS6s/zUAt8w0Um5hFglKXm4+PeJTVhaQ==} + engines: {node: '>= 0.6'} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + async-hook-domain@4.0.1: + resolution: {integrity: sha512-bSktexGodAjfHWIrSrrqxqWzf1hWBZBpmPNZv+TYUMyWa2eoefFc6q6H1+KtdHYSz35lrhWdmXt/XK9wNEZvww==} + engines: {node: '>=16'} + + auto-bind@5.0.1: + resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + balanced-match@1.0.0: + resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + + bignumber.js@9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + + binary-extensions@2.0.0: + resolution: {integrity: sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==} + engines: {node: '>=8'} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + c8@10.1.2: + resolution: {integrity: sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + monocart-coverage-reports: ^2 + peerDependenciesMeta: + monocart-coverage-reports: + optional: true + + cacache@18.0.4: + resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + events-to-array@2.0.3: + resolution: {integrity: sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==} + engines: {node: '>=12'} + + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-loop@4.0.0: + resolution: {integrity: sha512-f34iQBedYF3XcI93uewZZOnyscDragxgTK/eTvVB74k3fCD0ZorOi5BV9GS4M8rz/JoNi0Kl3qX5Y9MH3S/CLQ==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graceful-fs@4.2.3: + resolution: {integrity: sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + html-escaper@2.0.1: + resolution: {integrity: sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore-walk@6.0.5: + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ink@5.0.1: + resolution: {integrity: sha512-ae4AW/t8jlkj/6Ou21H2av0wxTk8vrGzXv+v2v7j4in+bl1M5XRMVbfNghzhBokV++FjF8RBDJvYo+ttR9YVRg==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': '>=18.0.0' + react: '>=18.0.0' + react-devtools-core: ^4.19.1 + peerDependenciesMeta: + '@types/react': + optional: true + react-devtools-core: + optional: true + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + is-actual-promise@1.0.2: + resolution: {integrity: sha512-xsFiO1of0CLsQnPZ1iXHNTyR9YszOeWKYv+q6n8oSFW3ipooFJ1j1lbRMgiMCr+pp2gLruESI4zb5Ak6eK5OnQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-glob@4.0.1: + resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} + engines: {node: '>=0.10.0'} + + is-in-ci@0.1.0: + resolution: {integrity: sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==} + engines: {node: '>=18'} + hasBin: true + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.0.1: + resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + engines: {node: 20 || >=22} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.0.1: + resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} + engines: {node: 20 || >=22} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-fetch-happen@13.0.1: + resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} + engines: {node: ^16.14.0 || >=18.0.0} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@3.0.5: + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.1.1: + resolution: {integrity: sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + node-gyp@10.2.0: + resolution: {integrity: sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-bundled@3.0.1: + resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-packlist@8.0.2: + resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-pick-manifest@9.1.0: + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-registry-fetch@17.1.0: + resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} + engines: {node: ^16.14.0 || >=18.0.0} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.2.2: + resolution: {integrity: sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + package-manager-detector@0.2.0: + resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + + pacote@18.0.6: + resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + patch-console@2.0.0: + resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + polite-json@5.0.0: + resolution: {integrity: sha512-OLS/0XeUAcE8a2fdwemNja+udKgXNnY6yKVIXqAD2zVRx1KvY6Ato/rZ2vdzbxqYwPW0u6SCNC/bAMPNzpzxbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prismjs-terminal@1.2.3: + resolution: {integrity: sha512-xc0zuJ5FMqvW+DpiRkvxURlz98DdfDsZcFHdO699+oL+ykbFfgI7O4VDEgUyc07BSL2NHl3zdb8m/tZ/aaqUrw==} + engines: {node: '>=16'} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-element-to-jsx-string@15.0.0: + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + + react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + + react-reconciler@0.29.2: + resolution: {integrity: sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^18.3.1 + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + regenerator-runtime@0.13.5: + resolution: {integrity: sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-import@2.0.0: + resolution: {integrity: sha512-jpKjLibLuc8D1XEV2+7zb0aqN7I8d12u89g/v6IsgCzdVlccMQJq4TKkPw5fbhHdxhm7nbVtN+KvOTnjFf+nEA==} + engines: {node: 20 || >=22} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.2: + resolution: {integrity: sha512-meQNNykwecVxdu1RlYMKpQx4+wefIYpmxi6gexo/KAbwquJrBUrBmKYJrE8KFkVQAAVWEnwNdu21PgrD77J3xA==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sigstore@2.3.1: + resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.4: + resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + engines: {node: '>= 14'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + + spdx-correct@3.1.0: + resolution: {integrity: sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==} + + spdx-exceptions@2.2.0: + resolution: {integrity: sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==} + + spdx-expression-parse@3.0.0: + resolution: {integrity: sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==} + + spdx-license-ids@3.0.5: + resolution: {integrity: sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + ssri@10.0.6: + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + string-length@6.0.0: + resolution: {integrity: sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==} + engines: {node: '>=16'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + sync-content@2.0.1: + resolution: {integrity: sha512-NI1mo514yFhr8pV/5Etvgh+pSBUIpoAKoiBIUwALVlQQNAwb40bTw8hhPFaip/dvv0GhpHVOq0vq8iY02ppLTg==} + engines: {node: 20 || >=22} + hasBin: true + + tap-parser@18.0.0: + resolution: {integrity: sha512-RM3Lp5LNCYcepRqPMuDFg8S3uYV8MDmgxUOjx2Q7f2z5QuB88u92ViBwyp3MuQ/DVMR7v48HrJfV2scXRQYf5A==} + engines: {node: 20 || >=22} + hasBin: true + + tap-yaml@4.0.0: + resolution: {integrity: sha512-CjMbq8hhT5TvzyvHRnzbGp00wmb4TZjSscCRCCJCdCzRb+Pb56HaMlBHNBn1/GZ6UqwUgDKdF18+9VAFnQ4F0g==} + engines: {node: 20 || >=22} + + tap@21.0.1: + resolution: {integrity: sha512-FE8H5Nt2mKU96DX4XgjqBkKzMcxvVkmbKhaNWOk2lUNRpqJNKqBOO5R6q7shr7JoUh1DHwdNWmppg8vWXQh2lQ==} + engines: {node: 20 || >=22} + hasBin: true + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + tcompare@9.0.0: + resolution: {integrity: sha512-qOliew2xDAqIUbIamIFZ+pz80s9T+8IywzQPIt7YX30ojsBqk86jcD6ouygqt5lHURTxFxWjzbUmIe7Cts4bsA==} + engines: {node: 20 || >=22} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trivial-deferred@2.0.0: + resolution: {integrity: sha512-iGbM7X2slv9ORDVj2y2FFUq3cP/ypbtu2nQ8S38ufjL0glBABvmR9pTdsib1XtS2LUhhLMbelaBUaf/s5J3dSw==} + engines: {node: '>= 8'} + + tshy@3.0.2: + resolution: {integrity: sha512-8GkWnAfmNXxl8iDTZ1o2H4jdaj9H7HeDKkr5qd0ZhQBCNA41D3xqTyg2Ycs51VCfmjJ5e+0v9AUmD6ylAI9Bgw==} + engines: {node: 20 || >=22} + hasBin: true + + tuf-js@2.2.1: + resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} + engines: {node: ^16.14.0 || >=18.0.0} + + type-fest@4.26.1: + resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} + engines: {node: '>=16'} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml-types@0.4.0: + resolution: {integrity: sha512-XfbA30NUg4/LWUiplMbiufUiwYhgB9jvBhTWel7XQqjV+GaB79c2tROu/8/Tu7jO0HvDvnKWtBk5ksWRrhQ/0g==} + engines: {node: '>= 16', npm: '>= 7'} + peerDependencies: + yaml: ^2.3.0 + + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoga-wasm-web@0.3.3: + resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} + +snapshots: + + '@alcalzone/ansi-tokenize@0.1.3': + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + '@babel/runtime@7.9.2': + dependencies: + regenerator-runtime: 0.13.5 + + '@base2/pretty-print-object@1.0.1': {} + + '@bcoe/v8-coverage@0.2.3': {} + + '@changesets/apply-release-plan@7.0.5': + dependencies: + '@changesets/config': 3.0.3 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.1 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.6.3 + + '@changesets/assemble-release-plan@6.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.6.3 + + '@changesets/changelog-git@0.2.0': + dependencies: + '@changesets/types': 6.0.0 + + '@changesets/cli@2.27.8': + dependencies: + '@changesets/apply-release-plan': 7.0.5 + '@changesets/assemble-release-plan': 6.0.4 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.3 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.4 + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.2 + '@manypkg/get-packages': 1.1.3 + '@types/semver': 7.5.8 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + outdent: 0.5.0 + p-limit: 2.2.2 + package-manager-detector: 0.2.0 + picocolors: 1.1.0 + resolve-from: 5.0.0 + semver: 7.6.3 + spawndamnit: 2.0.0 + term-size: 2.2.1 + + '@changesets/config@3.0.3': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.2': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.0 + semver: 7.6.3 + + '@changesets/get-release-plan@4.0.4': + dependencies: + '@changesets/assemble-release-plan': 6.0.4 + '@changesets/config': 3.0.3 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 2.0.0 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.0 + + '@changesets/parse@0.4.0': + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.13.1 + + '@changesets/pre@2.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.1': + dependencies: + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.0 + + '@changesets/should-skip-package@0.1.1': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.0.0': {} + + '@changesets/write@0.3.2': + dependencies: + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7(@types/node@12.20.55)(typescript@5.5.4)': + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 14.1.2 + '@tsconfig/node16': 16.1.3 + '@tsconfig/node18': 18.2.4 + '@tsconfig/node20': 20.1.4 + '@types/node': 12.20.55 + acorn: 8.12.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.9.2 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.9.2 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@npmcli/agent@2.2.2': + dependencies: + agent-base: 7.1.1 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@3.1.1': + dependencies: + semver: 7.6.3 + + '@npmcli/git@5.0.8': + dependencies: + '@npmcli/promise-spawn': 7.0.2 + ini: 4.1.3 + lru-cache: 10.4.3 + npm-pick-manifest: 9.1.0 + proc-log: 4.2.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.6.3 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + + '@npmcli/installed-package-contents@2.1.0': + dependencies: + npm-bundled: 3.0.1 + npm-normalize-package-bin: 3.0.1 + + '@npmcli/node-gyp@3.0.0': {} + + '@npmcli/package-json@5.2.0': + dependencies: + '@npmcli/git': 5.0.8 + glob: 10.4.5 + hosted-git-info: 7.0.2 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 6.0.2 + proc-log: 4.2.0 + semver: 7.6.3 + transitivePeerDependencies: + - bluebird + + '@npmcli/promise-spawn@7.0.2': + dependencies: + which: 4.0.0 + + '@npmcli/redact@2.0.1': {} + + '@npmcli/run-script@8.1.0': + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/package-json': 5.2.0 + '@npmcli/promise-spawn': 7.0.2 + node-gyp: 10.2.0 + proc-log: 4.2.0 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@sigstore/bundle@2.3.2': + dependencies: + '@sigstore/protobuf-specs': 0.3.2 + + '@sigstore/core@1.1.0': {} + + '@sigstore/protobuf-specs@0.3.2': {} + + '@sigstore/sign@2.3.2': + dependencies: + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + make-fetch-happen: 13.0.1 + proc-log: 4.2.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@sigstore/tuf@2.3.4': + dependencies: + '@sigstore/protobuf-specs': 0.3.2 + tuf-js: 2.2.1 + transitivePeerDependencies: + - supports-color + + '@sigstore/verify@1.2.1': + dependencies: + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + + '@tapjs/after-each@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + function-loop: 4.0.0 + + '@tapjs/after@3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-actual-promise: 1.0.2 + + '@tapjs/asserts@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 4.0.0 + is-actual-promise: 1.0.2 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + + '@tapjs/before-each@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + function-loop: 4.0.0 + + '@tapjs/before@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-actual-promise: 1.0.2 + + '@tapjs/chdir@3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@tapjs/config@5.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/test': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + chalk: 5.3.0 + jackspeak: 4.0.1 + polite-json: 5.0.0 + tap-yaml: 4.0.0 + walk-up-path: 4.0.0 + + '@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/processinfo': 3.1.8 + '@tapjs/stack': 4.0.0 + '@tapjs/test': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + async-hook-domain: 4.0.1 + diff: 5.2.0 + is-actual-promise: 1.0.2 + minipass: 7.1.2 + signal-exit: 4.1.0 + tap-parser: 18.0.0 + tap-yaml: 4.0.0 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + + '@tapjs/error-serdes@4.0.0': + dependencies: + minipass: 7.1.2 + + '@tapjs/filter@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@tapjs/fixture@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + mkdirp: 3.0.1 + rimraf: 6.0.1 + + '@tapjs/intercept@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 4.0.0 + + '@tapjs/mock@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 4.0.0 + resolve-import: 2.0.0 + walk-up-path: 4.0.0 + + '@tapjs/node-serialize@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/error-serdes': 4.0.0 + '@tapjs/stack': 4.0.0 + tap-parser: 18.0.0 + + '@tapjs/processinfo@3.1.8': + dependencies: + pirates: 4.0.6 + process-on-spawn: 1.0.0 + signal-exit: 4.1.0 + uuid: 8.3.2 + + '@tapjs/reporter@4.0.1(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))': + dependencies: + '@tapjs/config': 5.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/stack': 4.0.0 + chalk: 5.3.0 + ink: 5.0.1(react@18.3.1) + minipass: 7.1.2 + ms: 2.1.3 + patch-console: 2.0.0 + prismjs-terminal: 1.2.3 + react: 18.3.1 + string-length: 6.0.0 + tap-parser: 18.0.0 + tap-yaml: 4.0.0 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@tapjs/test' + - '@types/react' + - bufferutil + - react-devtools-core + - react-dom + - utf-8-validate + + '@tapjs/run@4.0.1(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/before': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/config': 5.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/processinfo': 3.1.8 + '@tapjs/reporter': 4.0.1(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tapjs/test@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1)) + '@tapjs/spawn': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/stdin': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/test': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + c8: 10.1.2 + chalk: 5.3.0 + chokidar: 3.6.0 + foreground-child: 3.3.0 + glob: 11.0.0 + minipass: 7.1.2 + mkdirp: 3.0.1 + opener: 1.5.2 + pacote: 18.0.6 + path-scurry: 2.0.0 + resolve-import: 2.0.0 + rimraf: 6.0.1 + semver: 7.6.3 + signal-exit: 4.1.0 + tap-parser: 18.0.0 + tap-yaml: 4.0.0 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + which: 4.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - monocart-coverage-reports + - react + - react-devtools-core + - react-dom + - supports-color + - utf-8-validate + + '@tapjs/snapshot@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-actual-promise: 1.0.2 + tcompare: 9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + + '@tapjs/spawn@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@tapjs/stack@4.0.0': {} + + '@tapjs/stdin@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@tapjs/test@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@types/node@12.20.55)(typescript@5.5.4) + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/after-each': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/asserts': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/before': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/before-each': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/chdir': 3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/filter': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/fixture': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/intercept': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/mock': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/node-serialize': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/snapshot': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/spawn': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/stdin': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/typescript': 3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(typescript@5.5.4) + '@tapjs/worker': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + glob: 11.0.0 + jackspeak: 4.0.1 + mkdirp: 3.0.1 + package-json-from-dist: 1.0.0 + resolve-import: 2.0.0 + rimraf: 6.0.1 + sync-content: 2.0.1 + tap-parser: 18.0.0 + tshy: 3.0.2 + typescript: 5.5.4 + walk-up-path: 4.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + + '@tapjs/typescript@3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(typescript@5.5.4)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@types/node@12.20.55)(typescript@5.5.4) + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + '@tapjs/worker@4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@tsconfig/node14@14.1.2': {} + + '@tsconfig/node16@16.1.3': {} + + '@tsconfig/node18@18.2.4': {} + + '@tsconfig/node20@20.1.4': {} + + '@tufjs/canonical-json@2.0.0': {} + + '@tufjs/models@2.0.1': + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.5 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/node@12.20.55': {} + + '@types/semver@7.5.8': {} + + '@vlasky/mysql@2.18.6': + dependencies: + bignumber.js: 9.1.1 + readable-stream: 2.3.7 + safe-buffer: 5.2.1 + sqlstring: 2.3.3 + + abbrev@2.0.0: {} + + acorn-walk@8.3.4: + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + agent-base@7.1.1: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ansi-colors@4.1.3: {} + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + array-union@2.1.0: {} + + async-hook-domain@4.0.1: {} + + auto-bind@5.0.1: {} + + balanced-match@1.0.0: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + big-integer@1.6.51: {} + + bignumber.js@9.1.1: {} + + binary-extensions@2.0.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.0 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + c8@10.1.2: + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 3.3.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.7 + test-exclude: 7.0.1 + v8-to-istanbul: 9.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + + cacache@18.0.4: + dependencies: + '@npmcli/fs': 3.1.1 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.6 + tar: 6.2.1 + unique-filename: 3.0.0 + + chalk@5.3.0: {} + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.1 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + + ci-info@3.9.0: {} + + clean-stack@2.2.0: {} + + cli-boxes@3.0.0: {} + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + code-excerpt@4.0.0: + dependencies: + convert-to-spaces: 2.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + convert-source-map@2.0.0: {} + + convert-to-spaces@2.0.1: {} + + core-util-is@1.0.2: {} + + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.1.1: + dependencies: + ms: 2.1.2 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + detect-indent@6.1.0: {} + + diff@4.0.2: {} + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + eastasianwidth@0.2.0: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + env-paths@2.2.1: {} + + environment@1.1.0: {} + + err-code@2.0.3: {} + + escalade@3.2.0: {} + + escape-string-regexp@2.0.0: {} + + esprima@4.0.1: {} + + events-to-array@2.0.3: {} + + exponential-backoff@3.1.1: {} + + extendable-error@0.1.7: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fromentries@1.3.2: {} + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.3 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.3 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.1.1 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + + fsevents@2.3.3: + optional: true + + function-loop@4.0.0: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.1 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.1 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 2.0.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + graceful-fs@4.2.3: {} + + has-flag@4.0.0: {} + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + html-escaper@2.0.1: {} + + http-cache-semantics@4.1.1: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.1.1 + transitivePeerDependencies: + - supports-color + + human-id@1.0.2: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore-walk@6.0.5: + dependencies: + minimatch: 9.0.5 + + ignore@5.3.2: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + indent-string@5.0.0: {} + + inherits@2.0.4: {} + + ini@4.1.3: {} + + ink@5.0.1(react@18.3.1): + dependencies: + '@alcalzone/ansi-tokenize': 0.1.3 + ansi-escapes: 7.0.0 + ansi-styles: 6.2.1 + auto-bind: 5.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + cli-cursor: 4.0.0 + cli-truncate: 4.0.0 + code-excerpt: 4.0.0 + indent-string: 5.0.0 + is-in-ci: 0.1.0 + lodash: 4.17.21 + patch-console: 2.0.0 + react: 18.3.1 + react-reconciler: 0.29.2(react@18.3.1) + scheduler: 0.23.2 + signal-exit: 3.0.7 + slice-ansi: 7.1.0 + stack-utils: 2.0.6 + string-width: 7.2.0 + type-fest: 4.26.1 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 + ws: 8.18.0 + yoga-wasm-web: 0.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + is-actual-promise@1.0.2: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.0.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-glob@4.0.1: + dependencies: + is-extglob: 2.1.1 + + is-in-ci@0.1.0: {} + + is-lambda@1.0.1: {} + + is-number@7.0.0: {} + + is-plain-object@5.0.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.1 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.0.1: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-tokens@4.0.0: {} + + js-yaml@3.13.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsbn@1.1.0: {} + + json-parse-even-better-errors@3.0.2: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.3 + + jsonparse@1.3.1: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.startcase@4.4.0: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lru-cache@11.0.1: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + make-error@1.3.6: {} + + make-fetch-happen@13.0.1: + dependencies: + '@npmcli/agent': 2.2.2 + cacache: 18.0.4 + http-cache-semantics: 4.1.1 + is-lambda: 1.0.1 + minipass: 7.1.2 + minipass-fetch: 3.0.5 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + proc-log: 4.2.0 + promise-retry: 2.0.1 + ssri: 10.0.6 + transitivePeerDependencies: + - supports-color + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@3.0.5: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.1.1 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.1.1 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.1.1 + + minipass@3.1.1: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.1.1 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + mri@1.2.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + negotiator@0.6.3: {} + + node-gyp@10.2.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + make-fetch-happen: 13.0.1 + nopt: 7.2.1 + proc-log: 4.2.0 + semver: 7.6.3 + tar: 6.2.1 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + npm-bundled@3.0.1: + dependencies: + npm-normalize-package-bin: 3.0.1 + + npm-install-checks@6.3.0: + dependencies: + semver: 7.6.3 + + npm-normalize-package-bin@3.0.1: {} + + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.6.3 + validate-npm-package-name: 5.0.1 + + npm-packlist@8.0.2: + dependencies: + ignore-walk: 6.0.5 + + npm-pick-manifest@9.1.0: + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.3 + semver: 7.6.3 + + npm-registry-fetch@17.1.0: + dependencies: + '@npmcli/redact': 2.0.1 + jsonparse: 1.3.1 + make-fetch-happen: 13.0.1 + minipass: 7.1.2 + minipass-fetch: 3.0.5 + minizlib: 2.1.2 + npm-package-arg: 11.0.3 + proc-log: 4.2.0 + transitivePeerDependencies: + - supports-color + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + opener@1.5.2: {} + + os-tmpdir@1.0.2: {} + + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.2.2: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.2.2 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@2.1.0: {} + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.0: {} + + package-manager-detector@0.2.0: {} + + pacote@18.0.6: + dependencies: + '@npmcli/git': 5.0.8 + '@npmcli/installed-package-contents': 2.1.0 + '@npmcli/package-json': 5.2.0 + '@npmcli/promise-spawn': 7.0.2 + '@npmcli/run-script': 8.1.0 + cacache: 18.0.4 + fs-minipass: 3.0.3 + minipass: 7.1.2 + npm-package-arg: 11.0.3 + npm-packlist: 8.0.2 + npm-pick-manifest: 9.1.0 + npm-registry-fetch: 17.1.0 + proc-log: 4.2.0 + promise-retry: 2.0.1 + sigstore: 2.3.1 + ssri: 10.0.6 + tar: 6.2.1 + transitivePeerDependencies: + - bluebird + - supports-color + + patch-console@2.0.0: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.1 + minipass: 7.1.2 + + path-type@4.0.0: {} + + picocolors@1.1.0: {} + + picomatch@2.3.1: {} + + pify@4.0.1: {} + + pirates@4.0.6: {} + + polite-json@5.0.0: {} + + prettier@2.8.8: {} + + prismjs-terminal@1.2.3: + dependencies: + chalk: 5.3.0 + prismjs: 1.29.0 + string-length: 6.0.0 + + prismjs@1.29.0: {} + + proc-log@4.2.0: {} + + process-nextick-args@2.0.1: {} + + process-on-spawn@1.0.0: + dependencies: + fromentries: 1.3.2 + + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + pseudomap@1.0.2: {} + + queue-microtask@1.2.3: {} + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-element-to-jsx-string@15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.1.0 + + react-is@18.1.0: {} + + react-reconciler@0.29.2(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.3 + js-yaml: 3.13.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + readable-stream@2.3.7: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + regenerator-runtime@0.13.5: {} + + require-directory@2.1.1: {} + + resolve-from@5.0.0: {} + + resolve-import@2.0.0: + dependencies: + glob: 11.0.0 + walk-up-path: 4.0.0 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retry@0.12.0: {} + + reusify@1.0.4: {} + + rimraf@6.0.1: + dependencies: + glob: 11.0.0 + package-json-from-dist: 1.0.0 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@7.6.3: {} + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + signal-exit@3.0.2: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sigstore@2.3.1: + dependencies: + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/sign': 2.3.2 + '@sigstore/tuf': 2.3.4 + '@sigstore/verify': 1.2.1 + transitivePeerDependencies: + - supports-color + + slash@3.0.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.4: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + spawndamnit@2.0.0: + dependencies: + cross-spawn: 5.1.0 + signal-exit: 3.0.2 + + spdx-correct@3.1.0: + dependencies: + spdx-expression-parse: 3.0.0 + spdx-license-ids: 3.0.5 + + spdx-exceptions@2.2.0: {} + + spdx-expression-parse@3.0.0: + dependencies: + spdx-exceptions: 2.2.0 + spdx-license-ids: 3.0.5 + + spdx-license-ids@3.0.5: {} + + sprintf-js@1.0.3: {} + + sprintf-js@1.1.3: {} + + sqlstring@2.3.3: {} + + ssri@10.0.6: + dependencies: + minipass: 7.1.2 + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + string-length@6.0.0: + dependencies: + strip-ansi: 7.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + sync-content@2.0.1: + dependencies: + glob: 11.0.0 + mkdirp: 3.0.1 + path-scurry: 2.0.0 + rimraf: 6.0.1 + tshy: 3.0.2 + + tap-parser@18.0.0: + dependencies: + events-to-array: 2.0.3 + tap-yaml: 4.0.0 + + tap-yaml@4.0.0: + dependencies: + yaml: 2.5.1 + yaml-types: 0.4.0(yaml@2.5.1) + + tap@21.0.1(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4): + dependencies: + '@tapjs/after': 3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/after-each': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/asserts': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/before': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/before-each': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/chdir': 3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/core': 4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/filter': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/fixture': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/intercept': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/mock': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/node-serialize': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/run': 4.0.1(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/snapshot': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/spawn': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/stdin': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tapjs/test': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tapjs/typescript': 3.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@12.20.55)(typescript@5.5.4) + '@tapjs/worker': 4.0.0(@tapjs/core@4.0.0(@types/node@12.20.55)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + resolve-import: 2.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - monocart-coverage-reports + - react + - react-devtools-core + - react-dom + - supports-color + - typescript + - utf-8-validate + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + tcompare@9.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + diff: 5.2.0 + react-element-to-jsx-string: 15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react + - react-dom + + term-size@2.2.1: {} + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + trivial-deferred@2.0.0: {} + + tshy@3.0.2: + dependencies: + chalk: 5.3.0 + chokidar: 3.6.0 + foreground-child: 3.3.0 + minimatch: 10.0.1 + mkdirp: 3.0.1 + polite-json: 5.0.0 + resolve-import: 2.0.0 + rimraf: 6.0.1 + sync-content: 2.0.1 + typescript: 5.5.4 + walk-up-path: 4.0.0 + + tuf-js@2.2.1: + dependencies: + '@tufjs/models': 2.0.1 + debug: 4.3.7 + make-fetch-happen: 13.0.1 + transitivePeerDependencies: + - supports-color + + type-fest@4.26.1: {} + + typescript@5.5.4: {} + + unique-filename@3.0.0: + dependencies: + unique-slug: 4.0.0 + + unique-slug@4.0.0: + dependencies: + imurmurhash: 0.1.4 + + universalify@0.1.2: {} + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + v8-compile-cache-lib@3.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.1.0 + spdx-expression-parse: 3.0.0 + + validate-npm-package-name@5.0.1: {} + + walk-up-path@4.0.0: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.1 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + ws@8.18.0: {} + + y18n@5.0.8: {} + + yallist@2.1.2: {} + + yallist@4.0.0: {} + + yaml-types@0.4.0(yaml@2.5.1): + dependencies: + yaml: 2.5.1 + + yaml@2.5.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yoga-wasm-web@0.3.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..397c8cf --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +packages: + - './' + # exclude packages that are inside test directories + - '!test/*' \ No newline at end of file diff --git a/test/codemap.js b/test/codemap.js index 91b3639..496e111 100644 --- a/test/codemap.js +++ b/test/codemap.js @@ -1,7 +1,7 @@ const tap = require('tap'); const getEventClass = require('./../lib/code_map').getEventClass; -tap.test('Codemap', test => { +tap.test('Codemap', (test) => { test.equal(getEventClass(2).name, 'Query'); test.equal(getEventClass(490).name, 'Unknown'); test.end(); diff --git a/test/errors.js b/test/errors.js index 5df5f99..025e157 100644 --- a/test/errors.js +++ b/test/errors.js @@ -4,24 +4,25 @@ const ZongJi = require('../'); const settings = require('./settings/mysql'); const testDb = require('./helpers'); -tap.test('Connect to an invalid host', test => { +tap.test('Connect to an invalid host', (test) => { const zongji = new ZongJi({ host: 'wronghost', user: 'wronguser', password: 'wrongpass' }); - zongji.on('error', function(error) { - test.ok(['ENOTFOUND', 'ETIMEDOUT'].indexOf(error.code) !== -1); + zongji.on('error', function (error) { + // When running in CI the error is EAI_AGAIN because the DNS lookup for the fake host fails + test.ok(['ENOTFOUND', 'ETIMEDOUT', 'EAI_AGAIN'].indexOf(error.code) !== -1); test.end(); }); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); zongji.start(); }); -tap.test('Initialise testing db', test => { - testDb.init(err => { +tap.test('Initialise testing db', (test) => { + testDb.init((err) => { if (err) { return test.threw(err); } @@ -29,31 +30,27 @@ tap.test('Initialise testing db', test => { }); }); -const ACCEPTABLE_ERRORS = [ - 'PROTOCOL_CONNECTION_LOST', - // MySQL 5.1 emits a packet sequence error when the binlog disconnected - 'PROTOCOL_INCORRECT_PACKET_SEQUENCE' -]; +const ACCEPTABLE_ERRORS = ['PROTOCOL_CONNECTION_LOST', 'PROTOCOL_INCORRECT_PACKET_SEQUENCE']; -tap.test('Disconnect binlog connection', test => { +tap.test('Disconnect binlog connection', (test) => { const zongji = new ZongJi(settings.connection); zongji.start({ includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], - serverId: testDb.serverId(), + serverId: testDb.serverId() }); zongji.on('ready', () => { let threadId = zongji.connection.threadId; test.ok(!isNaN(threadId)); - testDb.execute([`kill ${threadId}`], err => { + testDb.execute([`kill ${threadId}`], (err) => { if (err) { test.threw(err); } }); }); - zongji.on('error', err => { + zongji.on('error', (err) => { if (ACCEPTABLE_ERRORS.indexOf(err.code) > -1) { zongji.stop(); test.end(); @@ -63,25 +60,25 @@ tap.test('Disconnect binlog connection', test => { }); }); -tap.test('Disconnect control connection', test => { +tap.test('Disconnect control connection', (test) => { const zongji = new ZongJi(settings.connection); zongji.start({ includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], - serverId: testDb.serverId(), + serverId: testDb.serverId() }); zongji.on('ready', () => { let threadId = zongji.ctrlConnection.threadId; test.ok(!isNaN(threadId)); - testDb.execute([`kill ${threadId}`], err => { + testDb.execute([`kill ${threadId}`], (err) => { if (err) { test.threw(err); } }); }); - zongji.on('error', err => { + zongji.on('error', (err) => { if (ACCEPTABLE_ERRORS.indexOf(err.code) > -1) { zongji.stop(); test.end(); @@ -91,37 +88,36 @@ tap.test('Disconnect control connection', test => { }); }); - -tap.test('Events come through in sequence', test => { +tap.test('Events come through in sequence', (test) => { const NEW_INST_TIMEOUT = 1000; const UPDATE_INTERVAL = 300; const UPDATE_COUNT = 5; const TEST_TABLE = 'reconnect_at_pos'; - test.test(`prepare table ${TEST_TABLE}`, test => { - testDb.execute([ - `DROP TABLE IF EXISTS ${TEST_TABLE}`, - `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, - `INSERT INTO ${TEST_TABLE} (col) VALUES (10)`, - ], err =>{ - if (err) { - return test.threw(err); + test.test(`prepare table ${TEST_TABLE}`, {}, (test) => { + testDb.execute( + [ + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, + `INSERT INTO ${TEST_TABLE} (col) VALUES (10)` + ], + (err) => { + if (err) { + return test.threw(err); + } + test.end(); } - test.end(); - }); + ); }); - test.test('when reconnect', test => { + test.test('when reconnect', {}, (test) => { const result = []; function startPeriodicallyWriting() { - let sequences = Array.from( - {length: UPDATE_COUNT}, - (_, i) => `INSERT INTO ${TEST_TABLE} (col) VALUES (${i})` - ); + let sequences = Array.from({ length: UPDATE_COUNT }, (_, i) => `INSERT INTO ${TEST_TABLE} (col) VALUES (${i})`); let updateInterval = setInterval(() => { - testDb.execute([sequences.shift()], error => { + testDb.execute([sequences.shift()], (error) => { if (error) { clearInterval(updateInterval); test.threw(error); @@ -140,12 +136,10 @@ tap.test('Events come through in sequence', test => { zongji.start({ ...options, // Must include rotate events for filename and position properties - includeEvents: [ - 'rotate', 'tablemap', 'writerows', 'updaterows', 'deleterows' - ] + includeEvents: ['rotate', 'tablemap', 'writerows', 'updaterows', 'deleterows'] }); - zongji.on('binlog', function(event) { + zongji.on('binlog', function (event) { if (event.getTypeName() === 'WriteRows') { result.push(event.rows[0].col); } @@ -153,7 +147,7 @@ tap.test('Events come through in sequence', test => { if (result.length === UPDATE_COUNT) { test.strictSame( result, - Array.from({length: UPDATE_COUNT}, (_, i) => i) + Array.from({ length: UPDATE_COUNT }, (_, i) => i) ); test.end(); } @@ -164,7 +158,7 @@ tap.test('Events come through in sequence', test => { let first = newInstance({ serverId: testDb.serverId(), - startAtEnd: true, + startAtEnd: true }); first.on('ready', () => { @@ -175,10 +169,10 @@ tap.test('Events come through in sequence', test => { let second = newInstance({ serverId: testDb.serverId(), filename: first.get('filename'), - position: first.get('position'), + position: first.get('position') }); - test.tearDown(() => second.stop()); + test.teardown(() => second.stop()); }); setTimeout(() => first.stop(), NEW_INST_TIMEOUT); }); diff --git a/test/events.js b/test/events.js index b42fc45..4991afd 100644 --- a/test/events.js +++ b/test/events.js @@ -5,25 +5,25 @@ const expectEvents = require('./helpers/expectEvents'); const testDb = require('./helpers'); const settings = require('./settings/mysql'); -const checkTableMatches = function(tableName) { - return function(test, event) { +const checkTableMatches = function (tableName) { + return function (test, event) { const tableDetails = event.tableMap[event.tableId]; - test.strictEqual(tableDetails.parentSchema, testDb.SCHEMA_NAME); - test.strictEqual(tableDetails.tableName, tableName); + test.equal(tableDetails.parentSchema, testDb.SCHEMA_NAME); + test.equal(tableDetails.tableName, tableName); }; }; // For use with expectEvents() -const tableMapEvent = function(tableName) { +const tableMapEvent = function (tableName) { return { _type: 'TableMap', tableName: tableName, - schemaName: testDb.SCHEMA_NAME, + schemaName: testDb.SCHEMA_NAME }; }; -tap.test('Initialise testing db', test => { - testDb.init(err => { +tap.test('Initialise testing db', (test) => { + testDb.init((err) => { if (err) { return test.threw(err); } @@ -31,115 +31,128 @@ tap.test('Initialise testing db', test => { }); }); -tap.test('Binlog option startAtEnd', test => { +tap.test('Binlog option startAtEnd', (test) => { const TEST_TABLE = 'start_at_end_test'; - test.test(`prepare new table ${TEST_TABLE}`, test => { - testDb.execute([ - 'FLUSH LOGS', // Ensure ZongJi perserveres through a rotation event - `DROP TABLE IF EXISTS ${TEST_TABLE}`, - `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, - `INSERT INTO ${TEST_TABLE} (col) VALUES (12)`, - ], err => { - if (err) { - return test.fail(err); + test.test(`prepare new table ${TEST_TABLE}`, (test) => { + testDb.execute( + [ + 'FLUSH LOGS', // Ensure ZongJi perserveres through a rotation event + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, + `INSERT INTO ${TEST_TABLE} (col) VALUES (12)` + ], + (err) => { + if (err) { + return test.fail(err); + } + test.end(); } - test.end(); - }); + ); }); - test.test('start', test => { + test.test('start', (test) => { const events = []; const zongji = new ZongJi(settings.connection); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); - zongji.on('binlog', evt => events.push(evt)); + zongji.on('binlog', (evt) => events.push(evt)); zongji.start({ startAtEnd: true, - includeEvents: ['tablemap', 'writerows'], + includeEvents: ['tablemap', 'writerows'] }); zongji.on('ready', () => { - testDb.execute([ - `INSERT INTO ${TEST_TABLE} (col) VALUES (9)`, - ], err => { + testDb.execute([`INSERT INTO ${TEST_TABLE} (col) VALUES (9)`], (err) => { if (err) { return test.fail(err); } // Should only have 2 events since ZongJi start - expectEvents(test, events, + expectEvents( + test, + events, [ - { /* do not bother testing anything on first event */ }, - { rows: [ { col: 9 } ] } - ], 1, + { + /* do not bother testing anything on first event */ + }, + { rows: [{ col: 9 }] } + ], + 1, () => test.end() ); }); }); - - }); test.end(); }); -tap.test('Class constructor', test => { +tap.test('Class constructor', (test) => { const TEST_TABLE = 'conn_obj_test'; - test.test(`prepare table ${TEST_TABLE}`, test => { - testDb.execute([ - `DROP TABLE IF EXISTS ${TEST_TABLE}`, - `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, - `INSERT INTO ${TEST_TABLE} (col) VALUES (10)`, - ], err => { - if (err) { - return test.fail(err); - } + test.test(`prepare table ${TEST_TABLE}`, (test) => { + testDb.execute( + [ + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, + `INSERT INTO ${TEST_TABLE} (col) VALUES (10)` + ], + (err) => { + if (err) { + return test.fail(err); + } - test.end(); - }); + test.end(); + } + ); }); function run(test, zongji) { - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); const events = []; - zongji.on('binlog', evt => events.push(evt)); + zongji.on('binlog', (evt) => events.push(evt)); zongji.start({ startAtEnd: true, serverId: testDb.serverId(), - includeEvents: ['tablemap', 'writerows'], + includeEvents: ['tablemap', 'writerows'] }); zongji.on('ready', () => { - let value = Math.round(Math.random() * 100); - testDb.execute([ - `INSERT INTO ${TEST_TABLE} (col) VALUES (${value})`, - ], err => { - if (err) { - return test.fail(err); - } - // Should only have 2 events since ZongJi start + let value = Math.round(Math.random() * 100); + testDb.execute([`INSERT INTO ${TEST_TABLE} (col) VALUES (${value})`], (err) => { + if (err) { + return test.fail(err); + } + // Should only have 2 events since ZongJi start - expectEvents(test, events, [ - { /* do not bother testing anything on first event */ }, - { rows: [ { col: value } ] } - ], 1, () => test.end()); - }); + expectEvents( + test, + events, + [ + { + /* do not bother testing anything on first event */ + }, + { rows: [{ col: value }] } + ], + 1, + () => test.end() + ); + }); }); } const mysql = require('@vlasky/mysql'); - test.test('pass a mysql connection instance', test => { + test.test('pass a mysql connection instance', (test) => { const conn = mysql.createConnection(settings.connection); const zongji = new ZongJi(conn); zongji.on('stopped', () => conn.destroy()); run(test, zongji); }); - test.test('pass a mysql pool', test => { + test.test('pass a mysql pool', (test) => { const pool = mysql.createConnection(settings.connection); const zongji = new ZongJi(pool); zongji.on('stopped', () => pool.end()); @@ -149,14 +162,11 @@ tap.test('Class constructor', test => { test.end(); }); -tap.test('Write events', test => { +tap.test('Write events', (test) => { const TEST_TABLE = 'write_events_test'; - test.test(`prepare table ${TEST_TABLE}`, test => { - testDb.execute([ - `DROP TABLE IF EXISTS ${TEST_TABLE}`, - `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`, - ], err => { + test.test(`prepare table ${TEST_TABLE}`, (test) => { + testDb.execute([`DROP TABLE IF EXISTS ${TEST_TABLE}`, `CREATE TABLE ${TEST_TABLE} (col INT UNSIGNED)`], (err) => { if (err) { return test.fail(err); } @@ -165,120 +175,123 @@ tap.test('Write events', test => { }); }); - test.test('write a record', test => { + test.test('write a record', (test) => { const events = []; const zongji = new ZongJi(settings.connection); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); zongji.start({ startAtEnd: true, serverId: testDb.serverId(), - includeEvents: ['tablemap', 'writerows'], + includeEvents: ['tablemap', 'writerows'] }); zongji.on('ready', () => { - testDb.execute([ - `INSERT INTO ${TEST_TABLE} (col) VALUES (14)`, - ], err => { + testDb.execute([`INSERT INTO ${TEST_TABLE} (col) VALUES (14)`], (err) => { if (err) { return test.fail(err); } }); }); - zongji.on('binlog', evt => { + zongji.on('binlog', (evt) => { events.push(evt); if (events.length == 2) { - expectEvents(test, events, + expectEvents( + test, + events, [ tableMapEvent(TEST_TABLE), { _type: 'WriteRows', _checkTableMap: checkTableMatches(TEST_TABLE), - rows: [ { col: 14 } ], + rows: [{ col: 14 }] } - ], 1, + ], + 1, () => test.end() ); } }); }); - test.test('update a record', test => { + test.test('update a record', (test) => { const events = []; const zongji = new ZongJi(settings.connection); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); zongji.start({ startAtEnd: true, serverId: testDb.serverId(), - includeEvents: ['tablemap', 'updaterows'], + includeEvents: ['tablemap', 'updaterows'] }); zongji.on('ready', () => { - testDb.execute([ - `UPDATE ${TEST_TABLE} SET col=15`, - ], err => { + testDb.execute([`UPDATE ${TEST_TABLE} SET col=15`], (err) => { if (err) { return test.fail(err); } }); }); - zongji.on('binlog', evt => { + zongji.on('binlog', (evt) => { events.push(evt); if (events.length == 2) { - expectEvents(test, events, + expectEvents( + test, + events, [ tableMapEvent(TEST_TABLE), { _type: 'UpdateRows', _checkTableMap: checkTableMatches(TEST_TABLE), - rows: [ { before: { col: 14 }, after: { col: 15 } } ], + rows: [{ before: { col: 14 }, after: { col: 15 } }] } - ], 1, + ], + 1, () => test.end() ); } }); }); - test.test('delete a record', test => { + test.test('delete a record', (test) => { const events = []; const zongji = new ZongJi(settings.connection); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); zongji.start({ startAtEnd: true, serverId: testDb.serverId(), - includeEvents: ['tablemap', 'deleterows'], + includeEvents: ['tablemap', 'deleterows'] }); zongji.on('ready', () => { - testDb.execute([ - `DELETE FROM ${TEST_TABLE}`, - ], err => { + testDb.execute([`DELETE FROM ${TEST_TABLE}`], (err) => { if (err) { return test.fail(err); } }); }); - zongji.on('binlog', evt => { + zongji.on('binlog', (evt) => { events.push(evt); if (events.length == 2) { - expectEvents(test, events, + expectEvents( + test, + events, [ tableMapEvent(TEST_TABLE), { _type: 'DeleteRows', _checkTableMap: checkTableMatches(TEST_TABLE), - rows: [ { col: 15 } ], + rows: [{ col: 15 }] } - ], 1, + ], + 1, () => test.end() ); } @@ -288,42 +301,50 @@ tap.test('Write events', test => { test.end(); }); -tap.test('Intvar / Query event', test => { +tap.test('Intvar / Query event', (test) => { const TEST_TABLE = 'intvar_test'; - test.test(`prepare table ${TEST_TABLE}`, test => { - testDb.execute([ - `DROP TABLE IF EXISTS ${TEST_TABLE}`, - `CREATE TABLE ${TEST_TABLE} (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, col INT)`, - ], err => { - if (err) { - return test.fail(err); - } + test.test(`prepare table ${TEST_TABLE}`, (test) => { + testDb.execute( + [ + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, col INT)` + ], + (err) => { + if (err) { + return test.fail(err); + } - test.end(); - }); + test.end(); + } + ); }); - test.test('begin', test => { + test.test('begin', (test) => { const events = []; const zongji = new ZongJi(settings.connection); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); - zongji.on('binlog', event => { + zongji.on('binlog', (event) => { if (event.getTypeName() === 'Query' && event.query === 'BEGIN') { return; } events.push(event); if (events.length === 6) { - expectEvents(test, events, [ + expectEvents( + test, + events, + [ { _type: 'IntVar', type: 2, value: 1 }, { _type: 'Query' }, { _type: 'IntVar', type: 2, value: 2 }, { _type: 'Query' }, { _type: 'IntVar', type: 1, value: 2 }, - { _type: 'Query' }, - ], 1, () => test.end() + { _type: 'Query' } + ], + 1, + () => test.end() ); } }); @@ -331,47 +352,50 @@ tap.test('Intvar / Query event', test => { zongji.start({ startAtEnd: true, serverId: testDb.serverId(), - includeEvents: ['intvar', 'query'], + includeEvents: ['intvar', 'query'] }); zongji.on('ready', () => { - testDb.execute([ - 'SET SESSION binlog_format=STATEMENT', - `INSERT INTO ${TEST_TABLE} (col) VALUES (10)`, - `INSERT INTO ${TEST_TABLE} (col) VALUES (11)`, - `INSERT INTO ${TEST_TABLE} (id, col) VALUES (100, LAST_INSERT_ID())`, - // Other tests expect row-based replication, so reset here - 'SET SESSION binlog_format=ROW', - ], err => { - if (err) { - test.fail(err); + testDb.execute( + [ + 'SET SESSION binlog_format=STATEMENT', + `INSERT INTO ${TEST_TABLE} (col) VALUES (10)`, + `INSERT INTO ${TEST_TABLE} (col) VALUES (11)`, + `INSERT INTO ${TEST_TABLE} (id, col) VALUES (100, LAST_INSERT_ID())`, + // Other tests expect row-based replication, so reset here + 'SET SESSION binlog_format=ROW' + ], + (err) => { + if (err) { + test.fail(err); + } } - }); + ); }); - }); test.end(); }); -tap.test('With many columns', test => { +tap.test('With many columns', (test) => { const TEST_TABLE = '33_columns'; const events = []; const zongji = new ZongJi(settings.connection); - test.tearDown(() => zongji.stop()); - zongji.on('binlog', evt => events.push(evt)); + test.teardown(() => zongji.stop()); + zongji.on('binlog', (evt) => events.push(evt)); zongji.start({ startAtEnd: true, serverId: testDb.serverId(), - includeEvents: ['tablemap', 'writerows'], + includeEvents: ['tablemap', 'writerows'] }); zongji.on('ready', () => { - testDb.execute([ - `DROP TABLE IF EXISTS ${TEST_TABLE}`, - `CREATE TABLE ${TEST_TABLE} ( + testDb.execute( + [ + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} ( col1 INT SIGNED NULL, col2 BIGINT SIGNED NULL, col3 TINYINT SIGNED NULL, col4 SMALLINT SIGNED NULL, col5 MEDIUMINT SIGNED NULL, col6 INT SIGNED NULL, @@ -389,7 +413,7 @@ tap.test('With many columns', test => { col29 SMALLINT SIGNED NULL, col30 INT SIGNED NULL, col31 BIGINT SIGNED NULL, col32 TINYINT SIGNED NULL, col33 SMALLINT SIGNED NULL)`, - `INSERT INTO ${TEST_TABLE} (col1, col2, col3, col4, col5, col33) VALUES + `INSERT INTO ${TEST_TABLE} (col1, col2, col3, col4, col5, col33) VALUES (null, null, null, null, null, null), (-1, -1, -1, -1, -1, -1), (2147483647, 9007199254740993, 127, 32767, 8388607, 12), @@ -398,16 +422,21 @@ tap.test('With many columns', test => { (-1, 9223372036854775809, -1, -1, null, -6), (123456, -9223372036854775809, 96, 300, 1000, null), (-123456, 9223372036854775807, -96, -300, -1000, null)`, - `SELECT * FROM ${TEST_TABLE}`, - ], (err, result) => { - if (err) { - return test.fail(err); - } + `SELECT * FROM ${TEST_TABLE}` + ], + (err, result) => { + if (err) { + return test.fail(err); + } - expectEvents(test, events, [ - { _type: 'TableMap' }, - { rows: result[result.length - 1], _type: 'WriteRows' } - ], 1, test.end); - }); + expectEvents( + test, + events, + [{ _type: 'TableMap' }, { rows: result[result.length - 1], _type: 'WriteRows' }], + 1, + test.end + ); + } + ); }); }); diff --git a/test/filtering.js b/test/filtering.js index dc3826b..c5f9a29 100644 --- a/test/filtering.js +++ b/test/filtering.js @@ -4,8 +4,8 @@ const settings = require('./settings/mysql'); const testDb = require('./helpers'); // this test is only used for initialization -tap.test('Initialise testing db', test => { - testDb.init(err => { +tap.test('Initialise testing db', (test) => { + testDb.init((err) => { if (err) { return test.fail(err); } @@ -14,81 +14,81 @@ tap.test('Initialise testing db', test => { }); }); -tap.test('Unit test', test => { +tap.test('Unit test', (test) => { const zongji = new ZongJi(settings.connection); - test.test('Check that exclude overrides include', test => { - zongji._filters({ - includeEvents: ['tablemap', 'writerows', 'updaterows', 'rotate'], - excludeEvents: ['rotate'], - includeSchema: {db1: true, db2: ['one_table'], db3: true}, - excludeSchema: {db3: true} - }); - test.ok(!zongji._skipEvent('tablemap')); - test.ok(zongji._skipEvent('rotate')); - test.ok(!zongji._skipSchema('db1', 'any_table')); - test.ok(!zongji._skipSchema('db2', 'one_table')); - test.ok(zongji._skipSchema('db2', 'another_table')); - test.ok(zongji._skipSchema('db3', 'any_table')); - - test.end(); + test.test('Check that exclude overrides include', (test) => { + zongji._filters({ + includeEvents: ['tablemap', 'writerows', 'updaterows', 'rotate'], + excludeEvents: ['rotate'], + includeSchema: { db1: true, db2: ['one_table'], db3: true }, + excludeSchema: { db3: true } }); + test.ok(!zongji._skipEvent('tablemap')); + test.ok(zongji._skipEvent('rotate')); + test.ok(!zongji._skipSchema('db1', 'any_table')); + test.ok(!zongji._skipSchema('db2', 'one_table')); + test.ok(zongji._skipSchema('db2', 'another_table')); + test.ok(zongji._skipSchema('db3', 'any_table')); - test.test(test => { - zongji._filters({ - includeSchema: {db1: ['just_me']} - }); - test.ok(!zongji._skipSchema('db1', 'just_me')); - test.ok(zongji._skipSchema('db2', 'anything_else')); - test.ok(zongji._skipSchema('db1', 'not_me')); + test.end(); + }); - test.end(); + test.test((test) => { + zongji._filters({ + includeSchema: { db1: ['just_me'] } }); + test.ok(!zongji._skipSchema('db1', 'just_me')); + test.ok(zongji._skipSchema('db2', 'anything_else')); + test.ok(zongji._skipSchema('db1', 'not_me')); - test.test(test => { - zongji._filters({ - excludeSchema: {db1: ['not_me']} - }); - - test.ok(!zongji._skipSchema('db1', 'anything_else')); - test.ok(!zongji._skipSchema('db2', 'anything_else')); - test.ok(zongji._skipSchema('db1', 'not_me')); + test.end(); + }); - test.end(); + test.test((test) => { + zongji._filters({ + excludeSchema: { db1: ['not_me'] } }); - test.test(test =>{ - zongji._filters({ - excludeEvents: ['rotate'] - }); - test.ok(!zongji._skipEvent('tablemap')); - test.ok(zongji._skipEvent('rotate')); + test.ok(!zongji._skipSchema('db1', 'anything_else')); + test.ok(!zongji._skipSchema('db2', 'anything_else')); + test.ok(zongji._skipSchema('db1', 'not_me')); - test.end(); - }); + test.end(); + }); - test.test(test =>{ - test.plan(2); - zongji._filters({ - includeEvents: ['rotate'], - }); - test.ok(zongji._skipEvent('tablemap')); - test.ok(!zongji._skipEvent('rotate')); + test.test((test) => { + zongji._filters({ + excludeEvents: ['rotate'] }); + test.ok(!zongji._skipEvent('tablemap')); + test.ok(zongji._skipEvent('rotate')); test.end(); + }); + + test.test((test) => { + test.plan(2); + zongji._filters({ + includeEvents: ['rotate'] + }); + test.ok(zongji._skipEvent('tablemap')); + test.ok(!zongji._skipEvent('rotate')); + }); + + test.end(); }); -tap.test('Exclue all the schema', test => { +tap.test('Exclue all the schema', (test) => { const zongji = new ZongJi(settings.connection); const eventLog = []; const errorLog = []; - zongji.on('binlog', event => eventLog.push(event)); - zongji.on('error', error => errorLog.push(error)); + zongji.on('binlog', (event) => eventLog.push(event)); + zongji.on('error', (error) => errorLog.push(error)); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); // Set includeSchema to not include anything, recieve no row events // Ensure that filters are applied @@ -100,54 +100,57 @@ tap.test('Exclue all the schema', test => { zongji.on('ready', () => { const testTable = 'filter_test'; - testDb.execute([ - `DROP TABLE IF EXISTS ${testTable}`, - `CREATE TABLE ${testTable} (col INT UNSIGNED)`, - `INSERT INTO ${testTable} (col) VALUES (10)`, - `UPDATE ${testTable} SET col = 15`, - `DELETE FROM ${testTable}`, - ], (error) => { - if (error) { - return test.fail(error); + testDb.execute( + [ + `DROP TABLE IF EXISTS ${testTable}`, + `CREATE TABLE ${testTable} (col INT UNSIGNED)`, + `INSERT INTO ${testTable} (col) VALUES (10)`, + `UPDATE ${testTable} SET col = 15`, + `DELETE FROM ${testTable}` + ], + (error) => { + if (error) { + return test.fail(error); + } + + // Give 1 second to see if any events are emitted, they should not be! + setTimeout(() => { + test.equal(eventLog.length, 0); + test.equal(errorLog.length, 0); + test.end(); + }, 1000); } - - // Give 1 second to see if any events are emitted, they should not be! - setTimeout(() => { - test.equal(eventLog.length, 0); - test.equal(errorLog.length, 0); - test.end(); - }, 1000); - }); + ); }); }); -tap.test('Change filter when ZongJi is running', test => { +tap.test('Change filter when ZongJi is running', (test) => { // Set includeSchema to skip table after the tableMap has already been // cached once, recieve no row events afterwards const testTable = 'after_init_test'; const includeSchema = {}; - includeSchema[settings.connection.database] = [ testTable ]; + includeSchema[settings.connection.database] = [testTable]; const zongji = new ZongJi(settings.connection); const eventLog = []; - zongji.on('binlog', event => eventLog.push(event)); - zongji.on('error', error => test.fail(error)); + zongji.on('binlog', (event) => eventLog.push(event)); + zongji.on('error', (error) => test.fail(error)); zongji.start({ includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], includeSchema: includeSchema }); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); testDb.execute( [ - `DROP TABLE IF EXISTS ${testTable}`, - `CREATE TABLE ${testTable} (col INT UNSIGNED)`, - `INSERT INTO ${testTable} (col) VALUES (10)`, + `DROP TABLE IF EXISTS ${testTable}`, + `CREATE TABLE ${testTable} (col INT UNSIGNED)`, + `INSERT INTO ${testTable} (col) VALUES (10)` ], - err => { + (err) => { if (err) { return test.fail(err); } @@ -155,31 +158,25 @@ tap.test('Change filter when ZongJi is running', test => { setTimeout(() => { test.equal(eventLog.length, 2); - test.test('update filter', test => { + test.test('update filter', (test) => { // reset for next test eventLog.splice(0, eventLog.length); zongji._filters({ includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], - includeSchema: {}, + includeSchema: {} }); - testDb.execute( - [ - `UPDATE ${testTable} SET col = 15`, - `DELETE FROM ${testTable}`, - ], - (error) => { - if (error) { - return test.fail(error); - } - - setTimeout(() => { - test.equal(eventLog.length, 0); - test.end(); - }, 1000); + testDb.execute([`UPDATE ${testTable} SET col = 15`, `DELETE FROM ${testTable}`], (error) => { + if (error) { + return test.fail(error); } - ); + + setTimeout(() => { + test.equal(eventLog.length, 0); + test.end(); + }, 1000); + }); }); test.end(); diff --git a/test/helpers/expectEvents.js b/test/helpers/expectEvents.js index a65069a..125179e 100644 --- a/test/helpers/expectEvents.js +++ b/test/helpers/expectEvents.js @@ -12,19 +12,19 @@ const MAX_WAIT = 3000; // @param {function} callback - Call when done, no arguments (optional) // @param waitIndex - Do not specify, used internally function expectEvents(test, events, expected, multiplier, callback, waitIndex) { - if (events.length < (expected.length * multiplier) && !(waitIndex > 10)) { + if (events.length < expected.length * multiplier && !(waitIndex > 10)) { // Wait for events to appear - setTimeout(function() { + setTimeout(function () { expectEvents(test, events, expected, multiplier, callback, (waitIndex || 0) + 1); }, MAX_WAIT / 10); } else { - test.strictEqual(events.length, expected.length * multiplier); - events.forEach(function(event, index) { + test.equal(events.length, expected.length * multiplier); + events.forEach(function (event, index) { const exp = expected[index % expected.length]; for (const i in exp) { if (Object.prototype.hasOwnProperty.call(exp, i)) { if (i === '_type') { - test.strictEqual(event.getTypeName(), exp[i]); + test.equal(event.getTypeName(), exp[i]); } else if (String(i).substr(0, 1) === '_') { exp[i](test, event); } else { diff --git a/test/helpers/index.js b/test/helpers/index.js index fd1ea62..fff2d30 100644 --- a/test/helpers/index.js +++ b/test/helpers/index.js @@ -7,43 +7,63 @@ const SCHEMA_NAME = settings.connection.database; exports.SCHEMA_NAME = SCHEMA_NAME; -exports.init = function(done) { - const connObj = {...settings.connection}; +exports.init = async function (done) { + const connObj = { ...settings.connection }; // database doesn't exist at this time delete connObj.database; const conn = mysql.createConnection(connObj); + // Syntax for resetting the binlog changed with MySQL 8.4 + const version = await getVersion(); + const cleanupQuery = version >= '8.4' ? 'RESET BINARY LOGS AND GTIDS' : 'RESET MASTER'; + querySequence( conn, [ - 'SET GLOBAL sql_mode = \'' + settings.sessionSqlMode + '\'', + "SET GLOBAL sql_mode = '" + settings.sessionSqlMode + "'", `DROP DATABASE IF EXISTS ${SCHEMA_NAME}`, - `CREATE DATABASE ${SCHEMA_NAME}`, + `CREATE DATABASE IF NOT EXISTS ${SCHEMA_NAME}`, `USE ${SCHEMA_NAME}`, - 'RESET MASTER', + cleanupQuery // 'SELECT VERSION() AS version' ], - error => { + (error) => { conn.destroy(); done(error); } ); }; -exports.execute = function(queries, done) { +exports.execute = function (queries, done) { const conn = mysql.createConnection(settings.connection); - querySequence( - conn, - queries, - (error, result) => { + querySequence(conn, queries, (error, result) => { + conn.destroy(); + done(error, result); + }); +}; + +const getVersion = function () { + const connObj = { ...settings.connection }; + // database doesn't exist at this time + delete connObj.database; + const conn = mysql.createConnection(connObj); + + return new Promise((resolve, reject) => { + querySequence(conn, ['SELECT VERSION() AS version'], (err, results) => { conn.destroy(); - done(error, result); - } - ); + + if (err) { + console.log('Error getting version:', err); + reject(err); + } + + resolve(results[results.length - 1][0].version); + }); + }); }; -const checkVersion = function(expected, actual) { - const parts = expected.split('.').map(part => parseInt(part, 10)); +const checkVersion = function (expected, actual) { + const parts = expected.split('.').map((part) => parseInt(part, 10)); for (let i = 0; i < parts.length; i++) { if (actual[i] == parts[i]) { continue; @@ -53,8 +73,8 @@ const checkVersion = function(expected, actual) { return true; }; -exports.requireVersion = function(expected, done) { - const connObj = {...settings.connection}; +const requireVersion = function (expected, done) { + const connObj = { ...settings.connection }; // database doesn't exist at this time delete connObj.database; const conn = mysql.createConnection(connObj); @@ -65,10 +85,10 @@ exports.requireVersion = function(expected, done) { throw err; } - let ver = results[results.length - 1][0] - .version.split('-')[0] + let ver = results[results.length - 1][0].version + .split('-')[0] .split('.') - .map(part => parseInt(part, 10)); + .map((part) => parseInt(part, 10)); if (checkVersion(expected, ver)) { done(); @@ -76,9 +96,11 @@ exports.requireVersion = function(expected, done) { }); }; +exports.requireVersion = requireVersion; + let id = 100; -exports.serverId = function() { - id ++; +exports.serverId = function () { + id++; return id; }; diff --git a/test/helpers/querySequence.js b/test/helpers/querySequence.js index 9a74825..4622b5f 100644 --- a/test/helpers/querySequence.js +++ b/test/helpers/querySequence.js @@ -3,23 +3,22 @@ // @param {boolean} debug - Print queries as they execute (optional) // @param {[string]} queries - Queries to execute, in order // @param {function} callback - Call when complete -module.exports = function(connection, debug, queries, callback) { +module.exports = function (connection, debug, queries, callback) { if (debug instanceof Array) { callback = queries; queries = debug; debug = false; } const results = []; - const sequence = queries.map(function(queryStr, index) { - return function() { + const sequence = queries.map(function (queryStr, index) { + return function () { debug && console.log('Query Sequence', index, queryStr); - connection.query(queryStr, function(err, rows) { + connection.query(queryStr, function (err, rows) { if (err) callback(err); results.push(rows); if (index < sequence.length - 1) { sequence[index + 1](); - } - else { + } else { callback(null, results); } }); diff --git a/test/rowimage.js b/test/rowimage.js index f325645..5ee67fc 100644 --- a/test/rowimage.js +++ b/test/rowimage.js @@ -5,8 +5,8 @@ const testDb = require('./helpers'); const expectEvents = require('./helpers/expectEvents'); const settings = require('./settings/mysql'); -tap.test('Initialise testing db', test => { - testDb.init(err => { +tap.test('Initialise testing db', (test) => { + testDb.init((err) => { if (err) { return test.threw(err); } @@ -15,66 +15,70 @@ tap.test('Initialise testing db', test => { }); testDb.requireVersion('5.6.2', () => { - - tap.test('Update with binlog_row_image=minmal', test => { + tap.test('Update with binlog_row_image=minmal', (test) => { const TEST_TABLE = 'row_image_minimal_test'; - test.test(`prepare table ${TEST_TABLE}`, test => { - testDb.execute([ - 'SET GLOBAL binlog_row_image=minimal', - `DROP TABLE IF EXISTS ${TEST_TABLE}`, - `CREATE TABLE ${TEST_TABLE} ( + test.test(`prepare table ${TEST_TABLE}`, (test) => { + testDb.execute( + [ + 'SET GLOBAL binlog_row_image=minimal', + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} ( id int primary key auto_increment, name varchar(20), age tinyint, height mediumint )`, - `INSERT INTO ${TEST_TABLE} (name, age) VALUES ('Tom', 2)`, - ], err => { - if (err) { - return test.fail(err); - } + `INSERT INTO ${TEST_TABLE} (name, age) VALUES ('Tom', 2)` + ], + (err) => { + if (err) { + return test.fail(err); + } - test.end(); - }); + test.end(); + } + ); }); - test.test('update a record', test => { + test.test('update a record', (test) => { const events = []; const zongji = new ZongJi(settings.connection); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); zongji.on('ready', () => { - testDb.execute([ - `UPDATE ${TEST_TABLE} SET age=age+1 WHERE id=1`, - ], err => { + testDb.execute([`UPDATE ${TEST_TABLE} SET age=age+1 WHERE id=1`], (err) => { if (err) { test.fail(err); } }); }); - zongji.on('binlog', evt => { + zongji.on('binlog', (evt) => { events.push(evt); if (events.length == 2) { - expectEvents(test, events, + expectEvents( + test, + events, [ { _type: 'TableMap', tableName: TEST_TABLE, - schemaName: testDb.SCHEMA_NAME, + schemaName: testDb.SCHEMA_NAME }, { _type: 'UpdateRows', rows: [ { before: { id: 1, age: null, name: null, height: null }, - after: { id: null, age: 3, name: null, height: null }, - }, - ], + after: { id: null, age: 3, name: null, height: null } + } + ] } - ], 1, () => test.end() + ], + 1, + () => test.end() ); } }); @@ -82,70 +86,75 @@ testDb.requireVersion('5.6.2', () => { zongji.start({ startAtEnd: true, serverId: testDb.serverId(), - includeEvents: ['tablemap', 'updaterows'], + includeEvents: ['tablemap', 'updaterows'] }); }); test.end(); }); - tap.test('Update with binlog_row_image=noblob', test => { + tap.test('Update with binlog_row_image=noblob', (test) => { const TEST_TABLE = 'row_image_noblob_test'; - test.test(`prepare table ${TEST_TABLE}`, test => { - testDb.execute([ - 'SET GLOBAL binlog_row_image=noblob', - `DROP TABLE IF EXISTS ${TEST_TABLE}`, - `CREATE TABLE ${TEST_TABLE} ( + test.test(`prepare table ${TEST_TABLE}`, (test) => { + testDb.execute( + [ + 'SET GLOBAL binlog_row_image=noblob', + `DROP TABLE IF EXISTS ${TEST_TABLE}`, + `CREATE TABLE ${TEST_TABLE} ( id int primary key auto_increment, summary text )`, - `INSERT INTO ${TEST_TABLE} (summary) VALUES ('Hello world')`, - ], err => { - if (err) { - return test.fail(err); - } + `INSERT INTO ${TEST_TABLE} (summary) VALUES ('Hello world')` + ], + (err) => { + if (err) { + return test.fail(err); + } - test.end(); - }); + test.end(); + } + ); }); - test.test('update a record', test => { + test.test('update a record', (test) => { const events = []; const zongji = new ZongJi(settings.connection); - test.tearDown(() => zongji.stop()); + test.teardown(() => zongji.stop()); zongji.on('ready', () => { - testDb.execute([ - `UPDATE ${TEST_TABLE} SET summary='hello again' WHERE id=1`, - ], err => { + testDb.execute([`UPDATE ${TEST_TABLE} SET summary='hello again' WHERE id=1`], (err) => { if (err) { test.fail(err); } }); }); - zongji.on('binlog', evt => { + zongji.on('binlog', (evt) => { events.push(evt); if (events.length == 2) { - expectEvents(test, events, + expectEvents( + test, + events, [ { _type: 'TableMap', tableName: TEST_TABLE, - schemaName: testDb.SCHEMA_NAME, + schemaName: testDb.SCHEMA_NAME }, { _type: 'UpdateRows', rows: [ { before: { id: 1, summary: null }, - after: { id: 1, summary: 'hello again' }, - }, - ], + after: { id: 1, summary: 'hello again' } + } + ] } - ], 1, () => test.end() + ], + 1, + () => test.end() ); } }); @@ -153,7 +162,7 @@ testDb.requireVersion('5.6.2', () => { zongji.start({ startAtEnd: true, serverId: testDb.serverId(), - includeEvents: ['tablemap', 'updaterows'], + includeEvents: ['tablemap', 'updaterows'] }); }); diff --git a/test/settings/mysql.js b/test/settings/mysql.js index e3ef27a..da6a1f3 100644 --- a/test/settings/mysql.js +++ b/test/settings/mysql.js @@ -2,14 +2,15 @@ // Database will be recreated! module.exports = { connection: { - host : process.env.MYSQL_HOST || 'localhost', - user : 'root', - password : 'numtel', - charset : 'utf8mb4_unicode_ci', - port : process.env.TEST_MYSQL_PORT, - dateStrings : process.env.TEST_DATE_STRINGS === 'true', + host: process.env.MYSQL_HOST || 'localhost', + user: 'root', + password: 'my_password', + charset: 'utf8mb4_unicode_ci', + port: process.env.TEST_MYSQL_PORT, + dateStrings: process.env.TEST_DATE_STRINGS === 'true', database: 'zongji_test', + timeZone: 'Z' // debug: true }, - sessionSqlMode: process.env.TEST_SESSION_SQL_MODE || '', + sessionSqlMode: process.env.TEST_SESSION_SQL_MODE || '' }; diff --git a/test/suites.js b/test/suites.js new file mode 100644 index 0000000..d0ffe70 --- /dev/null +++ b/test/suites.js @@ -0,0 +1,29 @@ +const tap = require('tap'); + +// This is a workaround to force the test suites to run sequentially +// Since the suites run off the same test database they do interfere with each other when running in parallel + +tap.test('Errors', (t) => { + require(`./errors`); + t.end(); +}); + +tap.test('Events', (t) => { + require(`./events`); + t.end(); +}); + +tap.test('Filtering', (t) => { + require(`./filtering`); + t.end(); +}); + +tap.test('RowImage', (t) => { + require(`./rowimage`); + t.end(); +}); + +tap.test('Types', (t) => { + require(`./types`); + t.end(); +}); diff --git a/test/travis/runner.sh b/test/travis/runner.sh deleted file mode 100755 index d8fba83..0000000 --- a/test/travis/runner.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -mysqlPorts=( 3355 3356 3357 ) -sqlModes=( ANSI_QUOTES "" ) -dateString=( true false ) -for dateMode in "${dateString[@]}"; do - for mode in "${sqlModes[@]}"; do - for i in "${mysqlPorts[@]}"; do - while ! mysqladmin ping -h127.0.0.1 -P$i --silent; do - echo "$(date) - still trying $i" - sleep 1 - done - echo "$(date) - connected successfully $i" - echo -e "\033[1;35m Running test on port $i using mode '$mode' with dateStrings:$dateMode \033[0m" - TEST_DATE_STRINGS=$dateMode TEST_SESSION_SQL_MODE=$mode TEST_MYSQL_PORT=$i npm test || exit $? - done - done -done diff --git a/test/types.js b/test/types.js index 7f80818..27e6b8b 100644 --- a/test/types.js +++ b/test/types.js @@ -3,8 +3,7 @@ const ZongJi = require('../'); const expectEvents = require('./helpers/expectEvents'); const testDb = require('./helpers'); const settings = require('./settings/mysql'); -const strRepeat = testDb.strRepeat; - +const assert = require('node:assert'); // @param {string} name - unique identifier of this test [a-zA-Z0-9] // @param {[string]} fields - MySQL field description e.g. `BIGINT NULL` @@ -14,66 +13,69 @@ function defineTypeTest(name, fields, testRows, customTest) { const TEST_TABLE = 'type_' + name; const fieldText = fields.map((field, index) => `col${index} ${field}`).join(','); const insertColumns = fields.map((field, index) => 'col' + index).join(','); - const testQueries = [ - `CREATE TABLE ${TEST_TABLE} (${fieldText})`, - 'SET @@session.time_zone = "+00:00"'] + const testQueries = [`CREATE TABLE ${TEST_TABLE} (${fieldText})`] .concat( - testRows.map(row => `INSERT INTO ${TEST_TABLE} + testRows.map( + (row) => `INSERT INTO ${TEST_TABLE} (${insertColumns}) VALUES - (${row.map(field => field === null ? 'null' : field).join(',')})` + (${row.map((field) => (field === null ? 'null' : field)).join(',')})` ) ) - .concat([ - 'SET @@session.time_zone = "SYSTEM"', - `SELECT * FROM ${TEST_TABLE}`, - ]); + .concat(['SET @@session.time_zone = "+00:00"', `SELECT * FROM ${TEST_TABLE}`]); - tap.test('Initialise testing db', test => { - testDb.init(err => { - if (err) { - return test.fail(err); - } + tap.test('Initialise testing db', (test) => { + testDb.init((err) => { + if (err) { + return test.fail(err); + } - test.end(); - }); + test.end(); }); + }); - tap.test(name, test => { - const eventLog = []; - const errorLog = []; + tap.test(name, (test) => { + const eventLog = []; + const errorLog = []; - const zongji = new ZongJi(settings.connection); - test.tearDown(() => zongji.stop()); + const zongji = new ZongJi(settings.connection); + test.teardown(() => zongji.stop()); - zongji.start({ - includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], - serverId: testDb.serverId(), - }); - zongji.on('binlog', event => eventLog.push(event)); - zongji.on('error', error => errorLog.push(error)); - zongji.on('ready', () => { - testDb.execute(testQueries, (error, results) => { - if (error) { - return test.fail(error); + zongji.start({ + includeEvents: ['tablemap', 'writerows', 'updaterows', 'deleterows'], + serverId: testDb.serverId() + }); + zongji.on('binlog', (event) => eventLog.push(event)); + zongji.on('error', (error) => errorLog.push(error)); + zongji.on('ready', () => { + testDb.execute(testQueries, (error, results) => { + if (error) { + return test.fail(error); + } + const selectResult = results[results.length - 1].map((result) => ({ + ...result + })); + const expectedWrite = { + _type: 'WriteRows', + _checkTableMap: (test, event) => { + const tableDetails = event.tableMap[event.tableId]; + test.same(tableDetails.parentSchema, testDb.SCHEMA_NAME); + test.same(tableDetails.tableName, TEST_TABLE); } - const selectResult = results[results.length - 1]; - const expectedWrite = { - _type: 'WriteRows', - _checkTableMap: (test, event) => { - const tableDetails = event.tableMap[event.tableId]; - test.same(tableDetails.parentSchema, testDb.SCHEMA_NAME); - test.same(tableDetails.tableName, TEST_TABLE); - } - }; + }; - expectEvents(test, eventLog, [ + expectEvents( + test, + eventLog, + [ { _type: 'TableMap', tableName: TEST_TABLE, - schemaName: testDb.SCHEMA_NAME, + schemaName: testDb.SCHEMA_NAME }, expectedWrite - ], testRows.length, () => { + ], + testRows.length, + () => { test.equal(errorLog.length, 0); const binlogRows = eventLog.reduce((prev, curr) => { @@ -86,399 +88,208 @@ function defineTypeTest(name, fields, testRows, customTest) { if (customTest) { customTest.bind(selectResult)(test, { rows: binlogRows }); } else { - test.deepEqual(selectResult, binlogRows); + assert.deepEqual(selectResult, binlogRows); } test.end(); - }); - }); + } + ); }); }); + }); } // Begin test case definitions -defineTypeTest('set', [ - 'SET(' + - "'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', " + - "'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', " + - "'a2', 'b2', 'c2', 'd2', 'e2', 'f2', 'g2', 'h2', 'i2', 'j2', 'k2', " + - "'l2', 'm2', 'n2', 'o2', 'p2', 'q2', 'r2', 's2', 't2', 'u2', 'v2', " + - "'w2', 'x2', 'y2', 'z2')", - "SET('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm')" -], [ - ["'a,d'", "'a,d'"], - ["'d,a,b'", "'d,a,b'"], - ["'a,d,i,z2'", "'a,d,i,k,l,m,c'"], - ["'a,j,d'", "'a,j,d'"], - ["'d,a,p'", "'d,a,m'"], - ["''", "''"], - [null, null] -]); - -defineTypeTest('bit', [ - 'BIT(64) NULL', - 'BIT(32) NULL', -], [ - ["b'111'", "b'111'"], - ["b'100000'", "b'100000'"], +defineTypeTest( + 'set', [ - // 64th position - "b'1000000000000000000000000000000000000000000000000000000000000000'", - // 32nd position - "b'10000000000000000000000000000000'" + 'SET(' + + "'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', " + + "'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', " + + "'a2', 'b2', 'c2', 'd2', 'e2', 'f2', 'g2', 'h2', 'i2', 'j2', 'k2', " + + "'l2', 'm2', 'n2', 'o2', 'p2', 'q2', 'r2', 's2', 't2', 'u2', 'v2', " + + "'w2', 'x2', 'y2', 'z2')", + "SET('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm')" ], - [null, null] -]); - -defineTypeTest('enum', [ - 'ENUM(' + - "'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', " + - "'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', " + - "'a2', 'b2', 'c2', 'd2', 'e2', 'f2', 'g2', 'h2', 'i2', 'j2', 'k2', " + - "'l2', 'm2', 'n2', 'o2', 'p2', 'q2', 'r2', 's2', 't2', 'u2', 'v2', " + - "'w2', 'x2', 'y2', 'z2')", - "ENUM('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm')" -], [ - ["'a'", "'b'"], - ["'z2'", "'l'"], - [null, null] -]); - -defineTypeTest('int_signed', [ - 'INT SIGNED NULL', - 'BIGINT SIGNED NULL', - 'TINYINT SIGNED NULL', - 'SMALLINT SIGNED NULL', - 'MEDIUMINT SIGNED NULL' -], [ - [2147483647, 9007199254740992, 127, 32767, 8388607], - [-2147483648, -9007199254740992, -128, -32768, -8388608], - [-2147483645, -9007199254740990, -126, -32766, -8388606], - [-1, -1, -1, -1, -1], - [123456, 100, 96, 300, 1000], - [-123456, -100, -96, -300, -1000] -]); - -defineTypeTest('int_unsigned', [ - 'INT UNSIGNED NULL', - 'BIGINT UNSIGNED NULL', - 'TINYINT UNSIGNED NULL', - 'SMALLINT UNSIGNED NULL', - 'MEDIUMINT UNSIGNED NULL' -], [ - [4294967295, 9007199254740992, 255, 65535, 16777215], - [1, 1, 1, 1, 1], - [1, 8589934591, 1, 1, 1], - [123456, 100, 96, 300, 1000] -]); - -defineTypeTest('double', [ - 'DOUBLE NULL' -], [ - [0], [1.0], [-1.0], [123.456], [-13.47], [0.00005], [-0.00005], - [8589934592.123], [-8589934592.123], [null] -]); - -defineTypeTest('float', [ - 'FLOAT NULL' -], [ - [0], [1.0], [-1.0], [123.456], [-13.47], [3999.12] -], function(test, event) { + [ + ["'a,d'", "'a,d'"], + ["'d,a,b'", "'d,a,b'"], + ["'a,d,i,z2'", "'a,d,i,k,l,m,c'"], + ["'a,j,d'", "'a,j,d'"], + ["'d,a,p'", "'d,a,m'"], + ["''", "''"], + [null, null] + ] +); + +defineTypeTest( + 'bit', + ['BIT(64) NULL', 'BIT(32) NULL'], + [ + ["b'111'", "b'111'"], + ["b'100000'", "b'100000'"], + [ + // 64th position + "b'1000000000000000000000000000000000000000000000000000000000000000'", + // 32nd position + "b'10000000000000000000000000000000'" + ], + [null, null] + ] +); + +defineTypeTest( + 'enum', + [ + 'ENUM(' + + "'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', " + + "'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', " + + "'a2', 'b2', 'c2', 'd2', 'e2', 'f2', 'g2', 'h2', 'i2', 'j2', 'k2', " + + "'l2', 'm2', 'n2', 'o2', 'p2', 'q2', 'r2', 's2', 't2', 'u2', 'v2', " + + "'w2', 'x2', 'y2', 'z2')", + "ENUM('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm')" + ], + [ + ["'a'", "'b'"], + ["'z2'", "'l'"], + [null, null] + ] +); + +defineTypeTest( + 'int_signed', + ['INT SIGNED NULL', 'BIGINT SIGNED NULL', 'TINYINT SIGNED NULL', 'SMALLINT SIGNED NULL', 'MEDIUMINT SIGNED NULL'], + [ + [2147483647, 9007199254740992, 127, 32767, 8388607], + [-2147483648, -9007199254740992, -128, -32768, -8388608], + [-2147483645, -9007199254740990, -126, -32766, -8388606], + [-1, -1, -1, -1, -1], + [123456, 100, 96, 300, 1000], + [-123456, -100, -96, -300, -1000] + ] +); + +defineTypeTest( + 'int_unsigned', + [ + 'INT UNSIGNED NULL', + 'BIGINT UNSIGNED NULL', + 'TINYINT UNSIGNED NULL', + 'SMALLINT UNSIGNED NULL', + 'MEDIUMINT UNSIGNED NULL' + ], + [ + [4294967295, 9007199254740992, 255, 65535, 16777215], + [1, 1, 1, 1, 1], + [1, 8589934591, 1, 1, 1], + [123456, 100, 96, 300, 1000] + ] +); + +defineTypeTest( + 'double', + ['DOUBLE NULL'], + [[0], [1.0], [-1.0], [123.456], [-13.47], [0.00005], [-0.00005], [8589934592.123], [-8589934592.123], [null]] +); + +defineTypeTest('float', ['FLOAT NULL'], [[0], [1.0], [-1.0], [123.456], [-13.47], [3999.12]], function (test, event) { // Ensure sum of differences is very low - const diff = event.rows.reduce(function(prev, cur, index) { - return prev + Math.abs(cur.col0 - this[index].col0); - }.bind(this), 0); + const diff = event.rows.reduce( + function (prev, cur, index) { + return prev + Math.abs(cur.col0 - this[index].col0); + }.bind(this), + 0 + ); test.ok(diff < 0.001); }); -defineTypeTest('decimal', [ - 'DECIMAL(30, 10) NULL', - 'DECIMAL(30, 20) NULL' -], [ - [1.0], [-1.0], [123.456], [-13.47], - [123456789.123], [-123456789.123], [null], - [1447410019.012], [123.00000123], [0.0004321] -].map(function(x) { return [ x[0], x[0] ]; })); - -defineTypeTest('blob', [ - 'BLOB NULL', - 'TINYBLOB NULL', - 'MEDIUMBLOB NULL', - 'LONGBLOB NULL' -], [ - ["'something here'", "'tiny'", "'medium'", "'long'"], - ["'nothing there'", "'small'", "'average'", "'huge'"], - [null, null, null, null] -]); - -defineTypeTest('geometry', [ - 'GEOMETRY', -], [ - ["GeomFromText('POINT(1 1)')"], - ["GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))')"] -]); - -defineTypeTest('time_no_fraction', [ - 'TIME NULL' -], [ - ["'-00:00:01'"], - ["'00:00:00'"], - ["'00:07:00'"], - ["'20:00:00'"], - ["'19:00:00'"], - ["'04:00:00'"], - ["'-838:59:59'"], - ["'838:59:59'"], - ["'01:07:08'"], - ["'01:27:28'"], - ["'-01:07:08'"], - ["'-01:27:28'"], -]); - -defineTypeTest('datetime_no_fraction', [ - 'DATETIME NULL' -], [ - ["'1000-01-01 00:00:00'"], - ["'9999-12-31 23:59:59'"], - ["'2014-12-27 01:07:08'"] -]); - -defineTypeTest('temporal_other', [ - 'DATE NULL', - 'TIMESTAMP NULL', - 'YEAR NULL' -], [ - ["'1000-01-01'", "'1970-01-01 00:00:01'", 1901], - ["'9999-12-31'", "'2038-01-18 03:14:07'", 2155], - ["'2014-12-27'", "'2014-12-27 01:07:08'", 2014] -]); - -defineTypeTest('string', [ - 'VARCHAR(250) NULL', - 'CHAR(20) NULL', - 'BINARY(3) NULL', - 'VARBINARY(10) NULL' -], [ - ["'something here'", "'tiny'", "'a'", "'binary'"], - ["'nothing there'", "'small'", "'b'", "'test123'"], - [null, null, null, null] -]); - -defineTypeTest('text', [ - 'TINYTEXT NULL', - 'MEDIUMTEXT NULL', - 'LONGTEXT NULL', - 'TEXT NULL' -], [ - ["'something here'", "'tiny'", "'a'", "'binary'"], - ["'nothing there'", "'small'", "'b'", "'test123'"], - [null, null, null, null] -]); - -// ======= below require different version of MySQL ======= - -testDb.requireVersion('5.5.3', () => { - defineTypeTest('utf8mb4', [ - 'VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci' - ], [ - ["'á'"], // 3 byte character - ["'𠜎'"], // 4 byte character - ]); -}); - -testDb.requireVersion('5.6.4', () => { - defineTypeTest('time_fraction', [ - 'TIME(0) NULL', - 'TIME(1) NULL', - 'TIME(3) NULL', - 'TIME(6) NULL' - ], [ - ["'-00:00:01'", "'-00:00:01.1'", "'-00:00:01.002'", "'-00:00:01.123456'"], - ["'00:00:00'", "'00:00:00.2'", "'00:00:00.123'", "'-00:00:00.000001'"], - ["'00:07:00'", "'00:07:00.3'", "'00:07:00.654'", "'00:07:00.010203'"], - ["'20:00:00'", "'20:00:00.4'", "'20:00:00.090'", "'20:00:00.987654'"], - ["'19:00:00'", "'19:00:00.5'", "'19:00:00.999'", "'19:00:00.000001'"], - ["'04:00:00'", "'04:00:00.0'", "'04:00:00.01'", "'04:00:00.1'"], - ]); - - defineTypeTest('datetime_fraction', [ - 'DATETIME(0) NULL', - 'DATETIME(1) NULL', - 'DATETIME(4) NULL', - 'DATETIME(6) NULL' - ], [ - ["'1000-01-01 00:00:00'", "'1000-01-01 00:00:00.5'", - "'1000-01-01 00:00:00.9999'", "'1000-01-01 00:00:00.123456'"], - ["'9999-12-31 23:59:59'", "'9999-12-31 23:59:59.9'", - "'9999-12-31 23:59:59.6543'", "'9999-12-31 23:59:59.000001'"], - ["'9999-12-31 23:59:59'", "'9999-12-31 23:59:59.1'", - "'9999-12-31 23:59:59.1234'", "'9999-12-31 23:59:59.4326'" ], - ["'2014-12-27 01:07:08'", "'2014-12-27 01:07:08.0'", - "'2014-12-27 01:07:08.0001'", "'2014-12-27 01:07:08.05'" ] - ]); - - defineTypeTest('timestamp_fractional', [ - 'TIMESTAMP(3) NULL', - ], [ - ["'1970-01-01 00:00:01.123'"], - ["'2038-01-18 03:14:07.900'"], - ["'2014-12-27 01:07:08.001'"], - ]); - - defineTypeTest('datetime_then_decimal', [ - 'DATETIME(3) NULL', - 'DECIMAL(30, 10) NULL' - ], [ - ["'1000-01-01 00:00:00.123'", 10.10], - ["'9999-12-31 23:59:59.001'", -123.45], - ["'2014-12-27 01:07:08.053'", 12345.123] - ]); -}); - -testDb.requireVersion('5.7.8', () => { - defineTypeTest('json', [ - 'JSON NULL' - ], [ - // Small Object - ['\'{"key1": "value1", "key2": "value2", "key3": 34}\''], - // Small Object with nested object - ['\'{"key1": { "key2": "value2", "key3": 34 } }\''], - // Small Object with double nested object - ['\'{"key1": { "key2": { "key2": "value2", "key3": 34 }, "key3": 34 } }\''], - // Small Object with unicode character in key and value - ['\'{ "key2": "válue2", "keybá3": 34 }\''], - // Large Object - ['\'{' + strRepeat('"key##": "value##", ', 2839) + '"keyLast": 34}\''], - // Large Object with nested small objects - ['\'{' + strRepeat('"key##": {"subkey": "value##"}, ', 2000) + '"keyLast": 34}\''], - // Large Object with nested small arrays - ['\'{' + strRepeat('"key##": ["a", ##], ', 3000) + '"keyLast": 34}\''], - // Small array - ['\'["a", "b", 1]\''], - // Small array with nested array - ['\'["a", [2, "b"], 1]\''], - // Small array with double nested array - ['\'["a", [2, ["b", 4, 54]], 1]\''], - // Large Array - ['\'[' + strRepeat('"value##", ', 6000) + '34]\''], - // Large Array with nested small objects - ['\'[' + strRepeat('{"key##": "value##"}, ', 6000) + '34]\''], - // Large Array with nested small arrays - ['\'[' + strRepeat('[##, "value##"], ', 6000) + '34]\''], - // Strings of various lengths - ['\'"hello"\''], - ['\'{"twobytelen": "' + strRepeat('a', 256) + '"}\''], - ['\'{"twobytelen": "' + strRepeat('a', 257) + '"}\''], - ['\'{"twobytelen": "' + strRepeat('a', 258) + '"}\''], - ['\'{"twobytelen": "' + strRepeat('a', 7383) + '"}\''], - ['\'{"twobytelen": "' + strRepeat('a', 16383) + '"}\''], - ['\'{"threebytelen": "' + strRepeat('a', 16388) + '"}\''], - // Integers - ['\'{"key1": -10, "keyb": 34}\''], - ['\'10\''], - ['\'2147483647\''], // Int32 - ['\'-2147483647\''], // Int32 - ['\'2147483648\''], // Int64 - ['\'4294967295\''], // Int64 - ['\'-4294967295\''], // Int64 - ['\'9007199254740992\''], // UInt64 - ['\'-9007199254740992\''], // Int64 - ['\'3e2\''], - ['\'-3e-2\''], - // Doubles - ['\'10.123\''], - ['\'{"doubleval": "-123.38439", "another": 1283192.0004}\''], - // Literals - ['\'{"literaltest1": null, "literal2": true, "literal3": false}\''], - ['\'{"literaltest1": null, "stringafter": "heyos", "number": 35}\''], - ['\'null\''], - ['\'true\''], - ['\'false\''], - // Opaque custom data - ['JSON_OBJECT(\'key\', BINARY \'hi\')'], - ['JSON_OBJECT(\'key\', MAKEDATE(2014,361))'], - ['JSON_OBJECT(\'key\', DATE(\'100-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-01-02\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-01-03\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-02-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'1000-12-31\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2001-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2002-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2003-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2004-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'9999-01-01\'))'], - ['JSON_OBJECT(\'key\', DATE(\'9999-12-31\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2002-02-02\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2002-03-03\'))'], - ['JSON_OBJECT(\'key\', DATE(\'2002-12-12\'))'], - ['JSON_OBJECT(\'key\', MAKETIME(-838,59,59))'], - ['JSON_OBJECT(\'key\', MAKETIME(838,59,59))'], - ['JSON_OBJECT(\'zero\', MAKETIME(0,0,0))'], - ['JSON_OBJECT(\'onehour\', MAKETIME(1,0,0))'], - ['JSON_OBJECT(\'oneminu\', MAKETIME(0,1,0))'], - ['JSON_OBJECT(\'oneseco\', MAKETIME(0,0,1))'], - ['JSON_OBJECT(\'hurnsec\', MAKETIME(1,0,1))'], - ['JSON_OBJECT(\'minnsec\', MAKETIME(0,1,1))'], - ['JSON_OBJECT(\'2minsec\', MAKETIME(0,2,2))'], - ['JSON_OBJECT(\'2min15sec\', MAKETIME(0,2,15))'], - ['JSON_OBJECT(\'2min16sec\', MAKETIME(0,2,16))'], - ['JSON_OBJECT(\'2min32sec\', MAKETIME(0,2,32))'], - ['JSON_OBJECT(\'2min59sec\', MAKETIME(0,2,59))'], - ['JSON_OBJECT(\'key\', MAKETIME(0,59,0))'], - ['JSON_OBJECT(\'key\', MAKETIME(0,0,59))'], - ['JSON_OBJECT(\'key\', MAKETIME(20,15,10))'], - ['JSON_OBJECT(\'key\', MAKETIME(21,15,10))'], - ['JSON_OBJECT(\'key\', MAKETIME(22,15,10))'], - ['JSON_OBJECT(\'oneseco\', MAKETIME(0,0,1.123))'], - ['JSON_OBJECT(\'oneseco\', MAKETIME(0,0,1.000123))'], - ['JSON_OBJECT(\'key\', MAKETIME(-20,00,00))'], - ['JSON_OBJECT(\'-59min\', TIME(\'-00:00:00.003\'))'], - ['JSON_OBJECT(\'-59min\', TIME(\'00:00:00.003\'))'], - ['JSON_OBJECT(\'-59min\', TIME(\'-00:59:59\'))'], - ['JSON_OBJECT(\'-59min\', TIME(\'-00:59:59.0003\'))'], - ['JSON_OBJECT(\'-1hr\', MAKETIME(-1,00,00))'], - ['JSON_OBJECT(\'-2hr\', MAKETIME(-2,00,00))'], - ['JSON_OBJECT(\'-1hr1sec\', MAKETIME(-1,00,1))'], - ['JSON_OBJECT(\'-1hr1sec\', MAKETIME(-1,00,0.1))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27 01:07:08\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27 01:07:08.123\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-27 01:07:08.000456\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-28\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2014-12-29\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2003-12-31 12:00:00\'))'], - ['JSON_OBJECT(\'key\', TIMESTAMP(\'2003-12-31 12:00:00.123\'))'], - ['JSON_OBJECT(\'key\', UNIX_TIMESTAMP(\'2015-11-13 10:20:19.012\'))'], - ], function(test, event) { // caution here , don't use arrow function - // JSON from MySQL client has different whitespace than JSON.stringify - // Therefore, parse and perform deep equality - event.rows.forEach((row, index) => { - // test.deepEqual does not work when comparison objects exceed 65536 bytes - // Perform alternative assertions for these large cases - const expected = JSON.parse(this[index].col0); - const actual = JSON.parse(row.col0); - if (this[index].col0.length > 65536) { - // Large cases are either array or object - if (expected instanceof Array) { - test.strictEqual(expected.length, actual.length); - for (let i = 0; i < expected.length; i++) { - test.deepEqual(expected[i], actual[i]); - } - } else { - const expectedKeys = Object.keys(expected); - const actualKeys = Object.keys(actual); - test.strictEqual(expectedKeys.length, actualKeys.length); - test.deepEqual(expectedKeys, actualKeys); - for (let j = 0; j < expectedKeys.length; j++) { - test.deepEqual(expected[expectedKeys[j]], actual[expectedKeys[j]]); - } - } - } else { - // Comparison objects are smaller than 65536 bytes - test.deepEqual(expected, actual); - } - }); - }); -}); +defineTypeTest( + 'decimal', + ['DECIMAL(30, 10) NULL', 'DECIMAL(30, 20) NULL'], + [ + [1.0], + [-1.0], + [123.456], + [-13.47], + [123456789.123], + [-123456789.123], + [null], + [1447410019.012], + [123.00000123], + [0.0004321] + ].map(function (x) { + return [x[0], x[0]]; + }) +); + +defineTypeTest( + 'blob', + ['BLOB NULL', 'TINYBLOB NULL', 'MEDIUMBLOB NULL', 'LONGBLOB NULL'], + [ + ["'something here'", "'tiny'", "'medium'", "'long'"], + ["'nothing there'", "'small'", "'average'", "'huge'"], + [null, null, null, null] + ] +); + +defineTypeTest( + 'geometry', + ['GEOMETRY'], + [["ST_GeomFromText('POINT(1 1)')"], ["ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))')"]] +); + +defineTypeTest( + 'time_no_fraction', + ['TIME NULL'], + [ + ["'-00:00:01'"], + ["'00:00:00'"], + ["'00:07:00'"], + ["'20:00:00'"], + ["'19:00:00'"], + ["'04:00:00'"], + ["'-838:59:59'"], + ["'838:59:59'"], + ["'01:07:08'"], + ["'01:27:28'"], + ["'-01:07:08'"], + ["'-01:27:28'"] + ] +); + +defineTypeTest( + 'datetime_no_fraction', + ['DATETIME NULL'], + [["'1000-01-01 00:00:00'"], ["'9999-12-31 23:59:59'"], ["'2014-12-27 01:07:08'"]] +); + +defineTypeTest( + 'temporal_other', + ['DATE NULL', 'TIMESTAMP NULL', 'YEAR NULL'], + [ + ["'1000-01-01'", "'1970-01-01 00:00:01'", 1901], + ["'9999-12-31'", "'2038-01-18 03:14:07'", 2155], + ["'2014-12-27'", "'2014-12-27 01:07:08'", 2014] + ] +); + +defineTypeTest( + 'string', + ['VARCHAR(250) NULL', 'CHAR(20) NULL', 'BINARY(3) NULL', 'VARBINARY(10) NULL'], + [ + ["'something here'", "'tiny'", "'a'", "'binary'"], + ["'nothing there'", "'small'", "'b'", "'test123'"], + [null, null, null, null] + ] +); + +defineTypeTest( + 'text', + ['TINYTEXT NULL', 'MEDIUMTEXT NULL', 'LONGTEXT NULL', 'TEXT NULL'], + [ + ["'something here'", "'tiny'", "'a'", "'binary'"], + ["'nothing there'", "'small'", "'b'", "'test123'"], + [null, null, null, null] + ] +);