diff --git a/.circleci/config.yml b/.circleci/config.yml
index e8e1b5e52f..8dfa556f94 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,4 +1,4 @@
-version: 2
+version: 2.1
# A reusable "run" snippet which is ran before each test to setup the
# environment for user-limits, core-dumps, etc.
@@ -96,6 +96,30 @@ build_machine_environment: &build_machine_environment
NUM_GROUPS: 12
RUNNING_AVG_LENGTH: 6
+can_disable_fibers: &can_disable_fibers
+ parameters:
+ fibers:
+ type: boolean
+ default: true
+
+set_fibers_env: &set_fibers_env
+ name: "Disable Fibers"
+ command: |
+ if [ "<< parameters.fibers >>" == "false" ]; then
+ echo "Disabling Fibers"
+ echo 'export DISABLE_FIBERS=1' >> "$BASH_ENV"
+ source "$BASH_ENV"
+ fi
+
+
+# Run tests with Fibers and then without.
+matrix_for_fibers: &matrix_for_fibers
+ matrix:
+ parameters:
+ # If we want to run with Fibers and without, just append false here.
+ fibers: [true]
+
+
jobs:
Get Ready:
<<: *build_machine_environment
@@ -167,6 +191,7 @@ jobs:
path: /tmp/memuse.txt
Isolated Tests:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -175,6 +200,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -209,6 +235,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 0:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -217,6 +244,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -249,6 +277,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 1:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -257,6 +286,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -289,6 +319,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 2:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -297,6 +328,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -329,6 +361,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 3:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -337,6 +370,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -369,6 +403,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 4:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -377,6 +412,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -409,6 +445,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 5:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -417,6 +454,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -449,6 +487,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 6:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -457,6 +496,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -489,6 +529,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 7:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -497,6 +538,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -529,6 +571,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 8:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -537,6 +580,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -569,6 +613,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 9:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -577,6 +622,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -609,6 +655,7 @@ jobs:
path: /tmp/memuse.txt
Test Group 10:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- run:
@@ -617,6 +664,7 @@ jobs:
<<: *run_env_change
- attach_workspace:
at: .
+ - run: *set_fibers_env
- run:
name: "Print environment"
command: printenv
@@ -727,6 +775,7 @@ jobs:
npm test
Clean Up:
+ <<: *can_disable_fibers
<<: *build_machine_environment
steps:
- attach_workspace:
@@ -809,45 +858,58 @@ workflows:
- Docs
- Get Ready
- Isolated Tests:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 0:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 1:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 2:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 3:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 4:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 5:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 6:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 7:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 8:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 9:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 10:
+ <<: *matrix_for_fibers
requires:
- Get Ready
- Test Group 11:
requires:
- Get Ready
- Clean Up:
+ <<: *matrix_for_fibers
requires:
- Isolated Tests
- Test Group 0
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 168b487427..a9624d9ad1 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -10,14 +10,14 @@ jobs:
run:
working-directory: docs/
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
with:
node-version: 12.x
- name: Build the Docs
run: npm ci && npm run build
- name: Deploy to Netlify for preview
- uses: nwtgck/actions-netlify@v1.2.2
+ uses: nwtgck/actions-netlify@v1.2.4
with:
publish-dir: './docs/public/'
production-branch: devel
diff --git a/.github/workflows/guide.yml b/.github/workflows/guide.yml
index 4a8a7f1ce5..124b500ce9 100644
--- a/.github/workflows/guide.yml
+++ b/.github/workflows/guide.yml
@@ -10,14 +10,14 @@ jobs:
run:
working-directory: guide/
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v1
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
with:
node-version: 12.x
- name: Build the Guide
run: npm ci && npm run build
- name: Deploy to Netlify for preview
- uses: nwtgck/actions-netlify@v1.2.2
+ uses: nwtgck/actions-netlify@v1.2.4
with:
publish-dir: './guide/public'
production-branch: devel
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index 88603611be..a9d25b1e47 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -9,10 +9,14 @@ name: Labeler
on:
- pull_request_target
+permissions:
+ contents: read # to determine modified files (actions/labeler)
+ pull-requests: write # to add labels to PRs (actions/labeler)
+
jobs:
label:
runs-on: ubuntu-latest
steps:
- - uses: actions/labeler@v3
+ - uses: actions/labeler@v4
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
diff --git a/.github/workflows/npm-eslint-plugin-meteor.yml b/.github/workflows/npm-eslint-plugin-meteor.yml
index cb283e3c54..b1415fb405 100644
--- a/.github/workflows/npm-eslint-plugin-meteor.yml
+++ b/.github/workflows/npm-eslint-plugin-meteor.yml
@@ -6,6 +6,10 @@ on:
pull_request:
paths:
- "npm-packages/eslint-plugin-meteor/**"
+
+permissions:
+ contents: read # to fetch code (actions/checkout)
+
jobs:
test:
runs-on: ubuntu-latest
@@ -16,9 +20,9 @@ jobs:
matrix:
node-version: [12.x, 14.x]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v2
+ uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: npm
diff --git a/.github/workflows/npm-meteor-babel.yml b/.github/workflows/npm-meteor-babel.yml
index 6a20fb61b2..56ac244b85 100644
--- a/.github/workflows/npm-meteor-babel.yml
+++ b/.github/workflows/npm-meteor-babel.yml
@@ -6,6 +6,10 @@ on:
pull_request:
paths:
- "npm-packages/meteor-babel/**"
+
+permissions:
+ contents: read # to fetch code (actions/checkout)
+
jobs:
test:
runs-on: ubuntu-latest
@@ -16,9 +20,9 @@ jobs:
matrix:
node-version: [12.x, 14.x]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v2
+ uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: npm
diff --git a/.github/workflows/npm-meteor-promise.yml b/.github/workflows/npm-meteor-promise.yml
index 247a5a76c2..484ccd7769 100644
--- a/.github/workflows/npm-meteor-promise.yml
+++ b/.github/workflows/npm-meteor-promise.yml
@@ -6,6 +6,10 @@ on:
pull_request:
paths:
- "npm-packages/meteor-promise/**"
+
+permissions:
+ contents: read # to fetch code (actions/checkout)
+
jobs:
test:
runs-on: ubuntu-latest
@@ -16,9 +20,9 @@ jobs:
matrix:
node-version: [12.x, 14.x]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v2
+ uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: npm
diff --git a/.travis.yml b/.travis.yml
index 2d4a4a74d6..35e4e9f859 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,13 +8,17 @@ cache:
- ".meteor"
- ".babel-cache"
script:
- - export phantom=false
- # to skip Downloading Chromium on every run
- # https://github.com/dfernandez79/puppeteer/blob/main/README.md#q-chromium-gets-downloaded-on-every-npm-ci-run-how-can-i-cache-the-download
- - export PUPPETEER_DOWNLOAD_PATH=~/.npm/chromium
- travis_retry ./packages/test-in-console/run.sh
env:
- - CXX=g++-4.8
+ global:
+ - CXX=g++-4.8
+ - phantom=false
+ - PUPPETEER_DOWNLOAD_PATH=~/.npm/chromium
+ jobs:
+ # We don't want to run the tests without fibers anymore.
+ # - DISABLE_FIBERS=1
+ # Use a different flag, since node would use false as a string.
+ - FIBERS_ENABLED=1
addons:
apt:
sources:
diff --git a/docs/_config.yml b/docs/_config.yml
index 7a70499147..1bd31f0460 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -1,6 +1,7 @@
title: Meteor API Docs
subtitle: API Docs
versions:
+ - '2.9'
- '2.8'
- '2.7'
- '2.6'
diff --git a/docs/history.md b/docs/history.md
index 724ece077c..6a845af21d 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -1,4 +1,205 @@
-## 2.8.1, 2022-11-14
+## v2.9.1, 2022-12-27
+
+### Highlights
+
+* Reverted missing types [PR](https://github.com/meteor/meteor/pull/12366) by [Grubba27](https://github.com/Grubba27).
+* Fix fetch() type declaration [PR](https://github.com/meteor/meteor/pull/12352) by [zarvox](https://github.com/zarvox).
+* update svelte skeleton [PR](https://github.com/meteor/meteor/pull/12350) by [tosinek](https://github.com/tosinek).
+* Bump to node 14.21.2.0 [PR](https://github.com/meteor/meteor/pull/12370) by [Grubba27](https://github.com/Grubba27).
+* resetPassword and verifyEmail to no longer sign in the user automatically [PR](https://github.com/meteor/meteor/pull/12385) by [denihs](https://github.com/denihs).
+* Added missing vue2 declaration for skeletons [PR](https://github.com/meteor/meteor/pull/12396) by [Grubba27](https://github.com/Grubba27) & [mlanning](https://github.com/mlanning).
+
+#### Breaking Changes
+
+* `accounts-password@2.3.3`
+ - The methods `resetPassword` and `verifyEmail` no longer logs the user if they have 2FA enabled. Now, the functions work as before, but instead of automatically logging in the user at the end, an error with the code `2fa-enabled` will be thrown.
+
+
+#### Internal API changes
+
+N/A
+
+#### Migration Steps
+
+N/A
+
+#### Meteor Version Release
+
+* `fetch@0.1.3`:
+ - Updated fetch type definition.
+
+* `meteor@1.10.4`:
+ - Added back meteor type definitions that were removed by mistake in earlier version.
+
+* `accounts-password@2.3.3`
+ - The methods `resetPassword` and `verifyEmail` no longer logs the user if they have 2FA enabled. Now, the functions work as before, but instead of automatically logging in the user at the end, an error with the code `2fa-enabled` will be thrown.
+
+* `Command line`:
+ - Updated Svelte skeleton to now be able to support typescript out of the box and added ``#each`` in links in the skeleton.
+ - Updated node to 14.21.2 changes can be seen [here](https://github.com/nodejs/node/releases/tag/v14.21.2).
+ - Solved [issue](https://github.com/meteor/meteor/issues/12395) that could not allow vue2 apps being created in command line.
+
+#### Special thanks to
+- [@zarvox](https://github.com/zarvox).
+- [@tosinek](https://github.com/tosinek).
+- [@Grubba27](https://github.com/Grubba27).
+- [@denihs](https://github.com/denihs).
+- [@mlanning](https://github.com/mlanning).
+
+For making this great framework even better!
+
+
+## v2.9, 2022-12-12
+
+### Highlights
+
+* TypeScript update to v4.6.4 [PR](https://github.com/meteor/meteor/pull/12204) by [@StorytellerCZ](https://github.com/StorytellerCZ).
+* Create Email.sendAsync method without using Fibers [PR](https://github.com/meteor/meteor/pull/12101)
+ by [edimarlnx](https://github.com/edimarlnx).
+* Create async method CssTools.minifyCssAsync [PR](https://github.com/meteor/meteor/pull/12105)
+ by [edimarlnx](https://github.com/edimarlnx).
+* Change Accounts and Oauth to use Async methods [PR](https://github.com/meteor/meteor/pull/12156)
+ by [edimarlnx](https://github.com/edimarlnx).
+* TinyTest package without Future [PR](https://github.com/meteor/meteor/pull/12222)
+ by [matheusccastroo](https://github.com/matheusccastroo).
+* Feat: user accounts base async [PR](https://github.com/meteor/meteor/pull/12274)
+ by [Grubba27](https://github.com/Grubba27).
+* Move somed methods from OAuth of out of accounts-base [PR](https://github.com/meteor/meteor/pull/12202)
+ by [StorytellerCZ](https://github.com/StorytellerCZ).
+* Feat: not using insecure & autopublish [PR](https://github.com/meteor/meteor/pull/12220)
+ by [Grubba27](https://github.com/Grubba27).
+* Don't apply babel async-await plugin when not running on Fibers [PR](https://github.com/meteor/meteor/pull/12221).
+ by [matheusccastroo](https://github.com/matheusccastroo).
+* Implemented Fibers-less MongoDB count methods [PR](https://github.com/meteor/meteor/pull/12295)
+ by [radekmie](https://github.com/radekmie).
+* Feat: Generate scaffold in cli [PR](https://github.com/meteor/meteor/pull/12298)
+ by [Grubba27](https://github.com/Grubba27).
+* Update types [PR](https://github.com/meteor/meteor/pull/12306) by [piotrpospiech](https://github.com/piotrpospiech).
+* Remove underscore from package-version-parser [PR](https://github.com/meteor/meteor/pull/12248)
+ by [harryadel](https://github.com/harryadel).
+* Update MongoDB driver version [PR](https://github.com/meteor/meteor/pull/12333) by [Grubba27](https://github.com/Grubba27).
+* New Vue3 Skeleton [PR](https://github.com/meteor/meteor/pull/12302)
+ by [henriquealbert](https://github.com/henriquealbert).
+
+#### Breaking Changes
+* `Accounts.createUserVerifyingEmail` is now async
+
+#### Internal API changes
+* Internal methods from `OAuth` that are now async:
+ - _attemptLogin
+ - _loginMethod
+ - _runLoginHandlers
+ - OAuth.registerService now accepts async functions
+
+OAuth related code has been moved from `accounts-base` to `accounts-oauth`, removing the dependency on `service-configuration`
+more can be seen in this [discussion](https://github.com/meteor/meteor/discussions/12171) and in the [PR](https://github.com/meteor/meteor/pull/12202).
+This means that if you don’t use third-party login on your project, you don’t need to add the package service-configuration anymore.
+
+#### Migration Steps
+
+You can follow in [here](https://guide.meteor.com/2.9-migration.html).
+
+#### Meteor Version Release
+
+* `eslint-plugin-meteor@7.4.0`:
+ - updated Typescript deps and meteor babel.
+* `eslint-plugin-meteor@7.4.0`:
+ - updated Typescript deps and meteor babel.
+* `accounts-base@2.2.6`
+ - Moved some functions to accounts-oauth.
+* `accounts-oauth@1.4.2`
+ - Received functions from accounts-base.
+* `accounts-password@2.3.2`
+ - Asyncfied functions such as `changePassword`, `forgotPassword`, `resetPassword`, `verifyEmail`, `setPasswordAsync`.
+* `babel-compiler@7.10.1`
+ - Updated babel to 7.17.1.
+* `email@2.2.3`
+ - Create Email.sendAsync method without using Fibers.
+* `facebook-oauth@1.11.2`
+ - Updated facebook-oauth to use async functions.
+* `github-oauth@1.4.1`
+ - Updated github-oauth to use async functions.
+* `google-oauth@1.4.3`
+ - Updated google-oauth to use async functions.
+* `meetup-oauth@1.1.2`
+ - Updated meetup-oauth to use async functions.
+* `meteor-developer-oauth@1.3.2`
+ - Updated meteor-developer-oauth to use async functions.
+* `meteor@1.10.3`
+ - Added Async Local Storage helpers.
+* `minifier-css@1.6.2`
+ - Asyncfied `minifyCss` function.
+* `minimongo@1.9.1`
+ - Implemented Fibers-less MongoDB count methods.
+* `mongo@1.16.2`
+ - Implemented Fibers-less MongoDB count methods.
+* `npm-mongo@4.12.1`
+ - Updated npm-mongo to 4.12.
+* `oauth@2.1.3`
+ - Asyncfied methods.
+* `oauth1@1.5.1`
+ - Asyncfied methods.
+* `oauth2@1.3.2`
+ - Asyncfied methods.
+* `package-version-parser@3.2.1`
+ - Removed underscore.
+* `promise@0.12.2`
+ - Added DISABLE_FIBERS flag.
+* `standard-minifier-css@1.8.3`
+ - Asyncfied minify method.
+* `test-helpers@1.3.1`
+ - added runAndThrowIfNeeded function.
+* `test-in-browser@1.3.2`
+ - Adjusted e[type] to e.type
+* `tinytest@1.2.2`
+ - TinyTest package without Future.
+* `twitter-oauth@1.3.2`
+ - Asyncfied methods.
+* `typescript@4.6.4`
+ - updated typescript to 4.6.4.
+* `weibo-oauth@1.3.2`
+ - Asyncfied methods.
+
+#### Special thanks to
+- [@henriquealbert](https://github.com/henriquealbert);
+- [@edimarlnx](https://github.com/edimarlnx);
+- [@matheusccastroo](https://github.com/matheusccastroo);
+- [@Grubba27](https://github.com/Grubba27);
+- [@StorytellerCZ](https://github.com/StorytellerCZ);
+- [@radekmie](https://github.com/radekmie);
+- [@piotrpospiech](https://github.com/piotrpospiech);
+- [@harryadel](https://github.com/harryadel);
+
+For making this great framework even better!
+
+
+## v2.8.2, 2022-11-29
+
+#### Highlights
+* `mongo@1.16.2`:
+ - Make count NOT create a cursor. [PR](https://github.com/meteor/meteor/pull/12326).
+* `meteorjs/babel@7.16.1-beta.0`
+ - Adjusted config to Auto import React on jsx,tsx files [PR](https://github.com/meteor/meteor/pull/12327).
+ - needs to use directly from npm the meteorjs/babel@7.16.1-beta.0.
+
+#### Breaking Changes
+N/A
+
+#### Migration Steps
+
+#### Meteor Version Release
+* `mongo@1.16.2`:
+ - Make count NOT create a cursor. [PR](https://github.com/meteor/meteor/pull/12326).
+
+#### Special thanks to
+- [@henriquealbert](https://github.com/henriquealbert);
+- [@znewsham](https://github.com/znewsham);
+
+For making this great framework even better!
+
+
+
+## v2.8.1, 2022-11-14
#### Highlights
@@ -104,7 +305,7 @@ _In case you want types in your app using the core packages types/zodern:types (
* `test-in-browser@1.3.1`
- removed underscore.
* `tracker@1.2.1`
- - added types for package.
+- added types for package.
* `twitter-oauth@1.3.1`
- removed underscore.
* `underscore@1.0.11`
@@ -113,7 +314,6 @@ _In case you want types in your app using the core packages types/zodern:types (
- added types for package.
* `webapp-hashing@1.1.1`
- added types for package.
-
## v2.8, 2022-10-19
#### Highlights
@@ -156,7 +356,16 @@ Read our [Migration Guide](https://guide.meteor.com/2.8-migration.html) for this
- Validates required Node.js version. [PR](https://github.com/meteor/meteor/pull/12066).
* `npm-mongo@4.9.0`:
- Updated MongoDB driver to 4.9. [PR](https://github.com/meteor/meteor/pull/12163).
-
+* `@meteorjs/babel@7.17.0`
+ - Upgrade TypeScript to `4.6.4`
+* `babel-compiler@7.10.0`
+ - Upgrade TypeScript to `4.6.4`
+* `ecmascript@0.16.3`
+ - Upgrade TypeScript to `4.6.4`
+* `typescript@4.6.4`
+ - Upgrade TypeScript to `4.6.4`
+* `eslint-plugin-meteor@7.4.0`
+ - Upgrade TypeScript to `4.6.4`
#### Independent Releases
* `accounts-passwordless@2.1.3`:
diff --git a/docs/source/api/email.md b/docs/source/api/email.md
index 77ea6edf24..95ef8d6578 100644
--- a/docs/source/api/email.md
+++ b/docs/source/api/email.md
@@ -82,6 +82,28 @@ Meteor.call(
'This is a test of Email.send.'
);
```
+{% apibox "Email.sendAsync" %}
+
+`sendAsync` only works on the server. It has the same behavior as `Email.send`, but returns a Promise.
+If you defined `Email.customTransport`, the `callAsync` method returns the return value from the `customTransport` method or a Promise, if this method is async.
+
+```js
+// Server: Define a method that the client can call.
+Meteor.methods({
+ sendEmail(to, from, subject, text) {
+ // Make sure that all arguments are strings.
+ check([to, from, subject, text], [String]);
+
+ // Let other method calls from the same client start running, without
+ // waiting for the email sending to complete.
+ this.unblock();
+
+ return Email.sendAsync({ to, from, subject, text }).catch(err => {
+ //
+ });
+ }
+});
+```
{% apibox "Email.hookSend" %}
diff --git a/docs/source/api/passwords.md b/docs/source/api/passwords.md
index 49bcff2e6d..a1967e174e 100644
--- a/docs/source/api/passwords.md
+++ b/docs/source/api/passwords.md
@@ -59,6 +59,10 @@ email with a link the user can use to verify their email address.
{% apibox "Accounts.verifyEmail" %}
+If the user trying to verify the email has 2FA enabled, this error will be thrown:
+* "Email verified, but user not logged in because 2FA is enabled [2fa-enabled]": No longer signing in the user automatically if the user has 2FA enabled.
+
+
This function accepts tokens passed into the callback registered with
[`Accounts.onEmailVerificationLink`](#Accounts-onEmailVerificationLink).
@@ -89,6 +93,9 @@ This function accepts tokens passed into the callbacks registered with
[`AccountsClient#onResetPasswordLink`](#Accounts-onResetPasswordLink) and
[`Accounts.onEnrollmentLink`](#Accounts-onEnrollmentLink).
+If the user trying to reset the password has 2FA enabled, this error will be thrown:
+* "Changed password, but user not logged in because 2FA is enabled [2fa-enabled]": No longer signing in the user automatically if the user has 2FA enabled.
+
{% apibox "Accounts.setPassword" %}
{% apibox "Accounts.sendResetPasswordEmail" %}
diff --git a/docs/source/commandline.md b/docs/source/commandline.md
index ae79273d84..0fec5f634d 100644
--- a/docs/source/commandline.md
+++ b/docs/source/commandline.md
@@ -91,6 +91,16 @@ You can pass an absolute or relative path.
**Flags for default packages**
+`--prototype`
+
+Creates a package with the prototype purpose packages(`autopublish` and `insecure`)
+if you use them you can change your collections quickly,
+but it is not supposed to be used in production.
+For more information about security you can check
+it [here](https://guide.meteor.com/security.html#checklist)
+It can be used together with other flags that create apps such as `--react` or `--typescript`.
+
+
`--bare`
Creates a basic, blaze project.
@@ -129,7 +139,19 @@ Create a basic [Blaze](https://blazejs.org/) app.
`--vue`
-Create a basic vue-based app. See the [Vue guide](https://guide.meteor.com/vue.html)
+Create a basic [Vue 3](https://vuejs.org/) app.
+
+`--react`
+
+Create a basic react app. See the section on [React tutorial](https://guide.meteor.com/react.html#react-tutorial)
+for more information. This is the default.
+
+`--angular`
+for more information.
+
+`--vue-2`
+
+Create a basic vue2-based app. See the [Vue guide](https://vue-tutorial.meteor.com/)
for more information.
`--svelte`
@@ -146,43 +168,354 @@ Create a basic [React](https://reactjs.org) + [Chakra-UI](https://chakra-ui.com/
`--solid`
-Create a basic [solid](https://www.solidjs.com/) app.
+Create a basic [Solid](https://www.solidjs.com/) app.
**Packages**
-| | Default (`--react`) | `--bare` | `--full` | `--minimal` | `--blaze` | `--apollo` | `--vue` | `--svelte` | `--tailwind` | `--chakra-ui` | `--solid` |
-|------------------------------------------------------------------------------------------------------|:-------------------:|:--------:|:--------:|:-----------:|:---------:|:----------:|:-------:|:----------:|:------------:|:-------------:|:---------:|
-| [autopublish](https://atmospherejs.com/meteor/autopublish) | X | | | | X | | | X | X | X | X |
-| [akryum:vue-component](https://atmospherejs.com/akryum/vue-component) | | | | | | | X | | | | |
-| [apollo](https://atmospherejs.com/meteor/apollo) | | | | | | X | | | | | |
-| [blaze-html-templates](https://atmospherejs.com/meteor/blaze-html-templates) | | | X | | X | | | | | | |
-| [ecmascript](https://atmospherejs.com/meteor/ecmascript) | X | X | X | X | X | X | X | X | X | X | X |
-| [es5-shim](https://atmospherejs.com/meteor/es5-shim) | X | X | X | X | X | X | X | X | X | X | X |
-| [hot-module-replacement](https://atmospherejs.com/meteor/hot-module-replacement) | X | | | | X | X | | | X | X | X |
-| [insecure](https://atmospherejs.com/meteor/insecure) | X | | | | X | | | X | X | X | X |
-| [johanbrook:publication-collector](https://atmospherejs.com/meteor/johanbrook/publication-collector) | | | X | | | X | | | | | |
-| [jquery](https://atmospherejs.com/meteor/jquery) | | | X | | X | | | | | | |
-| [ostrio:flow-router-extra](https://atmospherejs.com/meteor/ostrio/flow-router-extra) | | | X | | | | | | | | |
-| [less](https://atmospherejs.com/meteor/less) | | | X | | | | | | | | |
-| [meteor](https://atmospherejs.com/meteor/meteor) | | | | X | | | | | | | |
-| [meteor-base](https://atmospherejs.com/meteor/meteor-base) | X | X | X | | X | X | X | X | X | X | X |
-| [mobile-experience](https://atmospherejs.com/meteor/mobile-experience) | X | X | X | | X | X | X | X | X | X | X |
-| [mongo](https://atmospherejs.com/meteor/mongo) | X | X | X | | X | X | X | X | X | X | X |
-| [meteortesting:mocha](https://atmospherejs.com/meteortesting/mocha) | | | X | | | | X | | | | |
-| [reactive-var](https://atmospherejs.com/meteor/reactive-var) | X | X | X | | X | X | X | X | X | X | X |
-| [rdb:svelte-meteor-data](https://atmospherejs.com/rdb/svelte-meteor-data) | | | | | | | | X | | | |
-| [server-render](https://atmospherejs.com/meteor/server-render) | | | | X | | X | X | | | | |
-| [shell-server](https://atmospherejs.com/meteor/shell-server) | | X | | X | X | X | X | X | X | X | X |
-| [standard-minifier-css](https://atmospherejs.com/meteor/standard-minifier-css) | X | X | X | X | X | X | X | X | X | X | X |
-| [standard-minifier-js](https://atmospherejs.com/meteor/standard-minifier-js) | X | X | X | X | X | X | X | X | X | X | X |
-| [static-html](https://atmospherejs.com/meteor/static-html) | | X | | X | | X | X | X | | | |
-| [svelte:compiler](https://atmospherejs.com/svelte/compiler) | | | | | | | | X | | | |
-| [swydo:graphql](https://atmospherejs.com/swydo/graphql) | | | | | | X | | | | | |
-| [tailwindcss](https://tailwindcss.com) | | X | X | | X | | X | | X | | |
-| [tracker](https://atmospherejs.com/meteor/tracker) | | X | X | | X | | X | | | | |
-| [typescript](https://atmospherejs.com/meteor/typescript) | X | X | X | X | X | X | X | X | X | X | X |
-| [webapp](https://atmospherejs.com/meteor/webapp) | | | | X | | | | | | | |
-| [react-meteor-data](https://atmospherejs.com/meteor/react-meteor-data) | X | | | | | | | | X | X | |
+| | Default (`--react`) | `--bare` | `--full` | `--minimal` | `--blaze` | `--apollo` | `--vue-2` | `--svelte` | `--tailwind` | `--chakra-ui` | `--solid` | `--vue` |
+|------------------------------------------------------------------------------------------------------|:-------------------:|:--------:|:--------:|:-----------:|:---------:|:----------:|:---------:|:----------:|:------------:|:-------------:|:---------:|:-------:|
+| [autopublish](https://atmospherejs.com/meteor/autopublish) | X | | | | X | | | | X | X | X | |
+| [akryum:vue-component](https://atmospherejs.com/akryum/vue-component) | | | | | | | X | | | | | |
+| [apollo](https://atmospherejs.com/meteor/apollo) | | | | | | X | | | | | | |
+| [blaze-html-templates](https://atmospherejs.com/meteor/blaze-html-templates) | | | X | | X | | | | | | | |
+| [ecmascript](https://atmospherejs.com/meteor/ecmascript) | X | X | X | X | X | X | X | X | X | X | X | X |
+| [es5-shim](https://atmospherejs.com/meteor/es5-shim) | X | X | X | X | X | X | X | X | X | X | X | X |
+| [hot-module-replacement](https://atmospherejs.com/meteor/hot-module-replacement) | X | | | | X | X | | X | X | X | X | X |
+| [insecure](https://atmospherejs.com/meteor/insecure) | X | | | | X | | | | X | X | X | X |
+| [johanbrook:publication-collector](https://atmospherejs.com/meteor/johanbrook/publication-collector) | | | X | | | X | | | | | | |
+| [jquery](https://atmospherejs.com/meteor/jquery) | | | X | | X | | | | | | | |
+| [less](https://atmospherejs.com/meteor/less) | | | X | | | | | | | | | |
+| [meteor](https://atmospherejs.com/meteor/meteor) | | | | X | | | | | | | | |
+| [meteor-base](https://atmospherejs.com/meteor/meteor-base) | X | X | X | | X | X | X | X | X | X | X | X |
+| [mobile-experience](https://atmospherejs.com/meteor/mobile-experience) | X | X | X | | X | X | X | X | X | X | X | X |
+| [mongo](https://atmospherejs.com/meteor/mongo) | X | X | X | | X | X | X | X | X | X | X | X |
+| [meteortesting:mocha](https://atmospherejs.com/meteortesting/mocha) | | | X | | | | X | | | | | |
+| [ostrio:flow-router-extra](https://atmospherejs.com/meteor/ostrio/flow-router-extra) | | | X | | | | | | | | | |
+| [react-meteor-data](https://atmospherejs.com/meteor/react-meteor-data) | X | | | | | | | | X | X | | |
+| [reactive-var](https://atmospherejs.com/meteor/reactive-var) | X | X | X | | X | X | X | | X | X | X | X |
+| [server-render](https://atmospherejs.com/meteor/server-render) | | | | X | | X | X | | | | | |
+| [shell-server](https://atmospherejs.com/meteor/shell-server) | | X | | X | X | X | X | X | X | X | X | X |
+| [standard-minifier-css](https://atmospherejs.com/meteor/standard-minifier-css) | X | X | X | X | X | X | X | X | X | X | X | X |
+| [standard-minifier-js](https://atmospherejs.com/meteor/standard-minifier-js) | X | X | X | X | X | X | X | X | X | X | X | X |
+| [static-html](https://atmospherejs.com/meteor/static-html) | | X | | X | | X | X | X | | | | |
+| [swydo:graphql](https://atmospherejs.com/swydo/graphql) | | | | | | X | | | | | | |
+| [tailwindcss](https://tailwindcss.com) | | X | X | | X | | X | | X | | | |
+| [tracker](https://atmospherejs.com/meteor/tracker) | | X | X | | X | | X | | | | | |
+| [typescript](https://atmospherejs.com/meteor/typescript) | X | X | X | X | X | X | X | X | X | X | X | |
+| [vite:bundler](https://atmospherejs.com/vite/bundler) | | | | | | | | | | | X | X |
+| [webapp](https://atmospherejs.com/meteor/webapp) | | | | X | | | | | | | | |
+| [zodern:melte](https://atmospherejs.com/zodern/melte) | | | | | | | | X | | | | |
+| [zodern:types](https://atmospherejs.com/zodern/types) | | | | | | | | X | | | | |
+
+
meteor generate
+
+``meteor generate`` is a command for generating scaffolds for your current project. When ran without arguments, it will ask
+you what is the name of the model you want to generate, if you do want methods for your api and publications. It can be
+used as a command line only operation as well.
+
+> _Important to note:_
+> By default, the generator will use JavaScript but if it detects that you have a
+``tsconfig.json`` file in your project, it will use TypeScript instead.
+
+running
+```bash
+meteor generate customer
+
+```
+
+It will generate the following code in ``/imports/api``
+
+
+That will have the following code:
+
+
+collection.js
+
+```js
+
+ import { Mongo } from 'meteor/mongo';
+
+export const CustomerCollection = new Mongo.Collection('customer');
+
+```
+
+
+
+methods.js
+
+```js
+import { Meteor } from 'meteor/meteor';
+import { check } from 'meteor/check';
+import { CustomerCollection } from './collection';
+
+export async function create(data) {
+ return CustomerCollection.insertAsync({ ...data });
+}
+
+export async function update(_id, data) {
+ check(_id, String);
+ return CustomerCollection.updateAsync(_id, { ...data });
+}
+
+export async function remove(_id) {
+ check(_id, String);
+ return CustomerCollection.removeAsync(_id);
+}
+
+export async function findById(_id) {
+ check(_id, String);
+ return CustomerCollection.findOneAsync(_id);
+}
+
+Meteor.methods({
+ 'Customer.create': create,
+ 'Customer.update': update,
+ 'Customer.remove': remove,
+ 'Customer.find': findById
+});
+
+```
+
+
+
+publication.js
+
+```js
+
+import { Meteor } from 'meteor/meteor';
+import { CustomerCollection } from './collection';
+
+Meteor.publish('allCustomers', function publishCustomers() {
+ return CustomerCollection.find({});
+});
+
+
+```
+
+
+
+
+index.js
+
+```js
+
+export * from './collection';
+export * from './methods';
+export * from './publications';
+
+```
+
+Also, there is the same version of these methods using TypeScript, that will be shown bellow.
+
+path option
+
+If you want to create in another path, you can use the ``--path`` option in order to select where to place this boilerplate.
+It will generate the model in that path. Note that is used TypeScript in this example.
+
+```bash
+
+meteor generate another-customer --path=server/admin
+
+```
+
+It will generate in ``server/admin`` the another-client code:
+
+
+
+
+collection.ts
+
+```typescript
+
+import { Mongo } from 'meteor/mongo';
+
+export type AnotherCustomer = {
+ _id?: string;
+ name: string;
+ createdAt: Date;
+}
+
+export const AnotherCustomerCollection = new Mongo.Collection('another-customer');
+
+```
+
+methods.ts
+
+```typescript
+
+import { Meteor } from 'meteor/meteor';
+import { Mongo } from 'meteor/mongo';
+import { check } from 'meteor/check';
+import { AnotherCustomer, AnotherCustomerCollection } from './collection';
+
+export async function create(data: AnotherCustomer) {
+ return AnotherCustomerCollection.insertAsync({ ...data });
+}
+
+export async function update(_id: string, data: Mongo.Modifier) {
+ check(_id, String);
+ return AnotherCustomerCollection.updateAsync(_id, { ...data });
+}
+
+export async function remove(_id: string) {
+ check(_id, String);
+ return AnotherCustomerCollection.removeAsync(_id);
+}
+
+export async function findById(_id: string) {
+ check(_id, String);
+ return AnotherCustomerCollection.findOneAsync(_id);
+}
+
+Meteor.methods({
+ 'AnotherCustomer.create': create,
+ 'AnotherCustomer.update': update,
+ 'AnotherCustomer.remove': remove,
+ 'AnotherCustomer.find': findById
+});
+
+
+```
+
+
+
+publications.ts
+
+```typescript
+
+import { Meteor } from 'meteor/meteor';
+import { AnotherCustomerCollection } from './collection';
+
+Meteor.publish('allAnotherCustomers', function publishAnotherCustomers() {
+ return AnotherCustomerCollection.find({});
+});
+
+```
+
+
+
+index.ts
+
+```typescript
+
+export * from './collection';
+export * from './methods';
+export * from './publications';
+
+```
+
+
+
+---
+
+
+ Using the Wizard
+
+
+If you run the following command:
+
+```bash
+meteor generate
+```
+
+It will prompt the following questions.
+
+
+
+
+
+
+---
+
+ Using your own template
+
+`--templatePath`
+
+```bash
+meteor generate feed --templatePath=/scaffolds-ts
+```
+
+
+> Note that this is not a CLI framework inside meteor but just giving some solutions for really common problems out of the box.
+> Check out Yargs, Inquirer or Commander for more information about CLI frameworks.
+
+
+You can use your own templates for scaffolding your specific workloads. To do that, you should pass in a template directory URL so that it can copy it with its changes.
+
+ How to rename things?
+
+Out of the box is provided a few functions such as replacing ``$$name$$``, ``$$PascalName$$`` and ``$$camelName$$``
+
+these replacements come from this function:
+
+_Note that scaffoldName is the name that you have passed as argument_
+
+```js
+const transformName = (name) => {
+ return name.replace(/\$\$name\$\$|\$\$PascalName\$\$|\$\$camelName\$\$/g, function (substring, args) {
+ if (substring === '$$name$$') return scaffoldName;
+ if (substring === '$$PascalName$$') return toPascalCase(scaffoldName);
+ if (substring === '$$camelName$$') return toCamelCase(scaffoldName);
+ })
+ }
+```
+
+ How to bring your own templates?
+
+`--replaceFn`
+
+There is an option called ``--replaceFn`` that when you pass in given a .js file with two functions it will override all templating that we have defaulted to use your given function.
+_example of a replacer file_
+```js
+export function transformFilename(scaffoldName, filename) {
+ console.log(scaffoldName, filename);
+ return filename
+}
+
+export function transformContents(scaffoldName, contents, fileName) {
+ console.log(fileName, contents);
+ return contents
+}
+
+```
+If you run your command like this:
+
+```bash
+ meteor generate feed --replaceFn=/fn/replace.js
+```
+It will generate files full of ``$$PascalCase$$``using the meteor provided templates.
+
+A better example of this feature would be the following js file:
+```js
+const toPascalCase = (str) => {
+ if(!str.includes('-')) return str.charAt(0).toUpperCase() + str.slice(1);
+ else return str.split('-').map(toPascalCase).join('');
+}
+const toCamelCase = (str) => {
+ if(!str.includes('-')) return str.charAt(0).toLowerCase() + str.slice(1);
+ else return str.split('-').map(toPascalCase).join('');
+}
+
+const transformName = (scaffoldName, str) => {
+ return str.replace(/\$\$name\$\$|\$\$PascalName\$\$|\$\$camelName\$\$/g, function (substring, args) {
+ if (substring === '$$name$$') return scaffoldName;
+ if (substring === '$$PascalName$$') return toPascalCase(scaffoldName);
+ if (substring === '$$camelName$$') return toCamelCase(scaffoldName);
+ })
+
+}
+
+export function transformFilename(scaffoldName, filename) {
+ return transformName(scaffoldName, filename);
+}
+
+export function transformContents(scaffoldName, contents, fileName) {
+ return transformName(scaffoldName, contents);
+}
+```
+
+
+
meteor login / logout
@@ -593,7 +926,7 @@ from npm to your `node_modules` directory and save its usage in your
Using the `meteor npm ...` commands in place of traditional `npm ...` commands
is particularly important when using Node.js modules that have binary
dependencies that make native C calls (like [`bcrypt`](https://www.npmjs.com/package/bcrypt))
-because doing so ensures that they are built using the same libaries.
+because doing so ensures that they are built using the same libraries.
Additionally, this access to the npm that comes with Meteor avoids the need to
download and install npm separately.
@@ -604,8 +937,8 @@ The `meteor node` command calls the
[`node`](https://nodejs.org) version bundled with Meteor itself.
> This is not to be confused with [`meteor shell`](#meteorshell), which provides
-an almost identical experience but also gives you access to the "server" context
-of a Meteor application. Typically, `meteor shell` will be preferred.
+> an almost identical experience but also gives you access to the "server" context
+> of a Meteor application. Typically, `meteor shell` will be preferred.
Additional parameters can be passed in the same way as the `node` command, and
the [Node.js documentation](https://nodejs.org/dist/latest-v4.x/docs/api/cli.html)
diff --git a/guide/_config.yml b/guide/_config.yml
index 7a99eb70f2..a28b565f8f 100644
--- a/guide/_config.yml
+++ b/guide/_config.yml
@@ -5,6 +5,7 @@ edit_branch: 'devel'
edit_path: 'guide'
content_root: 'content'
versions:
+ - '2.9'
- '2.8'
- '2.7'
- '2.6'
@@ -37,7 +38,7 @@ sidebar_categories:
- index
- code-style
- structure
- - 2.8-migration
+ - 2.9-migration
Data:
- collections
- data-loading
diff --git a/guide/source/2.8-migration.md b/guide/source/2.8-migration.md
index 1e1ccb4a8b..8d89edf12f 100644
--- a/guide/source/2.8-migration.md
+++ b/guide/source/2.8-migration.md
@@ -157,7 +157,7 @@ As `callAsync` returns a promise, it'll be solved in the future. So you need to
It's also important to understand what will happen if you call an async method with `Meteor.call`, and vice versa.
-If you can an async method with `Meteor.call` in the client, and you don't have the package `insecure` on your project, an error like this will be thrown:
+If you call an async method with `Meteor.call` in the client, and you don't have the package `insecure` on your project, an error like this will be thrown:
diff --git a/guide/source/2.9-migration.md b/guide/source/2.9-migration.md
new file mode 100644
index 0000000000..0ea83e0730
--- /dev/null
+++ b/guide/source/2.9-migration.md
@@ -0,0 +1,139 @@
+---
+title: Migrating to Meteor 2.9
+description: How to migrate your application to Meteor 2.9.
+---
+
+Meteor `2.9` introduces some changes in the `accounts` packages, the new method `Email.sendAsync`, the new method `Meteor.userAsync`, and more. For a complete breakdown of the changes, please refer to the [changelog](http://docs.meteor.com/changelog.html).
+
+
+Why is this new API important?
+
+You may know that on Meteor we use a package called [Fibers](https://github.com/laverdet/node-fibers). This package is what makes it possible to call an async function inside Meteor in a sync way (without having to wait for the promise to resolve).
+
+But starting from Node 16, Fibers will stop working, so Meteor needs to move away from Fibers, otherwise, we'll be stuck on Node 14.
+
+If you want to know more about the plan, you can check this [discussion](https://github.com/meteor/meteor/discussions/11505).
+
+Why doing this change now?
+
+This will be a considerable change for older Meteor applications, and some parts of the code of any Meteor app will have to be adjusted eventually. So it's important to start the migration process as soon as possible.
+
+The migration process started in version 2.8. We recommend you [check that out](2.8-migration.htm) first in case you skipped.
+
+Can I update to this version without changing my app?
+
+Yes. You can update to this version without changing your app.
+
+What's new?
+
+Let's start with the accounts and OAuth packages. Some methods had to be restructured to work without Fibers in the future. The current methods will continue working as of today, but if you use some of the methods we'll mention below in custom login packages, we recommend you adapt them.
+
+Internal methods that are now async:
+
+- **_attemptLogin**
+- **_loginMethod**
+- **_runLoginHandlers**
+- **Accounts._checkPassword**: still works as always, but now has a new version called `Accounts._checkPasswordAsync`.
+
+
+We also have changes to asynchronous context in the registry of handlers for OAuth services.
+
+Now, the OAuth.Register method accepts an async handler, and it is possible to use the await option internally, avoiding to use methods that run on Fibers, such as **HTTP** (deprecated Meteor package), `Meteor.wrapAsync` and `Promise.await`.
+
+Before the changes you would have something like:
+
+```js
+OAuth.registerService('github', 2, null, (query) => {
+ const accessTokenCall = Meteor.wrapAsync(getAccessToken);
+ const accessToken = accessTokenCall(query);
+ const identityCall = Meteor.wrapAsync(getIdentity);
+…
+});
+```
+
+Now you have:
+
+```js
+OAuth.registerService('github', 2, null, async (query) => {
+ const accessToken = await getAccessToken(query);
+ const identity = await getIdentity(accessToken);
+ const emails = await getEmails(accessToken);
+…
+});
+```
+
+New async methods
+
+We now have async version of methods that you already use. They are:
+
+- [Email.sendAsync()](https://github.com/meteor/meteor/pull/12101/files#diff-b2453acdfd34fb563a1e258956d2733ab06a2aa77c87e402cfa53a86a48133a8R86-R107)
+- [Meteor.userAsync()](https://github.com/meteor/meteor/pull/12274)
+- [CssTools.minifyCssAsync()](https://github.com/meteor/meteor/pull/12105)
+
+Breaking async
+
+`Accounts.createUserVerifyingEmail` is now completely async:
+
+- [Accounts.createUserVerifyingEmail](https://github.com/meteor/meteor/issues/12398)
+
+To upgrade change from
+```js
+Meteor.methods({
+ createUserAccount (user) {
+ /**
+ * This seems to be the issue.
+ * Using the other method `createUser` works as expected.
+ */
+ Accounts.createUserVerifyingEmail({
+ username: user.username,
+ email: user.email,
+ password: user.password,
+ });
+ }
+});
+```
+
+to
+
+```js
+Meteor.methods({
+ async createUserAccount (user) {
+ await Accounts.createUserVerifyingEmail({
+ username: user.username,
+ email: user.email,
+ password: user.password,
+ });
+ }
+});
+```
+
+Accounts-base without service-configuration
+
+Now `accounts-base` is [no longer tied up](https://github.com/meteor/meteor/pull/12202) with `service-configuration`. So, if you don't use third-party login on your project, you don't need to add the package `service-configuration` anymore.
+
+Migrating from a version older than 2.8?
+
+If you're migrating from a version of Meteor older than Meteor 2.8, there may be important considerations not listed in this guide. Please review the older migration guides for details:
+
+* [Migrating to Meteor 2.8](2.8-migration.html) (from 2.7)
+* [Migrating to Meteor 2.7](2.7-migration.html) (from 2.6)
+* [Migrating to Meteor 2.6](2.6-migration.html) (from 2.5)
+* [Migrating to Meteor 2.5](2.5-migration.html) (from 2.4)
+* [Migrating to Meteor 2.4](2.4-migration.html) (from 2.3)
+* [Migrating to Meteor 2.3](2.3-migration.html) (from 2.2)
+* [Migrating to Meteor 2.2](2.2-migration.html) (from 2.0)
+* [Migrating to Meteor 2.0](2.0-migration.html) (from 1.12)
+* [Migrating to Meteor 1.12](1.12-migration.html) (from 1.11)
+* [Migrating to Meteor 1.11](1.11-migration.html) (from 1.10.2)
+* [Migrating to Meteor 1.10.2](1.10.2-migration.html) (from 1.10)
+* [Migrating to Meteor 1.10](1.10-migration.html) (from 1.9.3)
+* [Migrating to Meteor 1.9.3](1.9.3-migration.html) (from 1.9)
+* [Migrating to Meteor 1.9](1.9-migration.html) (from 1.8.3)
+* [Migrating to Meteor 1.8.3](1.8.3-migration.html) (from 1.8.2)
+* [Migrating to Meteor 1.8.2](1.8.2-migration.html) (from 1.8)
+* [Migrating to Meteor 1.8](1.8-migration.html) (from 1.7)
+* [Migrating to Meteor 1.7](1.7-migration.html) (from 1.6)
+* [Migrating to Meteor 1.6](1.6-migration.html) (from 1.5)
+* [Migrating to Meteor 1.5](1.5-migration.html) (from 1.4)
+* [Migrating to Meteor 1.4](1.4-migration.html) (from 1.3)
+* [Migrating to Meteor 1.3](1.3-migration.html) (from 1.2)
diff --git a/meteor b/meteor
index 0779da7ba2..1146deb2ff 100755
--- a/meteor
+++ b/meteor
@@ -1,6 +1,7 @@
#!/usr/bin/env bash
-BUNDLE_VERSION=14.21.1.0
+BUNDLE_VERSION=14.21.2.2
+
# OS Check. Put here because here is where we download the precompiled
# bundles that are arch specific.
diff --git a/npm-packages/eslint-config-meteor/README.md b/npm-packages/eslint-config-meteor/README.md
index 27c8ba5595..046c174268 100644
--- a/npm-packages/eslint-config-meteor/README.md
+++ b/npm-packages/eslint-config-meteor/README.md
@@ -1,4 +1,4 @@
-# eslint-config-meteor
+# @meteorjs/eslint-config-meteor
This is an [ESLint](https://eslint.org) configuration for [Meteor](https://www.meteor.com) apps which implements the recommendations from the [Meteor Guide](https://guide.meteor.com/)'s section on [Code style](https://guide.meteor.com/code-style.html#eslint).
diff --git a/npm-packages/eslint-config-meteor/index.js b/npm-packages/eslint-config-meteor/index.js
index 5e71e32103..3c191d2ebc 100644
--- a/npm-packages/eslint-config-meteor/index.js
+++ b/npm-packages/eslint-config-meteor/index.js
@@ -1,21 +1,16 @@
module.exports = {
parser: 'babel-eslint',
parserOptions: {
- allowImportExportEverywhere: true
+ allowImportExportEverywhere: true,
},
env: {
node: true,
- browser: true
+ browser: true,
},
- plugins: [
- 'meteor'
- ],
- extends: [
- 'airbnb',
- 'plugin:meteor/recommended'
- ],
+ plugins: ['meteor'],
+ extends: ['airbnb', 'plugin:meteor/recommended'],
settings: {
- 'import/resolver': 'meteor'
+ 'import/resolver': 'meteor',
},
rules: {
'react/jsx-filename-extension': 0,
@@ -30,24 +25,21 @@ module.exports = {
'no-underscore-dangle': [
'error',
{
- allow: [
- '_id',
- '_ensureIndex'
- ]
- }
+ allow: ['_id', '_ensureIndex'],
+ },
],
'object-shorthand': [
'error',
'always',
{
- avoidQuotes: false
- }
+ avoidQuotes: false,
+ },
],
'space-before-function-paren': 0,
-
+
// for Meteor API's that rely on `this` context, e.g. Template.onCreated and publications
'func-names': 0,
- 'prefer-arrow-callback': 0
- }
+ 'prefer-arrow-callback': 0,
+ },
};
diff --git a/npm-packages/eslint-config-meteor/package.json b/npm-packages/eslint-config-meteor/package.json
index faff59b2ad..6b1d62defe 100644
--- a/npm-packages/eslint-config-meteor/package.json
+++ b/npm-packages/eslint-config-meteor/package.json
@@ -8,14 +8,14 @@
},
"repository": {
"type": "git",
- "url": "git+https://github.com/meteor/eslint-config-meteor.git"
+ "url": "git+https://github.com/meteor/meteor.git"
},
"author": "David Burles",
"license": "MIT",
"bugs": {
- "url": "https://github.com/meteor/eslint-config-meteor/issues"
+ "url": "https://github.com/meteor/meteor/issues"
},
- "homepage": "https://github.com/meteor/eslint-config-meteor#readme",
+ "homepage": "https://github.com/meteor/meteor/tree/devel/npm-packages/eslint-config-meteor#readme",
"peerDependencies": {
"babel-eslint": ">= 7",
"eslint": ">= 3",
diff --git a/npm-packages/eslint-plugin-meteor/package.json b/npm-packages/eslint-plugin-meteor/package.json
index 6f01831721..7845d884a3 100644
--- a/npm-packages/eslint-plugin-meteor/package.json
+++ b/npm-packages/eslint-plugin-meteor/package.json
@@ -1,6 +1,6 @@
{
"name": "eslint-plugin-meteor",
- "version": "7.3.0",
+ "version": "7.4.0",
"author": "Dominik Ferber ",
"description": "Meteor specific linting rules for ESLint",
"main": "lib/index.js",
diff --git a/npm-packages/eslint-plugin-meteor/scripts/dev-bundle-tool-package.js b/npm-packages/eslint-plugin-meteor/scripts/dev-bundle-tool-package.js
index 6d107c5bf8..de71198d42 100644
--- a/npm-packages/eslint-plugin-meteor/scripts/dev-bundle-tool-package.js
+++ b/npm-packages/eslint-plugin-meteor/scripts/dev-bundle-tool-package.js
@@ -14,8 +14,8 @@ var packageJson = {
pacote: "https://github.com/meteor/pacote/tarball/a81b0324686e85d22c7688c47629d4009000e8b8",
"node-gyp": "8.0.0",
"node-pre-gyp": "0.15.0",
- typescript: "4.5.4",
- "@meteorjs/babel": "7.16.0-beta.1",
+ typescript: "4.6.4",
+ "@meteorjs/babel": "7.17.1-beta.0",
// Keep the versions of these packages consistent with the versions
// found in dev-bundle-server-package.js.
"meteor-promise": "0.9.0",
diff --git a/npm-packages/meteor-babel/options.js b/npm-packages/meteor-babel/options.js
index 2d582a3102..4454148783 100644
--- a/npm-packages/meteor-babel/options.js
+++ b/npm-packages/meteor-babel/options.js
@@ -185,12 +185,16 @@ function getDefaultsForNode8(features) {
// Ensure that async functions run in a Fiber, while also taking
// full advantage of native async/await support in Node 8.
- combined.plugins.push([require("./plugins/async-await.js"), {
- // Do not transform `await x` to `Promise.await(x)`, since Node
- // 8 has native support for await expressions.
- useNativeAsyncAwait: false
- }]);
+ const isFiberDisabled = process.env.DISABLE_FIBERS === '1';
+ const ignoreAsyncPlugin = process.env.IGNORE_ASYNC_PLUGIN === '1';
+ if (!ignoreAsyncPlugin) {
+ combined.plugins.push([require("./plugins/async-await.js"), {
+ // Do not transform `await x` to `Promise.await(x)`, since Node
+ // 8 has native support for await expressions.
+ useNativeAsyncAwait: isFiberDisabled,
+ }]);
+ }
// Enable async generator functions proposal.
combined.plugins.push(require("@babel/plugin-proposal-async-generator-functions"));
}
diff --git a/npm-packages/meteor-babel/package-lock.json b/npm-packages/meteor-babel/package-lock.json
index 7fec2af89a..17c5612fb7 100644
--- a/npm-packages/meteor-babel/package-lock.json
+++ b/npm-packages/meteor-babel/package-lock.json
@@ -1,8 +1,3875 @@
{
"name": "@meteorjs/babel",
- "version": "7.16.0-beta.1",
- "lockfileVersion": 1,
+ "version": "7.17.2-beta.0",
+ "lockfileVersion": 2,
"requires": true,
+ "packages": {
+ "": {
+ "name": "@meteorjs/babel",
+ "version": "7.17.2-beta.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.17.2",
+ "@babel/parser": "^7.17.0",
+ "@babel/plugin-proposal-class-properties": "^7.16.7",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-transform-modules-commonjs": "^7.16.8",
+ "@babel/plugin-transform-runtime": "^7.17.0",
+ "@babel/preset-react": "^7.16.7",
+ "@babel/runtime": "7.17.2",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.0",
+ "@babel/types": "^7.17.0",
+ "@meteorjs/reify": "0.23.0",
+ "babel-preset-meteor": "^7.10.0",
+ "babel-preset-minify": "^0.5.1",
+ "convert-source-map": "^1.6.0",
+ "lodash": "^4.17.21",
+ "meteor-babel-helpers": "0.0.3",
+ "typescript": "~4.6.4"
+ },
+ "devDependencies": {
+ "@babel/plugin-proposal-decorators": "7.14.5",
+ "@babel/plugin-syntax-decorators": "7.14.5",
+ "d3": "4.13.0",
+ "fibers": "5.0.0",
+ "meteor-promise": "0.9.0",
+ "mocha": "6.2.3",
+ "promise": "8.1.0",
+ "source-map": "0.6.1"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.1.tgz",
+ "integrity": "sha512-Aolwjd7HSC2PyY0fDj/wA/EimQT4HfEnFYNp5s9CQlrdhyvWTtvZ5YzrUPu6R6/1jKiUlxu8bUhkdSnKHNAHMA==",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
+ "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+ "dependencies": {
+ "@babel/highlight": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.9.tgz",
+ "integrity": "sha512-p3QjZmMGHDGdpcwEYYWu7i7oJShJvtgMjJeb0W95PPhSm++3lm8YXYOh45Y6iCN9PkZLTZ7CIX5nFrp7pw7TXw==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.17.2",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz",
+ "integrity": "sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==",
+ "dependencies": {
+ "@ampproject/remapping": "^2.0.0",
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.17.0",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helpers": "^7.17.2",
+ "@babel/parser": "^7.17.0",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.0",
+ "@babel/types": "^7.17.0",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.1.2",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/compat-data": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz",
+ "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-compilation-targets": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
+ "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
+ "dependencies": {
+ "@babel/compat-data": "^7.16.4",
+ "@babel/helper-validator-option": "^7.16.7",
+ "browserslist": "^4.17.5",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-validator-option": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/browserslist": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+ "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001286",
+ "electron-to-chromium": "^1.4.17",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/@babel/core/node_modules/caniuse-lite": {
+ "version": "1.0.30001312",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+ "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/@babel/core/node_modules/electron-to-chromium": {
+ "version": "1.4.68",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.68.tgz",
+ "integrity": "sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA=="
+ },
+ "node_modules/@babel/core/node_modules/node-releases": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg=="
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz",
+ "integrity": "sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==",
+ "dependencies": {
+ "@babel/types": "^7.17.0",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz",
+ "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==",
+ "dependencies": {
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz",
+ "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==",
+ "dependencies": {
+ "@babel/helper-explode-assignable-expression": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz",
+ "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==",
+ "dependencies": {
+ "@babel/compat-data": "^7.14.5",
+ "@babel/helper-validator-option": "^7.14.5",
+ "browserslist": "^4.16.6",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.14.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz",
+ "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.14.5",
+ "@babel/helper-function-name": "^7.14.5",
+ "@babel/helper-member-expression-to-functions": "^7.14.7",
+ "@babel/helper-optimise-call-expression": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.14.5",
+ "@babel/helper-split-export-declaration": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz",
+ "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.14.5",
+ "regexpu-core": "^4.7.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
+ "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.13.0",
+ "@babel/helper-module-imports": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/traverse": "^7.13.0",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2",
+ "semver": "^6.1.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0-0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
+ "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-explode-assignable-expression": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz",
+ "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==",
+ "dependencies": {
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz",
+ "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==",
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-get-function-arity": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz",
+ "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==",
+ "dependencies": {
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
+ "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz",
+ "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==",
+ "dependencies": {
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz",
+ "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==",
+ "dependencies": {
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
+ "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-module-imports": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+ "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz",
+ "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==",
+ "dependencies": {
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
+ "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz",
+ "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.14.5",
+ "@babel/helper-wrap-function": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz",
+ "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.14.5",
+ "@babel/helper-optimise-call-expression": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
+ "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz",
+ "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==",
+ "dependencies": {
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
+ "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==",
+ "dependencies": {
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+ "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
+ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz",
+ "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==",
+ "dependencies": {
+ "@babel/helper-function-name": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.17.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz",
+ "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==",
+ "dependencies": {
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.0",
+ "@babel/types": "^7.17.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.16.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
+ "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz",
+ "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz",
+ "integrity": "sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-remap-async-to-generator": "^7.14.5",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
+ "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.17.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz",
+ "integrity": "sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-function-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
+ "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
+ "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
+ "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
+ "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-replace-supers": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
+ "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+ "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.5.tgz",
+ "integrity": "sha512-LYz5nvQcvYeRVjui1Ykn28i+3aUiXwQ/3MGoEy0InTaz1pJo/lAzmIDXX+BQny/oufgHzJ6vnEEiXQ8KZjEVFg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-decorators": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz",
+ "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz",
+ "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz",
+ "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==",
+ "dependencies": {
+ "@babel/compat-data": "^7.14.7",
+ "@babel/helper-compilation-targets": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz",
+ "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz",
+ "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz",
+ "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
+ "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz",
+ "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz",
+ "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-remap-async-to-generator": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz",
+ "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz",
+ "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz",
+ "integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.14.5",
+ "@babel/helper-function-name": "^7.14.5",
+ "@babel/helper-optimise-call-expression": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.14.5",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz",
+ "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz",
+ "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz",
+ "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==",
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz",
+ "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz",
+ "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz",
+ "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz",
+ "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz",
+ "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz",
+ "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz",
+ "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz",
+ "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-jsx": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz",
+ "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-module-imports": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz",
+ "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz",
+ "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==",
+ "dependencies": {
+ "regenerator-transform": "^0.14.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz",
+ "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "babel-plugin-polyfill-corejs2": "^0.3.0",
+ "babel-plugin-polyfill-corejs3": "^0.5.0",
+ "babel-plugin-polyfill-regenerator": "^0.3.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-module-imports": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz",
+ "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz",
+ "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz",
+ "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz",
+ "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz",
+ "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz",
+ "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz",
+ "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-transform-react-display-name": "^7.16.7",
+ "@babel/plugin-transform-react-jsx": "^7.16.7",
+ "@babel/plugin-transform-react-jsx-development": "^7.16.7",
+ "@babel/plugin-transform-react-pure-annotations": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-react/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/preset-react/node_modules/@babel/helper-validator-option": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.17.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz",
+ "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
+ "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/parser": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz",
+ "integrity": "sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.17.0",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/parser": "^7.17.0",
+ "@babel/types": "^7.17.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/@babel/helper-function-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
+ "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
+ "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+ "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz",
+ "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
+ "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz",
+ "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz",
+ "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@meteorjs/reify": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@meteorjs/reify/-/reify-0.23.0.tgz",
+ "integrity": "sha512-sHQCbZHoM+PxT+pWvkJDsaOpJP+tMQ31Mr2t1T0YcXl18eScb0bQNafe8TugNCc4pngByppfscVX4ppr84MzDw==",
+ "dependencies": {
+ "acorn": "^6.1.1",
+ "acorn-dynamic-import": "^4.0.0",
+ "magic-string": "^0.25.3",
+ "periscopic": "^2.0.3",
+ "semver": "^5.7.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@meteorjs/reify/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "0.0.50",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
+ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw=="
+ },
+ "node_modules/acorn": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-dynamic-import": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
+ "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==",
+ "deprecated": "This is probably built in to whatever tool you're using. If you still need it... idk",
+ "peerDependencies": {
+ "acorn": "^6.0.0"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true
+ },
+ "node_modules/babel-helper-evaluate-path": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz",
+ "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA=="
+ },
+ "node_modules/babel-helper-flip-expressions": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz",
+ "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0="
+ },
+ "node_modules/babel-helper-is-nodes-equiv": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
+ "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ="
+ },
+ "node_modules/babel-helper-is-void-0": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz",
+ "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4="
+ },
+ "node_modules/babel-helper-mark-eval-scopes": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz",
+ "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI="
+ },
+ "node_modules/babel-helper-remove-or-void": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz",
+ "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA="
+ },
+ "node_modules/babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz",
+ "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA=="
+ },
+ "node_modules/babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dependencies": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "node_modules/babel-plugin-minify-builtins": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz",
+ "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag=="
+ },
+ "node_modules/babel-plugin-minify-constant-folding": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz",
+ "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==",
+ "dependencies": {
+ "babel-helper-evaluate-path": "^0.5.0"
+ }
+ },
+ "node_modules/babel-plugin-minify-dead-code-elimination": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz",
+ "integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg==",
+ "dependencies": {
+ "babel-helper-evaluate-path": "^0.5.0",
+ "babel-helper-mark-eval-scopes": "^0.4.3",
+ "babel-helper-remove-or-void": "^0.4.3",
+ "lodash": "^4.17.11"
+ }
+ },
+ "node_modules/babel-plugin-minify-flip-comparisons": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz",
+ "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=",
+ "dependencies": {
+ "babel-helper-is-void-0": "^0.4.3"
+ }
+ },
+ "node_modules/babel-plugin-minify-guarded-expressions": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz",
+ "integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==",
+ "dependencies": {
+ "babel-helper-evaluate-path": "^0.5.0",
+ "babel-helper-flip-expressions": "^0.4.3"
+ }
+ },
+ "node_modules/babel-plugin-minify-infinity": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz",
+ "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco="
+ },
+ "node_modules/babel-plugin-minify-mangle-names": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz",
+ "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==",
+ "dependencies": {
+ "babel-helper-mark-eval-scopes": "^0.4.3"
+ }
+ },
+ "node_modules/babel-plugin-minify-numeric-literals": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz",
+ "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw="
+ },
+ "node_modules/babel-plugin-minify-replace": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz",
+ "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q=="
+ },
+ "node_modules/babel-plugin-minify-simplify": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz",
+ "integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==",
+ "dependencies": {
+ "babel-helper-evaluate-path": "^0.5.0",
+ "babel-helper-flip-expressions": "^0.4.3",
+ "babel-helper-is-nodes-equiv": "^0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "^0.5.0"
+ }
+ },
+ "node_modules/babel-plugin-minify-type-constructors": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz",
+ "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=",
+ "dependencies": {
+ "babel-helper-is-void-0": "^0.4.3"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
+ "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
+ "dependencies": {
+ "@babel/compat-data": "^7.13.11",
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "semver": "^6.1.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
+ "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "core-js-compat": "^3.21.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
+ "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz",
+ "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE="
+ },
+ "node_modules/babel-plugin-transform-member-expression-literals": {
+ "version": "6.9.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz",
+ "integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8="
+ },
+ "node_modules/babel-plugin-transform-merge-sibling-variables": {
+ "version": "6.9.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz",
+ "integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4="
+ },
+ "node_modules/babel-plugin-transform-minify-booleans": {
+ "version": "6.9.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz",
+ "integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg="
+ },
+ "node_modules/babel-plugin-transform-property-literals": {
+ "version": "6.9.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz",
+ "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "node_modules/babel-plugin-transform-regexp-constructors": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz",
+ "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU="
+ },
+ "node_modules/babel-plugin-transform-remove-console": {
+ "version": "6.9.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz",
+ "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A="
+ },
+ "node_modules/babel-plugin-transform-remove-debugger": {
+ "version": "6.9.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz",
+ "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI="
+ },
+ "node_modules/babel-plugin-transform-remove-undefined": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz",
+ "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==",
+ "dependencies": {
+ "babel-helper-evaluate-path": "^0.5.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-simplify-comparison-operators": {
+ "version": "6.9.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz",
+ "integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk="
+ },
+ "node_modules/babel-plugin-transform-undefined-to-void": {
+ "version": "6.9.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz",
+ "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA="
+ },
+ "node_modules/babel-preset-meteor": {
+ "version": "7.10.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-meteor/-/babel-preset-meteor-7.10.0.tgz",
+ "integrity": "sha512-bcdNfRCQAjTV42cUcmaG5/ltLZZQLpZajUcP+o0Lr+aLTY/XLNkGfASM5383wdXiAkEFl0sDOXeknnLlQtrmdg==",
+ "dependencies": {
+ "@babel/plugin-proposal-async-generator-functions": "^7.13.15",
+ "@babel/plugin-proposal-class-properties": "^7.13.0",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8",
+ "@babel/plugin-proposal-object-rest-spread": "^7.13.8",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.13.8",
+ "@babel/plugin-proposal-optional-chaining": "^7.13.12",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-transform-arrow-functions": "^7.13.0",
+ "@babel/plugin-transform-async-to-generator": "^7.13.0",
+ "@babel/plugin-transform-block-scoped-functions": "^7.12.13",
+ "@babel/plugin-transform-block-scoping": "^7.13.16",
+ "@babel/plugin-transform-classes": "^7.13.0",
+ "@babel/plugin-transform-computed-properties": "^7.13.0",
+ "@babel/plugin-transform-destructuring": "^7.13.17",
+ "@babel/plugin-transform-exponentiation-operator": "^7.12.13",
+ "@babel/plugin-transform-for-of": "^7.13.0",
+ "@babel/plugin-transform-literals": "^7.12.13",
+ "@babel/plugin-transform-object-super": "^7.12.13",
+ "@babel/plugin-transform-parameters": "^7.13.0",
+ "@babel/plugin-transform-property-literals": "^7.12.13",
+ "@babel/plugin-transform-regenerator": "^7.13.15",
+ "@babel/plugin-transform-shorthand-properties": "^7.12.13",
+ "@babel/plugin-transform-spread": "^7.13.0",
+ "@babel/plugin-transform-sticky-regex": "^7.12.13",
+ "@babel/plugin-transform-template-literals": "^7.13.0",
+ "@babel/plugin-transform-typeof-symbol": "^7.12.13",
+ "@babel/plugin-transform-unicode-regex": "^7.12.13"
+ }
+ },
+ "node_modules/babel-preset-minify": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz",
+ "integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==",
+ "dependencies": {
+ "babel-plugin-minify-builtins": "^0.5.0",
+ "babel-plugin-minify-constant-folding": "^0.5.0",
+ "babel-plugin-minify-dead-code-elimination": "^0.5.1",
+ "babel-plugin-minify-flip-comparisons": "^0.4.3",
+ "babel-plugin-minify-guarded-expressions": "^0.4.4",
+ "babel-plugin-minify-infinity": "^0.4.3",
+ "babel-plugin-minify-mangle-names": "^0.5.0",
+ "babel-plugin-minify-numeric-literals": "^0.4.3",
+ "babel-plugin-minify-replace": "^0.5.0",
+ "babel-plugin-minify-simplify": "^0.5.1",
+ "babel-plugin-minify-type-constructors": "^0.4.3",
+ "babel-plugin-transform-inline-consecutive-adds": "^0.4.3",
+ "babel-plugin-transform-member-expression-literals": "^6.9.4",
+ "babel-plugin-transform-merge-sibling-variables": "^6.9.4",
+ "babel-plugin-transform-minify-booleans": "^6.9.4",
+ "babel-plugin-transform-property-literals": "^6.9.4",
+ "babel-plugin-transform-regexp-constructors": "^0.4.3",
+ "babel-plugin-transform-remove-console": "^6.9.4",
+ "babel-plugin-transform-remove-debugger": "^6.9.4",
+ "babel-plugin-transform-remove-undefined": "^0.5.0",
+ "babel-plugin-transform-simplify-comparison-operators": "^6.9.4",
+ "babel-plugin-transform-undefined-to-void": "^6.9.4",
+ "lodash": "^4.17.11"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "node_modules/browserslist": {
+ "version": "4.16.6",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
+ "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001219",
+ "colorette": "^1.2.2",
+ "electron-to-chromium": "^1.3.723",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.71"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001248",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz",
+ "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "node_modules/cliui/node_modules/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,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui/node_modules/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,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui/node_modules/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,
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "node_modules/colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w=="
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.0.tgz",
+ "integrity": "sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A==",
+ "dependencies": {
+ "browserslist": "^4.19.1",
+ "semver": "7.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat/node_modules/browserslist": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+ "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001286",
+ "electron-to-chromium": "^1.4.17",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/core-js-compat/node_modules/caniuse-lite": {
+ "version": "1.0.30001312",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+ "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/core-js-compat/node_modules/electron-to-chromium": {
+ "version": "1.4.68",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.68.tgz",
+ "integrity": "sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA=="
+ },
+ "node_modules/core-js-compat/node_modules/node-releases": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg=="
+ },
+ "node_modules/core-js-compat/node_modules/semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/d3": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz",
+ "integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==",
+ "dev": true,
+ "dependencies": {
+ "d3-array": "1.2.1",
+ "d3-axis": "1.0.8",
+ "d3-brush": "1.0.4",
+ "d3-chord": "1.0.4",
+ "d3-collection": "1.0.4",
+ "d3-color": "1.0.3",
+ "d3-dispatch": "1.0.3",
+ "d3-drag": "1.2.1",
+ "d3-dsv": "1.0.8",
+ "d3-ease": "1.0.3",
+ "d3-force": "1.1.0",
+ "d3-format": "1.2.2",
+ "d3-geo": "1.9.1",
+ "d3-hierarchy": "1.1.5",
+ "d3-interpolate": "1.1.6",
+ "d3-path": "1.0.5",
+ "d3-polygon": "1.0.3",
+ "d3-quadtree": "1.0.3",
+ "d3-queue": "3.0.7",
+ "d3-random": "1.1.0",
+ "d3-request": "1.0.6",
+ "d3-scale": "1.0.7",
+ "d3-selection": "1.3.0",
+ "d3-shape": "1.2.0",
+ "d3-time": "1.0.8",
+ "d3-time-format": "2.1.1",
+ "d3-timer": "1.0.7",
+ "d3-transition": "1.1.1",
+ "d3-voronoi": "1.1.2",
+ "d3-zoom": "1.7.1"
+ }
+ },
+ "node_modules/d3-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz",
+ "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==",
+ "dev": true
+ },
+ "node_modules/d3-axis": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz",
+ "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=",
+ "dev": true
+ },
+ "node_modules/d3-brush": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz",
+ "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=",
+ "dev": true,
+ "dependencies": {
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
+ }
+ },
+ "node_modules/d3-chord": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz",
+ "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=",
+ "dev": true,
+ "dependencies": {
+ "d3-array": "1",
+ "d3-path": "1"
+ }
+ },
+ "node_modules/d3-collection": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz",
+ "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=",
+ "dev": true
+ },
+ "node_modules/d3-color": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz",
+ "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=",
+ "dev": true
+ },
+ "node_modules/d3-dispatch": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz",
+ "integrity": "sha1-RuFJHqqbWMNY/OW+TovtYm54cfg=",
+ "dev": true
+ },
+ "node_modules/d3-drag": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz",
+ "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==",
+ "dev": true,
+ "dependencies": {
+ "d3-dispatch": "1",
+ "d3-selection": "1"
+ }
+ },
+ "node_modules/d3-dsv": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz",
+ "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==",
+ "dev": true,
+ "dependencies": {
+ "commander": "2",
+ "iconv-lite": "0.4",
+ "rw": "1"
+ },
+ "bin": {
+ "csv2json": "bin/dsv2json",
+ "csv2tsv": "bin/dsv2dsv",
+ "dsv2dsv": "bin/dsv2dsv",
+ "dsv2json": "bin/dsv2json",
+ "json2csv": "bin/json2dsv",
+ "json2dsv": "bin/json2dsv",
+ "json2tsv": "bin/json2dsv",
+ "tsv2csv": "bin/dsv2dsv",
+ "tsv2json": "bin/dsv2json"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz",
+ "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=",
+ "dev": true
+ },
+ "node_modules/d3-force": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz",
+ "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==",
+ "dev": true,
+ "dependencies": {
+ "d3-collection": "1",
+ "d3-dispatch": "1",
+ "d3-quadtree": "1",
+ "d3-timer": "1"
+ }
+ },
+ "node_modules/d3-format": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz",
+ "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==",
+ "dev": true
+ },
+ "node_modules/d3-geo": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz",
+ "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==",
+ "dev": true,
+ "dependencies": {
+ "d3-array": "1"
+ }
+ },
+ "node_modules/d3-hierarchy": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz",
+ "integrity": "sha1-ochFxC+Eoga88cAcAQmOpN2qeiY=",
+ "dev": true
+ },
+ "node_modules/d3-interpolate": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz",
+ "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==",
+ "dev": true,
+ "dependencies": {
+ "d3-color": "1"
+ }
+ },
+ "node_modules/d3-path": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz",
+ "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=",
+ "dev": true
+ },
+ "node_modules/d3-polygon": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz",
+ "integrity": "sha1-FoiOkCZGCTPysXllKtN4Ik04LGI=",
+ "dev": true
+ },
+ "node_modules/d3-quadtree": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz",
+ "integrity": "sha1-rHmH4+I/6AWpkPKOG1DTj8uCJDg=",
+ "dev": true
+ },
+ "node_modules/d3-queue": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz",
+ "integrity": "sha1-yTouVLQXwJWRKdfXP2z31Ckudhg=",
+ "dev": true
+ },
+ "node_modules/d3-random": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz",
+ "integrity": "sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM=",
+ "dev": true
+ },
+ "node_modules/d3-request": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz",
+ "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==",
+ "dev": true,
+ "dependencies": {
+ "d3-collection": "1",
+ "d3-dispatch": "1",
+ "d3-dsv": "1",
+ "xmlhttprequest": "1"
+ }
+ },
+ "node_modules/d3-scale": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz",
+ "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==",
+ "dev": true,
+ "dependencies": {
+ "d3-array": "^1.2.0",
+ "d3-collection": "1",
+ "d3-color": "1",
+ "d3-format": "1",
+ "d3-interpolate": "1",
+ "d3-time": "1",
+ "d3-time-format": "2"
+ }
+ },
+ "node_modules/d3-selection": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz",
+ "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==",
+ "dev": true
+ },
+ "node_modules/d3-shape": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz",
+ "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=",
+ "dev": true,
+ "dependencies": {
+ "d3-path": "1"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz",
+ "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==",
+ "dev": true
+ },
+ "node_modules/d3-time-format": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz",
+ "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==",
+ "dev": true,
+ "dependencies": {
+ "d3-time": "1"
+ }
+ },
+ "node_modules/d3-timer": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz",
+ "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==",
+ "dev": true
+ },
+ "node_modules/d3-transition": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz",
+ "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==",
+ "dev": true,
+ "dependencies": {
+ "d3-color": "1",
+ "d3-dispatch": "1",
+ "d3-ease": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "^1.1.0",
+ "d3-timer": "1"
+ }
+ },
+ "node_modules/d3-voronoi": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz",
+ "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=",
+ "dev": true
+ },
+ "node_modules/d3-zoom": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz",
+ "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==",
+ "dev": true,
+ "dependencies": {
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dependencies": {
+ "object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
+ "dev": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.3.793",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.793.tgz",
+ "integrity": "sha512-l9NrGV6Mr4ov5mayYPvIWcwklNw5ROmy6rllzz9dCACw9nKE5y+s5uQk+CBJMetxrWZ6QJFsvEfG6WDcH2IGUg=="
+ },
+ "node_modules/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
+ },
+ "node_modules/es-abstract": {
+ "version": "1.18.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
+ "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.2",
+ "internal-slot": "^1.0.3",
+ "is-callable": "^1.2.3",
+ "is-negative-zero": "^2.0.1",
+ "is-regex": "^1.1.3",
+ "is-string": "^1.0.6",
+ "object-inspect": "^1.11.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.2",
+ "string.prototype.trimend": "^1.0.4",
+ "string.prototype.trimstart": "^1.0.4",
+ "unbox-primitive": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fibers": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.0.tgz",
+ "integrity": "sha512-UpGv/YAZp7mhKHxDvC1tColrroGRX90sSvh8RMZV9leo+e5+EkRVgCEZPlmXeo3BUNQTZxUaVdLskq1Q2FyCPg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/flat": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
+ "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "~2.0.3"
+ },
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.x"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+ "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
+ "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
+ "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+ "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+ "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz",
+ "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
+ "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-reference": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
+ "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
+ "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
+ "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+ },
+ "node_modules/log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.25.7",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+ "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.4"
+ }
+ },
+ "node_modules/meteor-babel-helpers": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/meteor-babel-helpers/-/meteor-babel-helpers-0.0.3.tgz",
+ "integrity": "sha1-8uXZ+HlvvS6JAQI9dpnlsgLqn7A="
+ },
+ "node_modules/meteor-promise": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/meteor-promise/-/meteor-promise-0.9.0.tgz",
+ "integrity": "sha512-O1Fj1Oa5FfyIkAkDtZVnoYYEIC3miy7lvEeIQZVYunGSbOuivSbfAiPPsD+P45WNlcBALhUo94UzlHeIKBYNuQ==",
+ "dev": true
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
+ "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==",
+ "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz",
+ "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "3.2.3",
+ "browser-stdout": "1.3.1",
+ "debug": "3.2.6",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "find-up": "3.0.0",
+ "glob": "7.1.3",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "3.13.1",
+ "log-symbols": "2.2.0",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.4",
+ "ms": "2.1.1",
+ "node-environment-flags": "1.0.5",
+ "object.assign": "4.1.0",
+ "strip-json-comments": "2.0.1",
+ "supports-color": "6.0.0",
+ "which": "1.3.1",
+ "wide-align": "1.1.3",
+ "yargs": "13.3.2",
+ "yargs-parser": "13.1.2",
+ "yargs-unparser": "1.6.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "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)",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/mocha/node_modules/ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/node-environment-flags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
+ "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==",
+ "dev": true,
+ "dependencies": {
+ "object.getownpropertydescriptors": "^2.0.3",
+ "semver": "^5.7.0"
+ }
+ },
+ "node_modules/node-environment-flags/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "1.1.73",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz",
+ "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg=="
+ },
+ "node_modules/object-inspect": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+ "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.getownpropertydescriptors": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz",
+ "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.2"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/periscopic": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-2.0.3.tgz",
+ "integrity": "sha512-FuCZe61mWxQOJAQFEfmt9FjzebRlcpFz8sFPbyaCKtdusPkMEbA9ey0eARnRav5zAhmXznhaQkKGFAPn7X9NUw==",
+ "dependencies": {
+ "estree-walker": "^2.0.2",
+ "is-reference": "^1.1.4"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/promise": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
+ "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
+ "dev": true,
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+ "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+ "dependencies": {
+ "regenerate": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
+ "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+ "dependencies": {
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^8.2.0",
+ "regjsgen": "^0.5.1",
+ "regjsparser": "^0.6.4",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
+ },
+ "node_modules/regjsparser": {
+ "version": "0.6.9",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz",
+ "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==",
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/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
+ },
+ "node_modules/resolve": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+ "dependencies": {
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/rw": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+ "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=",
+ "dev": true
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/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
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+ "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+ "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.6.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz",
+ "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+ "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has-bigints": "^1.0.1",
+ "has-symbols": "^1.0.2",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
+ "unicode-property-aliases-ecmascript": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+ "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/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
+ },
+ "node_modules/wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/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,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/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,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/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,
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/xmlhttprequest": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+ "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/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
+ },
+ "node_modules/yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dev": true,
+ "dependencies": {
+ "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"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
+ "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+ "dev": true,
+ "dependencies": {
+ "flat": "^4.1.0",
+ "lodash": "^4.17.15",
+ "yargs": "^13.3.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/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,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/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,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/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,
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ },
"dependencies": {
"@ampproject/remapping": {
"version": "2.1.1",
@@ -1073,7 +4940,8 @@
"acorn-dynamic-import": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
- "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw=="
+ "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==",
+ "requires": {}
},
"ansi-colors": {
"version": "3.2.3",
@@ -2722,9 +6590,9 @@
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
},
"typescript": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
- "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg=="
+ "version": "4.6.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz",
+ "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg=="
},
"unbox-primitive": {
"version": "1.0.1",
diff --git a/npm-packages/meteor-babel/package.json b/npm-packages/meteor-babel/package.json
index a896f5a3a1..56a18465f3 100644
--- a/npm-packages/meteor-babel/package.json
+++ b/npm-packages/meteor-babel/package.json
@@ -1,7 +1,7 @@
{
"name": "@meteorjs/babel",
"author": "Meteor ",
- "version": "7.16.0-beta.1",
+ "version": "7.18.0-beta.4",
"license": "MIT",
"description": "Babel wrapper package for use with Meteor",
"keywords": [
@@ -37,7 +37,7 @@
"@babel/plugin-transform-modules-commonjs": "^7.16.8",
"@babel/plugin-transform-runtime": "^7.17.0",
"@babel/preset-react": "^7.16.7",
- "@babel/runtime": "^7.17.2",
+ "@babel/runtime": "7.17.2",
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.17.0",
"@babel/types": "^7.17.0",
@@ -47,7 +47,7 @@
"convert-source-map": "^1.6.0",
"lodash": "^4.17.21",
"meteor-babel-helpers": "0.0.3",
- "typescript": "^4.5.4"
+ "typescript": "~4.6.4"
},
"devDependencies": {
"@babel/plugin-proposal-decorators": "7.14.5",
diff --git a/npm-packages/meteor-babel/plugins/async-await.js b/npm-packages/meteor-babel/plugins/async-await.js
index c1745ba2f9..9110ae383a 100644
--- a/npm-packages/meteor-babel/plugins/async-await.js
+++ b/npm-packages/meteor-babel/plugins/async-await.js
@@ -9,7 +9,7 @@ module.exports = function (babel) {
Function: {
exit: function (path) {
const node = path.node;
- if (! node.async) {
+ if (!node.async) {
return;
}
diff --git a/npm-packages/meteor-babel/runtime.js b/npm-packages/meteor-babel/runtime.js
index 43b5c85c85..c7fe580b3f 100644
--- a/npm-packages/meteor-babel/runtime.js
+++ b/npm-packages/meteor-babel/runtime.js
@@ -11,19 +11,21 @@ Module.prototype.resolve = function (id) {
require("@meteorjs/reify/lib/runtime").enable(Module.prototype);
-require("meteor-promise").makeCompatible(
- global.Promise = global.Promise ||
- require("promise/lib/es6-extensions"),
- require("fibers")
-);
+if (!process.env.DISABLE_FIBERS) {
+ require("meteor-promise").makeCompatible(
+ global.Promise = global.Promise ||
+ require("promise/lib/es6-extensions"),
+ require("fibers")
+ );
// If Promise.asyncApply is defined, use it to wrap calls to
// regeneratorRuntime.async so that the entire async function will run in
// its own Fiber, not just the code that comes after the first await.
-if (typeof Promise.asyncApply === "function") {
- var regeneratorRuntime = require("@babel/runtime/regenerator");
- var realAsync = regeneratorRuntime.async;
- regeneratorRuntime.async = function (innerFn) {
- return Promise.asyncApply(realAsync, regeneratorRuntime, arguments);
- };
+ if (typeof Promise.asyncApply === "function") {
+ var regeneratorRuntime = require("@babel/runtime/regenerator");
+ var realAsync = regeneratorRuntime.async;
+ regeneratorRuntime.async = function (innerFn) {
+ return Promise.asyncApply(realAsync, regeneratorRuntime, arguments);
+ };
+ }
}
diff --git a/npm-packages/meteor-installer/README.md b/npm-packages/meteor-installer/README.md
index 91ad13de8f..54dc2a47b1 100644
--- a/npm-packages/meteor-installer/README.md
+++ b/npm-packages/meteor-installer/README.md
@@ -14,6 +14,8 @@ npm install -g meteor
| NPM Package | Meteor Official Release |
|-------------|-------------------------|
+| 2.9.1 | 2.9.1 |
+| 2.9.0 | 2.9.0 |
| 2.8.2 | 2.8.1 |
| 2.8.1 | 2.8.1 |
| 2.8.0 | 2.8.0 |
diff --git a/npm-packages/meteor-installer/config.js b/npm-packages/meteor-installer/config.js
index 676cf07665..4c2e1ac925 100644
--- a/npm-packages/meteor-installer/config.js
+++ b/npm-packages/meteor-installer/config.js
@@ -1,7 +1,7 @@
const path = require('path');
const os = require('os');
-const METEOR_LATEST_VERSION = '2.8.1';
+const METEOR_LATEST_VERSION = '2.9.1';
const sudoUser = process.env.SUDO_USER || '';
function isRoot() {
return process.getuid && process.getuid() === 0;
diff --git a/npm-packages/meteor-installer/package.json b/npm-packages/meteor-installer/package.json
index 8afbd9c39e..af52942de4 100644
--- a/npm-packages/meteor-installer/package.json
+++ b/npm-packages/meteor-installer/package.json
@@ -1,6 +1,6 @@
{
"name": "meteor",
- "version": "2.8.2",
+ "version": "2.9.1",
"description": "Install Meteor",
"main": "install.js",
"scripts": {
diff --git a/packages/accounts-base/accounts_client.js b/packages/accounts-base/accounts_client.js
index cfded81faa..842e927ad9 100644
--- a/packages/accounts-base/accounts_client.js
+++ b/packages/accounts-base/accounts_client.js
@@ -798,6 +798,11 @@ if (Package.blaze) {
*/
Template.registerHelper('currentUser', () => Meteor.user());
+ // TODO: the code above needs to be changed to Meteor.userAsync() when we have
+ // a way to make it reactive using async.
+ // Template.registerHelper('currentUserAsync',
+ // async () => await Meteor.userAsync());
+
/**
* @global
* @name loggingIn
diff --git a/packages/accounts-base/accounts_client_tests.js b/packages/accounts-base/accounts_client_tests.js
index 9ebb7d4b9f..880a71e4fe 100644
--- a/packages/accounts-base/accounts_client_tests.js
+++ b/packages/accounts-base/accounts_client_tests.js
@@ -94,6 +94,20 @@ Tinytest.addAsync(
}
);
+Tinytest.addAsync(
+ 'accounts async - Meteor.loggingIn() is false after login has completed',
+ (test, done) => {
+ logoutAndCreateUser(test, done, () => {
+ // Login then verify loggingIn is false after login has completed
+ Meteor.loginWithPassword(username, password, async () => {
+ test.isFalse(Meteor.loggingIn());
+ test.isTrue(await Meteor.userAsync());
+ removeTestUser(done);
+ });
+ });
+ }
+);
+
Tinytest.addAsync(
'accounts - Meteor.loggingOut() is true right after a logout call',
(test, done) => {
@@ -150,7 +164,7 @@ Tinytest.addAsync(
);
Tinytest.addAsync(
- 'accounts - Meteor.user obeys explicit and default field selectors',
+ 'accounts - Meteor.user() obeys explicit and default field selectors',
(test, done) => {
logoutAndCreateUser(test, done, () => {
Meteor.loginWithPassword(username, password, () => {
@@ -178,6 +192,38 @@ Tinytest.addAsync(
}
);
+Tinytest.addAsync(
+ 'accounts async - Meteor.userAsync() obeys explicit and default field selectors',
+ (test, done) => {
+ logoutAndCreateUser(test, done, () => {
+ Meteor.loginWithPassword(username, password, async () => {
+ // by default, all fields should be returned
+ let user;
+ user = await Meteor.userAsync();
+ test.equal(user.profile[excludeField], excludeValue);
+
+ // this time we want to exclude the default fields
+ const options = Accounts._options;
+ Accounts._options = {};
+ Accounts.config({ defaultFieldSelector: { ['profile.' + defaultExcludeField]: 0 } });
+
+ user = await Meteor.userAsync();
+ test.isUndefined(user.profile[defaultExcludeField]);
+ test.equal(user.profile[excludeField], excludeValue);
+ test.equal(user.profile.name, username);
+
+ // this time we only want certain fields...
+
+ user = await Meteor.userAsync({ fields: { 'profile.name': 1 } });
+ test.isUndefined(user.profile[excludeField]);
+ test.isUndefined(user.profile[defaultExcludeField]);
+ test.equal(user.profile.name, username);
+ Accounts._options = options;
+ removeTestUser(done);
+ });
+ });
+ }
+);
Tinytest.addAsync(
'accounts-2fa - Meteor.loginWithPasswordAnd2faCode() fails when token is not provided',
diff --git a/packages/accounts-base/accounts_common.js b/packages/accounts-base/accounts_common.js
index b94e927a2d..edca3cd31b 100644
--- a/packages/accounts-base/accounts_common.js
+++ b/packages/accounts-base/accounts_common.js
@@ -79,40 +79,6 @@ export class AccountsCommon {
// should come up with a more generic way to do this (eg, with some sort of
// symbolic error code rather than a number).
this.LoginCancelledError.numericError = 0x8acdc2f;
-
- // loginServiceConfiguration and ConfigError are maintained for backwards compatibility
- Meteor.startup(() => {
- const { ServiceConfiguration } = Package['service-configuration'];
- this.loginServiceConfiguration = ServiceConfiguration.configurations;
- this.ConfigError = ServiceConfiguration.ConfigError;
-
- const settings = Meteor.settings?.packages?.['accounts-base'];
- if (settings) {
- if (settings.oauthSecretKey) {
- if (!Package['oauth-encryption']) {
- throw new Error(
- 'The oauth-encryption package must be loaded to set oauthSecretKey'
- );
- }
- Package['oauth-encryption'].OAuthEncryption.loadKey(
- settings.oauthSecretKey
- );
- delete settings.oauthSecretKey;
- }
- // Validate config options keys
- Object.keys(settings).forEach(key => {
- if (!VALID_CONFIG_KEYS.includes(key)) {
- // TODO Consider just logging a debug message instead to allow for additional keys in the settings here?
- throw new Meteor.Error(
- `Accounts configuration: Invalid key: ${key}`
- );
- } else {
- // set values in Accounts._options
- this._options[key] = settings[key];
- }
- });
- }
- });
}
/**
@@ -170,6 +136,18 @@ export class AccountsCommon {
: null;
}
+ /**
+ * @summary Get the current user record, or `null` if no user is logged in.
+ * @locus Anywhere
+ * @param {Object} [options]
+ * @param {MongoFieldSpecifier} options.fields Dictionary of fields to return or exclude.
+ */
+ async userAsync(options) {
+ const userId = this.userId();
+ return userId
+ ? this.users.findOneAsync(userId, this._addDefaultFieldSelector(options))
+ : null;
+ }
// Set up config for the accounts system. Call this on both the client
// and the server.
//
@@ -264,6 +242,7 @@ export class AccountsCommon {
// Validate config options keys
Object.keys(options).forEach(key => {
if (!VALID_CONFIG_KEYS.includes(key)) {
+ // TODO Consider just logging a debug message instead to allow for additional keys in the settings here?
throw new Meteor.Error(`Accounts.config: Invalid key: ${key}`);
}
});
@@ -418,6 +397,15 @@ Meteor.userId = () => Accounts.userId();
*/
Meteor.user = options => Accounts.user(options);
+/**
+ * @summary Get the current user record, or `null` if no user is logged in. A reactive data source.
+ * @locus Anywhere but publish functions
+ * @importFromPackage meteor
+ * @param {Object} [options]
+ * @param {MongoFieldSpecifier} options.fields Dictionary of fields to return or exclude.
+ */
+Meteor.userAsync = options => Accounts.userAsync(options);
+
// how long (in days) until a login token expires
const DEFAULT_LOGIN_EXPIRATION_DAYS = 90;
// how long (in days) until reset password token expires
@@ -430,9 +418,6 @@ const DEFAULT_PASSWORD_ENROLL_TOKEN_EXPIRATION_DAYS = 30;
const MIN_TOKEN_LIFETIME_CAP_SECS = 3600; // one hour
// how often (in milliseconds) we check for expired tokens
export const EXPIRE_TOKENS_INTERVAL_MS = 600 * 1000; // 10 minutes
-// how long we wait before logging out clients when Meteor.logoutOtherClients is
-// called
-export const CONNECTION_CLOSE_DELAY_MS = 10 * 1000;
// A large number of expiration days (approximately 100 years worth) that is
// used when creating unexpiring tokens.
const LOGIN_UNEXPIRING_TOKEN_DAYS = 365 * 100;
diff --git a/packages/accounts-base/accounts_server.js b/packages/accounts-base/accounts_server.js
index f677baa34c..2fd0a6d41b 100644
--- a/packages/accounts-base/accounts_server.js
+++ b/packages/accounts-base/accounts_server.js
@@ -1,4 +1,5 @@
import crypto from 'crypto';
+import { Meteor } from 'meteor/meteor'
import {
AccountsCommon,
EXPIRE_TOKENS_INTERVAL_MS,
@@ -434,7 +435,7 @@ export class AccountsServer extends AccountsCommon {
// If the login is allowed and isn't aborted by a validate login hook
// callback, log in the user.
//
- _attemptLogin(
+ async _attemptLogin(
methodInvocation,
methodName,
methodArgs,
@@ -494,18 +495,18 @@ export class AccountsServer extends AccountsCommon {
// Ensure that thrown exceptions are caught and that login hook
// callbacks are still called.
//
- _loginMethod(
+ async _loginMethod(
methodInvocation,
methodName,
methodArgs,
type,
fn
) {
- return this._attemptLogin(
+ return await this._attemptLogin(
methodInvocation,
methodName,
methodArgs,
- tryLoginMethod(type, fn)
+ await tryLoginMethod(type, fn)
);
};
@@ -582,11 +583,10 @@ export class AccountsServer extends AccountsCommon {
// Try all of the registered login handlers until one of them doesn't
// return `undefined`, meaning it handled this call to `login`. Return
// that return value.
- _runLoginHandlers(methodInvocation, options) {
+ async _runLoginHandlers(methodInvocation, options) {
for (let handler of this._loginHandlers) {
- const result = tryLoginMethod(
- handler.name,
- () => handler.handler.call(methodInvocation, options)
+ const result = await tryLoginMethod(handler.name, async () =>
+ await handler.handler.call(methodInvocation, options)
);
if (result) {
@@ -594,7 +594,10 @@ export class AccountsServer extends AccountsCommon {
}
if (result !== undefined) {
- throw new Meteor.Error(400, "A login handler should return a result or undefined");
+ throw new Meteor.Error(
+ 400,
+ 'A login handler should return a result or undefined'
+ );
}
}
@@ -639,14 +642,15 @@ export class AccountsServer extends AccountsCommon {
// If successful, returns {token: reconnectToken, id: userId}
// If unsuccessful (for example, if the user closed the oauth login popup),
// throws an error describing the reason
- methods.login = function (options) {
+ methods.login = async function (options) {
// Login handlers should really also check whatever field they look at in
// options, but we don't enforce it.
check(options, Object);
- const result = accounts._runLoginHandlers(this, options);
+ const result = await accounts._runLoginHandlers(this, options);
+ //console.log({result});
- return accounts._attemptLogin(this, "login", arguments, result);
+ return await accounts._attemptLogin(this, "login", arguments, result);
};
methods.logout = function () {
@@ -721,14 +725,19 @@ export class AccountsServer extends AccountsCommon {
throw new Meteor.Error(403, "Service unknown");
}
- const { ServiceConfiguration } = Package['service-configuration'];
- if (ServiceConfiguration.configurations.findOne({service: options.service}))
- throw new Meteor.Error(403, `Service ${options.service} already configured`);
+ if (Package['service-configuration']) {
+ const { ServiceConfiguration } = Package['service-configuration'];
+ if (ServiceConfiguration.configurations.findOne({service: options.service}))
+ throw new Meteor.Error(403, `Service ${options.service} already configured`);
- if (hasOwn.call(options, 'secret') && usingOAuthEncryption())
- options.secret = OAuthEncryption.seal(options.secret);
+ if (Package["oauth-encryption"]) {
+ const { OAuthEncryption } = Package["oauth-encryption"]
+ if (hasOwn.call(options, 'secret') && OAuthEncryption.keyIsLoaded())
+ options.secret = OAuthEncryption.seal(options.secret);
+ }
- ServiceConfiguration.configurations.insert(options);
+ ServiceConfiguration.configurations.insert(options);
+ }
};
accounts._server.methods(methods);
@@ -753,8 +762,10 @@ export class AccountsServer extends AccountsCommon {
// Publish all login service configuration fields other than secret.
this._server.publish("meteor.loginServiceConfiguration", () => {
- const { ServiceConfiguration } = Package['service-configuration'];
- return ServiceConfiguration.configurations.find({}, {fields: {secret: 0}});
+ if (Package['service-configuration']) {
+ const { ServiceConfiguration } = Package['service-configuration'];
+ return ServiceConfiguration.configurations.find({}, {fields: {secret: 0}});
+ }
}, {is_auto: true}); // not technically autopublish, but stops the warning.
// Use Meteor.startup to give other packages a chance to call
@@ -1507,10 +1518,10 @@ const cloneAttemptWithConnection = (connection, attempt) => {
return clonedAttempt;
};
-const tryLoginMethod = (type, fn) => {
+const tryLoginMethod = async (type, fn) => {
let result;
try {
- result = fn();
+ result = await fn();
}
catch (e) {
result = {error: e};
@@ -1679,17 +1690,7 @@ const setExpireTokensInterval = accounts => {
}, EXPIRE_TOKENS_INTERVAL_MS);
};
-///
-/// OAuth Encryption Support
-///
-
-const OAuthEncryption =
- Package["oauth-encryption"] &&
- Package["oauth-encryption"].OAuthEncryption;
-
-const usingOAuthEncryption = () => {
- return OAuthEncryption && OAuthEncryption.keyIsLoaded();
-};
+const OAuthEncryption = Package["oauth-encryption"]?.OAuthEncryption;
// OAuth service data is temporarily stored in the pending credentials
// collection during the oauth authentication process. Sensitive data
@@ -1701,44 +1702,12 @@ const usingOAuthEncryption = () => {
const pinEncryptedFieldsToUser = (serviceData, userId) => {
Object.keys(serviceData).forEach(key => {
let value = serviceData[key];
- if (OAuthEncryption && OAuthEncryption.isSealed(value))
+ if (OAuthEncryption?.isSealed(value))
value = OAuthEncryption.seal(OAuthEncryption.open(value), userId);
serviceData[key] = value;
});
};
-
-// Encrypt unencrypted login service secrets when oauth-encryption is
-// added.
-//
-// XXX For the oauthSecretKey to be available here at startup, the
-// developer must call Accounts.config({oauthSecretKey: ...}) at load
-// time, instead of in a Meteor.startup block, because the startup
-// block in the app code will run after this accounts-base startup
-// block. Perhaps we need a post-startup callback?
-
-Meteor.startup(() => {
- if (! usingOAuthEncryption()) {
- return;
- }
-
- const { ServiceConfiguration } = Package['service-configuration'];
-
- ServiceConfiguration.configurations.find({
- $and: [{
- secret: { $exists: true }
- }, {
- "secret.algorithm": { $exists: false }
- }]
- }).forEach(config => {
- ServiceConfiguration.configurations.update(config._id, {
- $set: {
- secret: OAuthEncryption.seal(config.secret)
- }
- });
- });
-});
-
// XXX see comment on Accounts.createUser in passwords_server about adding a
// second "server options" argument.
const defaultCreateUserHook = (options, user) => {
diff --git a/packages/accounts-base/accounts_tests.js b/packages/accounts-base/accounts_tests.js
index de870e0f81..797bd758f0 100644
--- a/packages/accounts-base/accounts_tests.js
+++ b/packages/accounts-base/accounts_tests.js
@@ -604,6 +604,62 @@ Tinytest.add(
}
);
+
+Tinytest.addAsync(
+ 'accounts async - Meteor.userAsync() obeys options.defaultFieldSelector',
+ async test => {
+ const ignoreFieldName = "bigArray";
+ const customField = "customField";
+ const userId = Accounts.insertUserDoc({}, { username: Random.id(), [ignoreFieldName]: [1], [customField]: 'test' });
+ const stampedToken = Accounts._generateStampedLoginToken();
+ Accounts._insertLoginToken(userId, stampedToken);
+ const options = Accounts._options;
+
+ // stub Meteor.userId() so it works outside methods and returns the correct user:
+ const origAccountsUserId = Accounts.userId;
+ Accounts.userId = () => userId;
+
+ Accounts._options = {};
+
+ // test the field is included by default
+ let user = await Meteor.userAsync();
+ test.isNotUndefined(user[ignoreFieldName], 'included by default');
+
+ // test the field is excluded
+ Accounts.config({ defaultFieldSelector: { [ignoreFieldName]: 0 } });
+ user = await Meteor.userAsync();
+ test.isUndefined(user[ignoreFieldName], 'excluded');
+ user = await Meteor.userAsync({});
+ test.isUndefined(user[ignoreFieldName], 'excluded {}');
+
+ // test the field can still be retrieved if required
+ user = await Meteor.userAsync({ fields: { [ignoreFieldName]: 1 } });
+ test.isNotUndefined(user[ignoreFieldName], 'field can be retrieved');
+ test.isUndefined(user.username, 'field can be retrieved username');
+
+ // test a combined negative field specifier
+ user = await Meteor.userAsync({ fields: { username: 0 } });
+ test.isUndefined(user[ignoreFieldName], 'combined field selector');
+ test.isUndefined(user.username, 'combined field selector username');
+
+ // test an explicit request for the full user object
+ user = await Meteor.userAsync({ fields: {} });
+ test.isNotUndefined(user[ignoreFieldName], 'full selector');
+ test.isNotUndefined(user.username, 'full selector username');
+
+ Accounts._options = {};
+
+ // Test that a custom field gets retrieved properly
+ Accounts.config({ defaultFieldSelector: { [customField]: 1 } });
+ user = await Meteor.userAsync();
+ test.isNotUndefined(user[customField]);
+ test.isUndefined(user.username);
+ test.isUndefined(user[ignoreFieldName]);
+
+ Accounts._options = options;
+ Accounts.userId = origAccountsUserId;
+ }
+);
Tinytest.add(
'accounts - verify onExternalLogin hook can update oauth user profiles',
test => {
diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js
index 90f03e6b50..61a19fd4ba 100644
--- a/packages/accounts-base/package.js
+++ b/packages/accounts-base/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: 'A user account system',
- version: '2.2.5',
+ version: '2.2.6',
});
Package.onUse(api => {
@@ -15,10 +15,6 @@ Package.onUse(api => {
api.use('reactive-var', 'client');
api.use('url', ['client', 'server']);
- // use unordered to work around a circular dependency
- // (service-configuration needs Accounts.connection)
- api.use('service-configuration', ['client', 'server'], { unordered: true });
-
// needed for getting the currently logged-in user and handling reconnects
api.use('ddp', ['client', 'server']);
diff --git a/packages/accounts-oauth/oauth_common.js b/packages/accounts-oauth/oauth_common.js
index e0e1a1ad48..bfb99b0a5d 100644
--- a/packages/accounts-oauth/oauth_common.js
+++ b/packages/accounts-oauth/oauth_common.js
@@ -1,3 +1,24 @@
+import { Meteor } from 'meteor/meteor';
+
+// TODO get from account-base
+// config option keys
+const VALID_CONFIG_KEYS = [
+ 'sendVerificationEmail',
+ 'forbidClientAccountCreation',
+ 'passwordEnrollTokenExpiration',
+ 'passwordEnrollTokenExpirationInDays',
+ 'restrictCreationByEmailDomain',
+ 'loginExpirationInDays',
+ 'loginExpiration',
+ 'passwordResetTokenExpirationInDays',
+ 'passwordResetTokenExpiration',
+ 'ambiguousErrorMessages',
+ 'bcryptRounds',
+ 'defaultFieldSelector',
+ 'loginTokenExpirationHours',
+ 'tokenSequenceLength',
+];
+
Accounts.oauth = {};
const services = {};
@@ -31,3 +52,37 @@ Accounts.oauth.unregisterService = name => {
};
Accounts.oauth.serviceNames = () => Object.keys(services);
+
+// loginServiceConfiguration and ConfigError are maintained for backwards compatibility
+Meteor.startup(() => {
+ const { ServiceConfiguration } = Package['service-configuration'];
+ Accounts.loginServiceConfiguration = ServiceConfiguration.configurations;
+ Accounts.ConfigError = ServiceConfiguration.ConfigError;
+
+ const settings = Meteor.settings?.packages?.['accounts-base'];
+ if (settings) {
+ if (settings.oauthSecretKey) {
+ if (!Package['oauth-encryption']) {
+ throw new Error(
+ 'The oauth-encryption package must be loaded to set oauthSecretKey'
+ );
+ }
+ Package['oauth-encryption'].OAuthEncryption.loadKey(
+ settings.oauthSecretKey
+ );
+ delete settings.oauthSecretKey;
+ }
+ // Validate config options keys
+ Object.keys(settings).forEach(key => {
+ if (!VALID_CONFIG_KEYS.includes(key)) {
+ // TODO Consider just logging a debug message instead to allow for additional keys in the settings here?
+ throw new Meteor.Error(
+ `Accounts configuration: Invalid key: ${key}`
+ );
+ } else {
+ // set values in Accounts._options
+ Accounts._options[key] = settings[key];
+ }
+ });
+ }
+});
diff --git a/packages/accounts-oauth/oauth_server.js b/packages/accounts-oauth/oauth_server.js
index c76b2e439b..f8d67eff25 100644
--- a/packages/accounts-oauth/oauth_server.js
+++ b/packages/accounts-oauth/oauth_server.js
@@ -1,3 +1,5 @@
+import { Meteor } from 'meteor/meteor';
+
// Listen to calls to `login` with an oauth option set. This is where
// users actually get logged in to meteor via oauth.
Accounts.registerLoginHandler(options => {
@@ -55,3 +57,44 @@ Accounts.registerLoginHandler(options => {
return Accounts.updateOrCreateUserFromExternalService(result.serviceName, result.serviceData, result.options);
}
});
+
+///
+/// OAuth Encryption Support
+///
+
+const OAuthEncryption = Package["oauth-encryption"]?.OAuthEncryption;
+
+const usingOAuthEncryption = () => {
+ return OAuthEncryption?.keyIsLoaded();
+};
+
+// Encrypt unencrypted login service secrets when oauth-encryption is
+// added.
+//
+// XXX For the oauthSecretKey to be available here at startup, the
+// developer must call Accounts.config({oauthSecretKey: ...}) at load
+// time, instead of in a Meteor.startup block, because the startup
+// block in the app code will run after this accounts-base startup
+// block. Perhaps we need a post-startup callback?
+
+Meteor.startup(() => {
+ if (! usingOAuthEncryption()) {
+ return;
+ }
+
+ const { ServiceConfiguration } = Package['service-configuration'];
+
+ ServiceConfiguration.configurations.find({
+ $and: [{
+ secret: { $exists: true }
+ }, {
+ "secret.algorithm": { $exists: false }
+ }]
+ }).forEach(config => {
+ ServiceConfiguration.configurations.update(config._id, {
+ $set: {
+ secret: OAuthEncryption.seal(config.secret)
+ }
+ });
+ });
+});
diff --git a/packages/accounts-oauth/package.js b/packages/accounts-oauth/package.js
index f20513769d..d26a1ff571 100644
--- a/packages/accounts-oauth/package.js
+++ b/packages/accounts-oauth/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Common code for OAuth-based login services",
- version: "1.4.1",
+ version: "1.4.2",
});
Package.onUse(api => {
@@ -9,6 +9,11 @@ Package.onUse(api => {
api.use(['accounts-base', 'ecmascript'], ['client', 'server']);
// Export Accounts (etc) to packages using this one.
api.imply('accounts-base', ['client', 'server']);
+
+ // use unordered to work around a circular dependency
+ // (service-configuration needs Accounts.connection)
+ api.use('service-configuration', ['client', 'server'], { unordered: true });
+
api.use('oauth');
api.addFiles('oauth_common.js');
diff --git a/packages/accounts-password/package.js b/packages/accounts-password/package.js
index c4f9cadbd3..2b23a6373d 100644
--- a/packages/accounts-password/package.js
+++ b/packages/accounts-password/package.js
@@ -5,7 +5,7 @@ Package.describe({
// 2.2.x in the future. The version was also bumped to 2.0.0 temporarily
// during the Meteor 1.5.1 release process, so versions 2.0.0-beta.2
// through -beta.5 and -rc.0 have already been published.
- version: '2.3.1',
+ version: '2.3.3',
});
Npm.depends({
diff --git a/packages/accounts-password/password_client.js b/packages/accounts-password/password_client.js
index 5d1279782b..a55609919e 100644
--- a/packages/accounts-password/password_client.js
+++ b/packages/accounts-password/password_client.js
@@ -7,12 +7,10 @@ const reportError = (error, callback) => {
}
};
-
const internalLoginWithPassword = ({ selector, password, code, callback }) => {
if (typeof selector === 'string')
if (!selector.includes('@')) selector = { username: selector };
else selector = { email: selector };
-
Accounts.callLoginMethod({
methodArguments: [
{
@@ -203,7 +201,7 @@ Accounts.forgotPassword = (options, callback) => {
// @param callback (optional) {Function(error|undefined)}
/**
- * @summary Reset the password for a user using a token received in email. Logs the user in afterwards.
+ * @summary Reset the password for a user using a token received in email. Logs the user in afterwards if the user doesn't have 2FA enabled.
* @locus Client
* @param {String} token The token retrieved from the reset password URL.
* @param {String} newPassword A new password for the user. This is __not__ sent in plain text over the wire.
@@ -236,7 +234,7 @@ Accounts.resetPassword = (token, newPassword, callback) => {
// @param callback (optional) {Function(error|undefined)}
/**
- * @summary Marks the user's email address as verified. Logs the user in afterwards.
+ * @summary Marks the user's email address as verified. Logs the user in afterwards if the user doesn't have 2FA enabled.
* @locus Client
* @param {String} token The token retrieved from the verification URL.
* @param {Function} [callback] Optional callback. Called with no arguments on success, or with a single `Error` argument on failure.
diff --git a/packages/accounts-password/password_server.js b/packages/accounts-password/password_server.js
index ea1236313c..198b7a9c34 100644
--- a/packages/accounts-password/password_server.js
+++ b/packages/accounts-password/password_server.js
@@ -1,8 +1,5 @@
-import bcrypt from 'bcrypt'
-import {Accounts} from "meteor/accounts-base";
-
-const bcryptHash = Meteor.wrapAsync(bcrypt.hash);
-const bcryptCompare = Meteor.wrapAsync(bcrypt.compare);
+import { hash as bcryptHash, compare as bcryptCompare } from 'bcrypt';
+import { Accounts } from "meteor/accounts-base";
// Utility for grabbing user
const getUserById = (id, options) => Meteor.users.findOne(id, Accounts._addDefaultFieldSelector(options));
@@ -48,9 +45,9 @@ const getPasswordString = password => {
// SHA256 before bcrypt) or an object with properties `digest` and
// `algorithm` (in which case we bcrypt `password.digest`).
//
-const hashPassword = password => {
+const hashPassword = async password => {
password = getPasswordString(password);
- return bcryptHash(password, Accounts._bcryptRounds());
+ return await bcryptHash(password, Accounts._bcryptRounds());
};
// Extract the number of rounds used in the specified bcrypt hash.
@@ -74,7 +71,7 @@ const getRoundsFromBcryptHash = hash => {
// The user parameter needs at least user._id and user.services
Accounts._checkPasswordUserFields = {_id: 1, services: 1};
//
-Accounts._checkPassword = (user, password) => {
+const checkPasswordAsync = async (user, password) => {
const result = {
userId: user._id
};
@@ -83,15 +80,16 @@ Accounts._checkPassword = (user, password) => {
const hash = user.services.password.bcrypt;
const hashRounds = getRoundsFromBcryptHash(hash);
- if (! bcryptCompare(formattedPassword, hash)) {
+ if (! await bcryptCompare(formattedPassword, hash)) {
result.error = Accounts._handleError("Incorrect password", false);
} else if (hash && Accounts._bcryptRounds() != hashRounds) {
// The password checks out, but the user's bcrypt hash needs to be updated.
- Meteor.defer(() => {
+
+ Meteor.defer(async () => {
Meteor.users.update({ _id: user._id }, {
$set: {
'services.password.bcrypt':
- bcryptHash(formattedPassword, Accounts._bcryptRounds())
+ await bcryptHash(formattedPassword, Accounts._bcryptRounds())
}
});
});
@@ -99,7 +97,13 @@ Accounts._checkPassword = (user, password) => {
return result;
};
-const checkPassword = Accounts._checkPassword;
+
+const checkPassword = (user, password) => {
+ return Promise.await(checkPasswordAsync(user, password));
+};
+
+Accounts._checkPassword = checkPassword;
+Accounts._checkPasswordAsync = checkPasswordAsync;
///
/// LOGIN
@@ -163,7 +167,7 @@ const passwordValidator = Match.OneOf(
//
// Note that neither password option is secure without SSL.
//
-Accounts.registerLoginHandler("password", options => {
+Accounts.registerLoginHandler("password", async options => {
if (!options.password)
return undefined; // don't handle
@@ -188,7 +192,7 @@ Accounts.registerLoginHandler("password", options => {
Accounts._handleError("User has no password set");
}
- const result = checkPassword(user, options.password);
+ const result = await checkPasswordAsync(user, options.password);
// This method is added by the package accounts-2fa
// First the login is validated, then the code situation is checked
if (
@@ -258,7 +262,7 @@ Accounts.setUsername = (userId, newUsername) => {
// Let the user change their own password if they know the old
// password. `oldPassword` and `newPassword` should be objects with keys
// `digest` and `algorithm` (representing the SHA256 of the password).
-Meteor.methods({changePassword: function (oldPassword, newPassword) {
+Meteor.methods({changePassword: async function (oldPassword, newPassword) {
check(oldPassword, passwordValidator);
check(newPassword, passwordValidator);
@@ -278,12 +282,12 @@ Meteor.methods({changePassword: function (oldPassword, newPassword) {
Accounts._handleError("User has no password set");
}
- const result = checkPassword(user, oldPassword);
+ const result = await checkPasswordAsync(user, oldPassword);
if (result.error) {
throw result.error;
}
- const hashed = hashPassword(newPassword);
+ const hashed = await hashPassword(newPassword);
// It would be better if this removed ALL existing tokens and replaced
// the token for the current connection with a new one, but that would
@@ -316,10 +320,10 @@ Meteor.methods({changePassword: function (oldPassword, newPassword) {
* @param {Object} options.logout Logout all current connections with this userId (default: true)
* @importFromPackage accounts-base
*/
-Accounts.setPassword = (userId, newPlaintextPassword, options) => {
- check(userId, String)
- check(newPlaintextPassword, Match.Where(str => Match.test(str, String) && str.length <= Meteor.settings?.packages?.accounts?.passwordMaxLength || 256))
- check(options, Match.Maybe({ logout: Boolean }))
+Accounts.setPasswordAsync = async (userId, newPlaintextPassword, options) => {
+ check(userId, String);
+ check(newPlaintextPassword, Match.Where(str => Match.test(str, String) && str.length <= Meteor.settings?.packages?.accounts?.passwordMaxLength || 256));
+ check(options, Match.Maybe({ logout: Boolean }));
options = { logout: true , ...options };
const user = getUserById(userId, {fields: {_id: 1}});
@@ -331,7 +335,7 @@ Accounts.setPassword = (userId, newPlaintextPassword, options) => {
$unset: {
'services.password.reset': 1
},
- $set: {'services.password.bcrypt': hashPassword(newPlaintextPassword)}
+ $set: {'services.password.bcrypt': await hashPassword(newPlaintextPassword)}
};
if (options.logout) {
@@ -341,6 +345,19 @@ Accounts.setPassword = (userId, newPlaintextPassword, options) => {
Meteor.users.update({_id: user._id}, update);
};
+/**
+ * @summary Forcibly change the password for a user.
+ * @locus Server
+ * @param {String} userId The id of the user to update.
+ * @param {String} newPassword A new password for the user.
+ * @param {Object} [options]
+ * @param {Object} options.logout Logout all current connections with this userId (default: true)
+ * @importFromPackage accounts-base
+ */
+Accounts.setPassword = (userId, newPlaintextPassword, options) => {
+ return Promise.await(Accounts.setPasswordAsync(userId, newPlaintextPassword, options));
+};
+
///
/// RESETTING VIA EMAIL
@@ -560,15 +577,15 @@ Accounts.sendEnrollmentEmail = (userId, email, extraTokenData, extraParams) => {
// Take token from sendResetPasswordEmail or sendEnrollmentEmail, change
// the users password, and log them in.
-Meteor.methods({resetPassword: function (...args) {
+Meteor.methods({resetPassword: async function (...args) {
const token = args[0];
const newPassword = args[1];
- return Accounts._loginMethod(
+ return await Accounts._loginMethod(
this,
"resetPassword",
args,
"password",
- () => {
+ async () => {
check(token, String);
check(newPassword, passwordValidator);
@@ -617,7 +634,7 @@ Meteor.methods({resetPassword: function (...args) {
error: new Meteor.Error(403, "Token has invalid email address")
};
- const hashed = hashPassword(newPassword);
+ const hashed = await hashPassword(newPassword);
// NOTE: We're about to invalidate tokens on the user, who we might be
// logged in as. Make sure to avoid logging ourselves out if this
@@ -670,6 +687,17 @@ Meteor.methods({resetPassword: function (...args) {
// password should invalidate existing sessions).
Accounts._clearAllLoginTokens(user._id);
+ if (Accounts._check2faEnabled?.(user)) {
+ return {
+ userId: user._id,
+ error: Accounts._handleError(
+ 'Changed password, but user not logged in because 2FA is enabled',
+ false,
+ '2fa-enabled'
+ ),
+ };
+ }
+
return {userId: user._id};
}
);
@@ -712,9 +740,9 @@ Accounts.sendVerificationEmail = (userId, email, extraTokenData, extraParams) =>
// Take token from sendVerificationEmail, mark the email as verified,
// and log them in.
-Meteor.methods({verifyEmail: function (...args) {
+Meteor.methods({verifyEmail: async function (...args) {
const token = args[0];
- return Accounts._loginMethod(
+ return await Accounts._loginMethod(
this,
"verifyEmail",
args,
@@ -761,6 +789,17 @@ Meteor.methods({verifyEmail: function (...args) {
{$set: {'emails.$.verified': true},
$pull: {'services.email.verificationTokens': {address: tokenRecord.address}}});
+ if (Accounts._check2faEnabled?.(user)) {
+ return {
+ userId: user._id,
+ error: Accounts._handleError(
+ 'Email verified, but user not logged in because 2FA is enabled',
+ false,
+ '2fa-enabled'
+ ),
+ };
+ }
+
return {userId: user._id};
}
);
@@ -888,7 +927,7 @@ Accounts.removeEmail = (userId, email) => {
// does the actual user insertion.
//
// returns the user id
-const createUser = options => {
+const createUser = async options => {
// Unknown keys allowed, because a onCreateUserHook can take arbitrary
// options.
check(options, Match.ObjectIncluding({
@@ -903,22 +942,22 @@ const createUser = options => {
const user = {services: {}};
if (password) {
- const hashed = hashPassword(password);
+ const hashed = await hashPassword(password);
user.services.password = { bcrypt: hashed };
}
- return Accounts._createUserCheckingDuplicates({ user, email, username, options })
+ return Accounts._createUserCheckingDuplicates({ user, email, username, options });
};
// method for create user. Requests come from the client.
-Meteor.methods({createUser: function (...args) {
+Meteor.methods({createUser: async function (...args) {
const options = args[0];
- return Accounts._loginMethod(
+ return await Accounts._loginMethod(
this,
"createUser",
args,
"password",
- () => {
+ async () => {
// createUser() above does more checking.
check(options, Object);
if (Accounts._options.forbidClientAccountCreation)
@@ -926,7 +965,7 @@ Meteor.methods({createUser: function (...args) {
error: new Meteor.Error(403, "Signups forbidden")
};
- const userId = Accounts.createUserVerifyingEmail(options);
+ const userId = await Accounts.createUserVerifyingEmail(options);
// client gets logged in as the new user afterwards.
return {userId: userId};
@@ -948,10 +987,10 @@ Meteor.methods({createUser: function (...args) {
* @param {Object} options.profile The user's profile, typically including the `name` field.
* @importFromPackage accounts-base
* */
-Accounts.createUserVerifyingEmail = (options) => {
+Accounts.createUserVerifyingEmail = async (options) => {
options = { ...options };
// Create user. result contains id and token.
- const userId = createUser(options);
+ const userId = await createUser(options);
// safety belt. createUser is supposed to throw on error. send 500 error
// instead of sending a verification email with empty userid.
if (! userId)
@@ -976,14 +1015,15 @@ Accounts.createUserVerifyingEmail = (options) => {
// Unlike the client version, this does not log you in as this user
// after creation.
//
-// returns userId or throws an error if it can't create
+// returns Promise or throws an error if it can't create
//
// XXX add another argument ("server options") that gets sent to onCreateUser,
// which is always empty when called from the createUser method? eg, "admin:
// true", which we want to prevent the client from setting, but which a custom
// method calling Accounts.createUser could set?
//
-Accounts.createUser = (options, callback) => {
+
+Accounts.createUserAsync = async (options, callback) => {
options = { ...options };
// XXX allow an optional callback?
@@ -994,6 +1034,23 @@ Accounts.createUser = (options, callback) => {
return createUser(options);
};
+// Create user directly on the server.
+//
+// Unlike the client version, this does not log you in as this user
+// after creation.
+//
+// returns userId or throws an error if it can't create
+//
+// XXX add another argument ("server options") that gets sent to onCreateUser,
+// which is always empty when called from the createUser method? eg, "admin:
+// true", which we want to prevent the client from setting, but which a custom
+// method calling Accounts.createUser could set?
+//
+
+Accounts.createUser = (options, callback) => {
+ return Promise.await(Accounts.createUserAsync(options, callback));
+};
+
///
/// PASSWORD-SPECIFIC INDEXES ON USERS
///
diff --git a/packages/accounts-password/password_tests.js b/packages/accounts-password/password_tests.js
index 23e7e6ca8c..0266c977f2 100644
--- a/packages/accounts-password/password_tests.js
+++ b/packages/accounts-password/password_tests.js
@@ -1747,7 +1747,7 @@ if (Meteor.isServer) (() => {
Tinytest.addAsync(
'passwords - allow custom bcrypt rounds',
- (test, done) => {
+ async (test, done) => {
const getUserHashRounds = user =>
Number(user.services.password.bcrypt.substring(4, 6));
@@ -1768,7 +1768,7 @@ if (Meteor.isServer) (() => {
const defaultRounds = Accounts._bcryptRounds();
const customRounds = 11;
Accounts._options.bcryptRounds = customRounds;
- Accounts._checkPassword(user1, password);
+ await Accounts._checkPasswordAsync(user1, password);
Meteor.setTimeout(() => {
user1 = Meteor.users.findOne(userId1);
rounds = getUserHashRounds(user1);
diff --git a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json
index 4453e83e92..453a9ea4d2 100644
--- a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json
+++ b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json
@@ -2,206 +2,213 @@
"lockfileVersion": 1,
"dependencies": {
"@ampproject/remapping": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
- "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg=="
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w=="
},
"@babel/code-frame": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
- "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q=="
},
"@babel/compat-data": {
- "version": "7.17.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz",
- "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz",
+ "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g=="
},
"@babel/core": {
- "version": "7.17.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz",
- "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz",
+ "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==",
"dependencies": {
"json5": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
- "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA=="
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
+ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
}
}
},
"@babel/generator": {
- "version": "7.17.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz",
- "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz",
+ "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A=="
+ }
+ }
},
"@babel/helper-annotate-as-pure": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
- "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
+ "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA=="
},
"@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
- "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz",
+ "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw=="
},
"@babel/helper-compilation-targets": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
- "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA=="
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+ "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ=="
},
"@babel/helper-create-class-features-plugin": {
- "version": "7.17.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz",
- "integrity": "sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz",
+ "integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww=="
},
"@babel/helper-create-regexp-features-plugin": {
- "version": "7.17.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz",
- "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz",
+ "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w=="
},
"@babel/helper-define-polyfill-provider": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
- "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA=="
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz",
+ "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww=="
},
"@babel/helper-environment-visitor": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
- "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="
},
"@babel/helper-explode-assignable-expression": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
- "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz",
+ "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg=="
},
"@babel/helper-function-name": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
- "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA=="
- },
- "@babel/helper-get-function-arity": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
- "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw=="
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+ "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w=="
},
"@babel/helper-hoist-variables": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
- "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q=="
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
- "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
+ "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg=="
},
"@babel/helper-module-imports": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
- "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="
},
"@babel/helper-module-transforms": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
- "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng=="
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
+ "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA=="
},
"@babel/helper-optimise-call-expression": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
- "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
+ "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA=="
},
"@babel/helper-plugin-utils": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
- "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA=="
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ=="
},
"@babel/helper-remap-async-to-generator": {
- "version": "7.16.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
- "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
+ "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA=="
},
"@babel/helper-replace-supers": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
- "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw=="
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz",
+ "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw=="
},
"@babel/helper-simple-access": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
- "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g=="
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA=="
},
"@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
- "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw=="
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
+ "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg=="
},
"@babel/helper-split-export-declaration": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
- "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA=="
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="
},
"@babel/helper-validator-identifier": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
- "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
},
"@babel/helper-validator-option": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
- "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw=="
},
"@babel/helper-wrap-function": {
- "version": "7.16.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
- "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+ "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q=="
},
"@babel/helpers": {
- "version": "7.17.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz",
- "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ=="
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz",
+ "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w=="
},
"@babel/highlight": {
- "version": "7.16.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
- "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g=="
},
"@babel/parser": {
- "version": "7.17.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz",
- "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz",
+ "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA=="
},
"@babel/plugin-proposal-async-generator-functions": {
- "version": "7.16.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
- "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ=="
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz",
+ "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g=="
},
"@babel/plugin-proposal-class-properties": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
- "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ=="
},
"@babel/plugin-proposal-logical-assignment-operators": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
- "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
+ "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q=="
},
"@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
- "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA=="
},
"@babel/plugin-proposal-object-rest-spread": {
- "version": "7.17.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz",
- "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw=="
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz",
+ "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ=="
},
"@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
- "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz",
+ "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw=="
},
"@babel/plugin-proposal-optional-chaining": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
- "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
+ "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w=="
},
"@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
@@ -219,9 +226,9 @@
"integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="
},
"@babel/plugin-syntax-jsx": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
- "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
+ "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q=="
},
"@babel/plugin-syntax-logical-assignment-operators": {
"version": "7.10.4",
@@ -249,139 +256,139 @@
"integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="
},
"@babel/plugin-transform-arrow-functions": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
- "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz",
+ "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ=="
},
"@babel/plugin-transform-async-to-generator": {
- "version": "7.16.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
- "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
+ "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag=="
},
"@babel/plugin-transform-block-scoped-functions": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
- "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz",
+ "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ=="
},
"@babel/plugin-transform-block-scoping": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
- "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz",
+ "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA=="
},
"@babel/plugin-transform-classes": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
- "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ=="
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz",
+ "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g=="
},
"@babel/plugin-transform-computed-properties": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
- "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
+ "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw=="
},
"@babel/plugin-transform-destructuring": {
- "version": "7.17.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz",
- "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg=="
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz",
+ "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw=="
},
"@babel/plugin-transform-exponentiation-operator": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
- "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz",
+ "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw=="
},
"@babel/plugin-transform-for-of": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
- "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg=="
+ "version": "7.18.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz",
+ "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ=="
},
"@babel/plugin-transform-literals": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
- "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
+ "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg=="
},
"@babel/plugin-transform-modules-commonjs": {
- "version": "7.16.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz",
- "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA=="
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz",
+ "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ=="
},
"@babel/plugin-transform-object-super": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
- "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz",
+ "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA=="
},
"@babel/plugin-transform-parameters": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
- "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz",
+ "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ=="
},
"@babel/plugin-transform-property-literals": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
- "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz",
+ "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg=="
},
"@babel/plugin-transform-react-display-name": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz",
- "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz",
+ "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA=="
},
"@babel/plugin-transform-react-jsx": {
- "version": "7.17.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz",
- "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ=="
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz",
+ "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg=="
},
"@babel/plugin-transform-react-jsx-development": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz",
- "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz",
+ "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA=="
},
"@babel/plugin-transform-react-pure-annotations": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz",
- "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz",
+ "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ=="
},
"@babel/plugin-transform-regenerator": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
- "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz",
+ "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ=="
},
"@babel/plugin-transform-runtime": {
- "version": "7.17.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz",
- "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A=="
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz",
+ "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw=="
},
"@babel/plugin-transform-shorthand-properties": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
- "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz",
+ "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw=="
},
"@babel/plugin-transform-spread": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
- "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg=="
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz",
+ "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w=="
},
"@babel/plugin-transform-sticky-regex": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
- "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz",
+ "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q=="
},
"@babel/plugin-transform-template-literals": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
- "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
+ "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA=="
},
"@babel/plugin-transform-typeof-symbol": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
- "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
+ "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw=="
},
"@babel/plugin-transform-unicode-regex": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
- "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz",
+ "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA=="
},
"@babel/preset-react": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz",
- "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA=="
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz",
+ "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg=="
},
"@babel/runtime": {
"version": "7.17.2",
@@ -389,39 +396,49 @@
"integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw=="
},
"@babel/template": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
- "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w=="
+ "version": "7.18.10",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
+ "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA=="
},
"@babel/traverse": {
- "version": "7.17.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz",
- "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz",
+ "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ=="
},
"@babel/types": {
- "version": "7.17.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz",
- "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw=="
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz",
+ "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg=="
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w=="
},
"@jridgewell/resolve-uri": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
- "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
},
"@jridgewell/sourcemap-codec": {
- "version": "1.4.11",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz",
- "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg=="
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
},
"@jridgewell/trace-mapping": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz",
- "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ=="
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g=="
},
"@meteorjs/babel": {
- "version": "7.16.0-beta.1",
- "resolved": "https://registry.npmjs.org/@meteorjs/babel/-/babel-7.16.0-beta.1.tgz",
- "integrity": "sha512-PSyp2+oO2nrGMBTXd3VAP0EzHLW4bFqRIzmbTfHnr/s0dGhb7XaaGg3sOGAInewrFNCWfMHNe3hSiyOvC9bS2A=="
+ "version": "7.17.2-beta.0",
+ "resolved": "https://registry.npmjs.org/@meteorjs/babel/-/babel-7.17.2-beta.0.tgz",
+ "integrity": "sha512-gFXgGNIUu2mVvLRTtEPRE8OdpbdwDY2+vAOSn4/O//w42n7xKBDuYkiyNQtXCWIVuEjO4UBFkX2CHD88eTKhxA=="
},
"@meteorjs/reify": {
"version": "0.23.0",
@@ -436,9 +453,9 @@
}
},
"@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
+ "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
},
"acorn": {
"version": "6.4.2",
@@ -463,38 +480,33 @@
"babel-helper-flip-expressions": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz",
- "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0="
+ "integrity": "sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA=="
},
"babel-helper-is-nodes-equiv": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
- "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ="
+ "integrity": "sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw=="
},
"babel-helper-is-void-0": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz",
- "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4="
+ "integrity": "sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg=="
},
"babel-helper-mark-eval-scopes": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz",
- "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI="
+ "integrity": "sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA=="
},
"babel-helper-remove-or-void": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz",
- "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA="
+ "integrity": "sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA=="
},
"babel-helper-to-multiple-sequence-expressions": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz",
"integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA=="
},
- "babel-plugin-dynamic-import-node": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
- "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ=="
- },
"babel-plugin-minify-builtins": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz",
@@ -506,14 +518,14 @@
"integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ=="
},
"babel-plugin-minify-dead-code-elimination": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz",
- "integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg=="
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.2.tgz",
+ "integrity": "sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA=="
},
"babel-plugin-minify-flip-comparisons": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz",
- "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo="
+ "integrity": "sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A=="
},
"babel-plugin-minify-guarded-expressions": {
"version": "0.4.4",
@@ -523,17 +535,17 @@
"babel-plugin-minify-infinity": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz",
- "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco="
+ "integrity": "sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA=="
},
"babel-plugin-minify-mangle-names": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz",
- "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw=="
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.1.tgz",
+ "integrity": "sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw=="
},
"babel-plugin-minify-numeric-literals": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz",
- "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw="
+ "integrity": "sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A=="
},
"babel-plugin-minify-replace": {
"version": "0.5.0",
@@ -548,62 +560,62 @@
"babel-plugin-minify-type-constructors": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz",
- "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA="
+ "integrity": "sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ=="
},
"babel-plugin-polyfill-corejs2": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
- "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w=="
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz",
+ "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q=="
},
"babel-plugin-polyfill-corejs3": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
- "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ=="
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz",
+ "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA=="
},
"babel-plugin-polyfill-regenerator": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
- "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A=="
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz",
+ "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw=="
},
"babel-plugin-transform-inline-consecutive-adds": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz",
- "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE="
+ "integrity": "sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q=="
},
"babel-plugin-transform-member-expression-literals": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz",
- "integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8="
+ "integrity": "sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q=="
},
"babel-plugin-transform-merge-sibling-variables": {
- "version": "6.9.4",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz",
- "integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4="
+ "version": "6.9.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.5.tgz",
+ "integrity": "sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw=="
},
"babel-plugin-transform-minify-booleans": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz",
- "integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg="
+ "integrity": "sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA=="
},
"babel-plugin-transform-property-literals": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz",
- "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk="
+ "integrity": "sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA=="
},
"babel-plugin-transform-regexp-constructors": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz",
- "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU="
+ "integrity": "sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g=="
},
"babel-plugin-transform-remove-console": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz",
- "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A="
+ "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg=="
},
"babel-plugin-transform-remove-debugger": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz",
- "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI="
+ "integrity": "sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw=="
},
"babel-plugin-transform-remove-undefined": {
"version": "0.5.0",
@@ -613,12 +625,12 @@
"babel-plugin-transform-simplify-comparison-operators": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz",
- "integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk="
+ "integrity": "sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A=="
},
"babel-plugin-transform-undefined-to-void": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz",
- "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA="
+ "integrity": "sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg=="
},
"babel-preset-meteor": {
"version": "7.10.0",
@@ -626,24 +638,19 @@
"integrity": "sha512-bcdNfRCQAjTV42cUcmaG5/ltLZZQLpZajUcP+o0Lr+aLTY/XLNkGfASM5383wdXiAkEFl0sDOXeknnLlQtrmdg=="
},
"babel-preset-minify": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz",
- "integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg=="
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.2.tgz",
+ "integrity": "sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w=="
},
"browserslist": {
- "version": "4.19.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.2.tgz",
- "integrity": "sha512-97XU1CTZ5TwU9Qy/Taj+RtiI6SQM1WIhZ9osT7EY0oO2aWXGABZT2OZeRL+6PfaQsiiMIjjwIoYFPq4APgspgQ=="
- },
- "call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw=="
},
"caniuse-lite": {
- "version": "1.0.30001312",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
- "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ=="
+ "version": "1.0.30001436",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz",
+ "integrity": "sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg=="
},
"chalk": {
"version": "2.4.2",
@@ -658,39 +665,27 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
},
"convert-source-map": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
- "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA=="
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
},
"core-js-compat": {
- "version": "3.21.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz",
- "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==",
- "dependencies": {
- "semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
- }
- }
+ "version": "3.26.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz",
+ "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A=="
},
"debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q=="
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ=="
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="
},
"electron-to-chromium": {
- "version": "1.4.71",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz",
- "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw=="
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
},
"escalade": {
"version": "3.1.1",
@@ -700,7 +695,7 @@
"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="
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
},
"estree-walker": {
"version": "2.0.2",
@@ -722,11 +717,6 @@
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
},
- "get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q=="
- },
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -740,17 +730,12 @@
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "has-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
},
"is-core-module": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
- "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA=="
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw=="
},
"is-reference": {
"version": "1.2.1",
@@ -780,22 +765,22 @@
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
"magic-string": {
- "version": "0.25.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
- "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA=="
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="
},
"meteor-babel-helpers": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/meteor-babel-helpers/-/meteor-babel-helpers-0.0.3.tgz",
- "integrity": "sha1-8uXZ+HlvvS6JAQI9dpnlsgLqn7A="
+ "integrity": "sha512-PgfmiyT/HiBaxwGHxS4t3Qi0fpmEW3O0WW2VfrgekiMGz3aZPd9/4PRIaMMZsfyjQ1vyEm6dZqTAFZENbuoTxw=="
},
"minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
},
"ms": {
"version": "2.1.2",
@@ -803,19 +788,9 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node-releases": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
- "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg=="
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
- },
- "object.assign": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
- "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ=="
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg=="
},
"path-parse": {
"version": "1.0.7",
@@ -838,62 +813,52 @@
"integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
},
"regenerate-unicode-properties": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz",
- "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw=="
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
+ "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ=="
},
"regenerator-runtime": {
- "version": "0.13.9",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
"regenerator-transform": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
- "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw=="
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+ "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg=="
},
"regexpu-core": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz",
- "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw=="
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz",
+ "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw=="
},
"regjsgen": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz",
- "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA=="
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz",
+ "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA=="
},
"regjsparser": {
- "version": "0.8.4",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz",
- "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==",
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
"dependencies": {
"jsesc": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA=="
}
}
},
"resolve": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
- "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw=="
- },
- "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=="
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw=="
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
},
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
- },
"sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
@@ -912,12 +877,12 @@
"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="
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
},
"typescript": {
- "version": "4.5.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
- "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA=="
+ "version": "4.6.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz",
+ "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg=="
},
"unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
@@ -930,14 +895,19 @@
"integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="
},
"unicode-match-property-value-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
- "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw=="
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA=="
},
"unicode-property-aliases-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ=="
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w=="
+ },
+ "update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ=="
}
}
}
diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js
index 40999ff266..a3ecdbed82 100644
--- a/packages/babel-compiler/package.js
+++ b/packages/babel-compiler/package.js
@@ -1,11 +1,11 @@
Package.describe({
name: "babel-compiler",
summary: "Parser/transpiler for ECMAScript 2015+ syntax",
- version: '7.9.0'
+ version: '7.10.1'
});
Npm.depends({
- '@meteorjs/babel': '7.16.0-beta.1',
+ '@meteorjs/babel': '7.17.2-beta.0',
'json5': '2.1.1'
});
diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js
index adb2b73436..a43b8dec7e 100644
--- a/packages/ecmascript/package.js
+++ b/packages/ecmascript/package.js
@@ -1,6 +1,6 @@
Package.describe({
name: 'ecmascript',
- version: '0.16.3',
+ version: '0.16.4',
summary: 'Compiler plugin that supports ES2015+ in all .js files',
documentation: 'README.md',
});
diff --git a/packages/email/email.js b/packages/email/email.js
index 3f64e23692..eed8dbd9b3 100644
--- a/packages/email/email.js
+++ b/packages/email/email.js
@@ -2,7 +2,6 @@ import { Meteor } from 'meteor/meteor';
import { Log } from 'meteor/logging';
import { Hook } from 'meteor/callback-hook';
-import Future from 'fibers/future';
import url from 'url';
import nodemailer from 'nodemailer';
import wellKnow from 'nodemailer/lib/well-known';
@@ -25,7 +24,7 @@ export const EmailInternals = {
const MailComposer = EmailInternals.NpmModules.mailcomposer.module;
-const makeTransport = function(mailUrlString) {
+const makeTransport = function (mailUrlString) {
const mailUrl = new URL(mailUrlString);
if (mailUrl.protocol !== 'smtp:' && mailUrl.protocol !== 'smtps:') {
@@ -60,7 +59,7 @@ const makeTransport = function(mailUrlString) {
};
// More info: https://nodemailer.com/smtp/well-known/
-const knownHostsTransport = function(settings = undefined, url = undefined) {
+const knownHostsTransport = function (settings = undefined, url = undefined) {
let service, user, password;
const hasSettings = settings && Object.keys(settings).length;
@@ -110,7 +109,7 @@ const knownHostsTransport = function(settings = undefined, url = undefined) {
};
EmailTest.knowHostsTransport = knownHostsTransport;
-const getTransport = function() {
+const getTransport = function () {
const packageSettings = Meteor.settings.packages?.email || {};
// We delay this check until the first call to Email.send, in case someone
// set process.env.MAIL_URL in startup code. Then we store in a cache until
@@ -138,40 +137,40 @@ const getTransport = function() {
};
let nextDevModeMailId = 0;
-let output_stream = process.stdout;
+
+EmailTest._getAndIncNextDevModeMailId = function () {
+ return nextDevModeMailId++;
+};
// Testing hooks
-EmailTest.overrideOutputStream = function(stream) {
+EmailTest.resetNextDevModeMailId = function () {
nextDevModeMailId = 0;
- output_stream = stream;
};
-EmailTest.restoreOutputStream = function() {
- output_stream = process.stdout;
-};
+const devModeSendAsync = function (mail, options) {
+ const stream = options?.stream || process.stdout;
+ return new Promise((resolve, reject) => {
+ let devModeMailId = EmailTest._getAndIncNextDevModeMailId();
-const devModeSend = function(mail) {
- let devModeMailId = nextDevModeMailId++;
-
- const stream = output_stream;
-
- // This approach does not prevent other writers to stdout from interleaving.
- stream.write('====== BEGIN MAIL #' + devModeMailId + ' ======\n');
- stream.write(
- '(Mail not sent; to enable sending, set the MAIL_URL ' +
+ // This approach does not prevent other writers to stdout from interleaving.
+ const output = ['====== BEGIN MAIL #' + devModeMailId + ' ======\n'];
+ output.push(
+ '(Mail not sent; to enable sending, set the MAIL_URL ' +
'environment variable.)\n'
- );
- const readStream = new MailComposer(mail).compile().createReadStream();
- readStream.pipe(stream, { end: false });
- const future = new Future();
- readStream.on('end', function() {
- stream.write('====== END MAIL #' + devModeMailId + ' ======\n');
- future.return();
+ );
+ const readStream = new MailComposer(mail).compile().createReadStream();
+ readStream.on('data', buffer => {
+ output.push(buffer.toString());
+ });
+ readStream.on('end', function () {
+ output.push('====== END MAIL #' + devModeMailId + ' ======\n');
+ stream.write(output.join(''), () => resolve());
+ });
+ readStream.on('error', (err) => reject(err));
});
- future.wait();
};
-const smtpSend = function(transport, mail) {
+const smtpSend = function (transport, mail) {
transport._syncSendMail(mail);
};
@@ -186,7 +185,7 @@ const sendHooks = new Hook();
* false to skip sending.
* @returns {{ stop: function, callback: function }}
*/
-Email.hookSend = function(f) {
+Email.hookSend = function (f) {
return sendHooks.register(f);
};
@@ -231,25 +230,77 @@ Email.customTransport = undefined;
* You can create a `MailComposer` object via
* `new EmailInternals.NpmModules.mailcomposer.module`.
*/
-Email.send = function(options) {
- if (options.mailComposer) {
- options = options.mailComposer.mail;
+Email.send = function (options) {
+ if (Email.customTransport) {
+ // Preserve current behavior
+ const email = options.mailComposer ? options.mailComposer.mail : options;
+ let send = true;
+ sendHooks.forEach((hook) => {
+ send = hook(email);
+ return send;
+ });
+ if (!send) {
+ return;
+ }
+ const packageSettings = Meteor.settings.packages?.email || {};
+ Email.customTransport({ packageSettings, ...email });
+ return;
}
+ // Using Fibers Promise.await
+ return Promise.await(Email.sendAsync(options));
+};
+
+/**
+ * @summary Send an email with asyncronous method. Capture Throws an `Error` on failure to contact mail server
+ * or if mail server returns an error. All fields should match
+ * [RFC5322](http://tools.ietf.org/html/rfc5322) specification.
+ *
+ * If the `MAIL_URL` environment variable is set, actually sends the email.
+ * Otherwise, prints the contents of the email to standard out.
+ *
+ * Note that this package is based on **nodemailer**, so make sure to refer to
+ * [the documentation](http://nodemailer.com/)
+ * when using the `attachments` or `mailComposer` options.
+ *
+ * @locus Server
+ * @return {Promise}
+ * @param {Object} options
+ * @param {String} [options.from] "From:" address (required)
+ * @param {String|String[]} options.to,cc,bcc,replyTo
+ * "To:", "Cc:", "Bcc:", and "Reply-To:" addresses
+ * @param {String} [options.inReplyTo] Message-ID this message is replying to
+ * @param {String|String[]} [options.references] Array (or space-separated string) of Message-IDs to refer to
+ * @param {String} [options.messageId] Message-ID for this message; otherwise, will be set to a random value
+ * @param {String} [options.subject] "Subject:" line
+ * @param {String} [options.text|html] Mail body (in plain text and/or HTML)
+ * @param {String} [options.watchHtml] Mail body in HTML specific for Apple Watch
+ * @param {String} [options.icalEvent] iCalendar event attachment
+ * @param {Object} [options.headers] Dictionary of custom headers - e.g. `{ "header name": "header value" }`. To set an object under a header name, use `JSON.stringify` - e.g. `{ "header name": JSON.stringify({ tracking: { level: 'full' } }) }`.
+ * @param {Object[]} [options.attachments] Array of attachment objects, as
+ * described in the [nodemailer documentation](https://nodemailer.com/message/attachments/).
+ * @param {MailComposer} [options.mailComposer] A [MailComposer](https://nodemailer.com/extras/mailcomposer/#e-mail-message-fields)
+ * object representing the message to be sent. Overrides all other options.
+ * You can create a `MailComposer` object via
+ * `new EmailInternals.NpmModules.mailcomposer.module`.
+ */
+Email.sendAsync = async function (options) {
+
+ const email = options.mailComposer ? options.mailComposer.mail : options;
let send = true;
- sendHooks.forEach(hook => {
- send = hook(options);
+ sendHooks.forEach((hook) => {
+ send = hook(email);
return send;
});
- if (!send) return;
-
- const customTransport = Email.customTransport;
- if (customTransport) {
- const packageSettings = Meteor.settings.packages?.email || {};
- customTransport({ packageSettings, ...options });
+ if (!send) {
return;
}
+ if (Email.customTransport) {
+ const packageSettings = Meteor.settings.packages?.email || {};
+ return Email.customTransport({ packageSettings, ...email });
+ }
+
const mailUrlEnv = process.env.MAIL_URL;
const mailUrlSettings = Meteor.settings.packages?.email;
@@ -263,8 +314,8 @@ Email.send = function(options) {
if (mailUrlEnv || mailUrlSettings) {
const transport = getTransport();
- smtpSend(transport, options);
+ smtpSend(transport, email);
return;
}
- devModeSend(options);
+ return devModeSendAsync(email, options);
};
diff --git a/packages/email/email_test_helpers.js b/packages/email/email_test_helpers.js
new file mode 100644
index 0000000000..a8706ab1c9
--- /dev/null
+++ b/packages/email/email_test_helpers.js
@@ -0,0 +1,21 @@
+import streamBuffers from 'stream-buffers';
+
+export const devWarningBanner =
+ '(Mail not sent; to enable ' +
+ 'sending, set the MAIL_URL environment variable.)\n';
+
+export const smokeEmailTest = (testFunction) => {
+ // This only tests dev mode, so don't run the test if this is deployed.
+ if (process.env.MAIL_URL) return;
+ const stream = new streamBuffers.WritableStreamBuffer();
+ EmailTest.resetNextDevModeMailId();
+ testFunction(stream);
+};
+
+export const canonicalize = (string) => {
+ // Remove generated content for test.equal to succeed.
+ return string
+ .replace(/Message-ID: <[^<>]*>\r\n/, 'Message-ID: <...>\r\n')
+ .replace(/Date: (?!dummy).*\r\n/, 'Date: ...\r\n')
+ .replace(/(boundary="|^--)--[^\s"]+?(-Part|")/gm, '$1--...$2');
+};
diff --git a/packages/email/email_tests.js b/packages/email/email_tests.js
index 877264ce95..6f016f26b9 100644
--- a/packages/email/email_tests.js
+++ b/packages/email/email_tests.js
@@ -1,304 +1,85 @@
-import streamBuffers from 'stream-buffers';
+import { Email } from 'meteor/email';
+import { smokeEmailTest } from './email_test_helpers';
+import { TEST_CASES } from './email_tests_data';
-const devWarningBanner = "(Mail not sent; to enable " +
- "sending, set the MAIL_URL environment variable.)\n";
+const CUSTOM_TRANSPORT_SETTINGS = {
+ email: { service: '1on1', user: 'test', password: 'pwd' },
+};
-function smokeEmailTest(testFunction) {
- // This only tests dev mode, so don't run the test if this is deployed.
- if (process.env.MAIL_URL) return;
+const sleep = (ms) => {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+};
- try {
- const stream = new streamBuffers.WritableStreamBuffer;
- EmailTest.overrideOutputStream(stream);
+// Create dynamic sync tests
+TEST_CASES.forEach(({ title, options, testCalls }) => {
+ Tinytest.add(`[Sync] ${title}`, function (test) {
+ smokeEmailTest((stream) => {
+ Object.entries(options).forEach(([key, option]) => {
+ const testCall = testCalls[key];
+ Email.send({ ...option, stream });
+ testCall(test, stream);
+ });
+ });
+ });
+});
- testFunction(stream);
+// Create dynamic async tests
+TEST_CASES.forEach(({ title, options, testCalls }) => {
+ Tinytest.addAsync(`[Async] ${title}`, function (test, onComplete) {
+ smokeEmailTest((stream) => {
+ const allPromises = Object.entries(options).map(([key, option]) => {
+ const testCall = testCalls[key];
+ return Email.sendAsync({ ...option, stream }).then(() => {
+ testCall(test, stream);
+ });
+ });
+ Promise.all(allPromises).then(() => onComplete());
+ });
+ });
+});
- } finally {
- EmailTest.restoreOutputStream();
+// Individual sync tests
+
+Tinytest.add(
+ '[Sync] email - alternate API is used for sending gets data',
+ function (test) {
+ smokeEmailTest(function (stream) {
+ Email.customTransport = (options) => {
+ test.equal(options.from, 'foo@example.com');
+ };
+ Email.send({
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ text: '*Cool*, man',
+ html: 'Cool , man',
+ stream,
+ });
+ test.equal(stream.getContentsAsString('utf8'), false);
+ });
+
+ smokeEmailTest(function (stream) {
+ Meteor.settings.packages = CUSTOM_TRANSPORT_SETTINGS;
+ Email.customTransport = (options) => {
+ test.equal(options.from, 'foo@example.com');
+ test.equal(options.packageSettings?.service, '1on1');
+ };
+
+ Email.send({
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ text: '*Cool*, man',
+ html: 'Cool , man',
+ stream,
+ });
+
+ test.equal(stream.getContentsAsString('utf8'), false);
+ });
+ Email.customTransport = undefined;
+ Meteor.settings.packages = undefined;
}
-}
+);
-function canonicalize(string) {
- // Remove generated content for test.equal to succeed.
- return string.replace(/Message-ID: <[^<>]*>\r\n/, "Message-ID: <...>\r\n")
- .replace(/Date: (?!dummy).*\r\n/, "Date: ...\r\n")
- .replace(/(boundary="|^--)--[^\s"]+?(-Part|")/mg, "$1--...$2");
-}
-
-Tinytest.add("email - fully customizable", function (test) {
- smokeEmailTest(function(stream) {
- Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- cc: ["friends@example.com", "enemies@example.com"],
- subject: "This is the subject",
- text: "This is the body\nof the message\nFrom us.",
- headers: {
- 'X-Meteor-Test': 'a custom header',
- 'Date': 'dummy',
- },
- });
- // XXX brittle if mailcomposer changes header order, etc
- test.equal(canonicalize(stream.getContentsAsString("utf8")),
- "====== BEGIN MAIL #0 ======\n" +
- devWarningBanner +
- "Content-Type: text/plain; charset=utf-8\r\n" +
- "X-Meteor-Test: a custom header\r\n" +
- "Date: dummy\r\n" +
- "From: foo@example.com\r\n" +
- "To: bar@example.com\r\n" +
- "Cc: friends@example.com, enemies@example.com\r\n" +
- "Subject: This is the subject\r\n" +
- "Message-ID: <...>\r\n" +
- "Content-Transfer-Encoding: 7bit\r\n" +
- "MIME-Version: 1.0\r\n" +
- "\r\n" +
- "This is the body\n" +
- "of the message\n" +
- "From us.\r\n" +
- "====== END MAIL #0 ======\n");
- });
-});
-
-Tinytest.add("email - undefined headers sends properly", function (test) {
- smokeEmailTest(function (stream) {
- Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- subject: "This is the subject",
- text: "This is the body\nof the message\nFrom us.",
- });
-
- test.matches(canonicalize(stream.getContentsAsString("utf8")),
- /^====== BEGIN MAIL #0 ======$[\s\S]+^To: bar@example.com$/m);
- });
-});
-
-Tinytest.add("email - multiple e-mails same stream", function (test) {
- smokeEmailTest(function (stream) {
- Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- subject: "This is the subject",
- text: "This is the body\nof the message\nFrom us.",
- });
-
- const contents = canonicalize(stream.getContentsAsString("utf8"));
- test.matches(contents, /^====== BEGIN MAIL #0 ======$/m);
- test.matches(contents, /^From: foo@example.com$/m);
- test.matches(contents, /^To: bar@example.com$/m);
-
- Email.send({
- from: "qux@example.com",
- to: "baz@example.com",
- subject: "This is important",
- text: "This is another message\nFrom Qux.",
- });
-
- const contents2 = canonicalize(stream.getContentsAsString("utf8"));
- test.matches(contents2, /^====== BEGIN MAIL #1 ======$/m);
- test.matches(contents2, /^From: qux@example.com$/m);
- test.matches(contents2, /^To: baz@example.com$/m);
-
- });
-});
-
-Tinytest.add("email - using mail composer", function (test) {
- smokeEmailTest(function (stream) {
- // Test direct MailComposer usage.
- const mc = new EmailInternals.NpmModules.mailcomposer.module({
- from: "a@b.com",
- text: "body"
- });
- Email.send({mailComposer: mc});
- test.equal(canonicalize(stream.getContentsAsString("utf8")),
- "====== BEGIN MAIL #0 ======\n" +
- devWarningBanner +
- "Content-Type: text/plain; charset=utf-8\r\n" +
- "From: a@b.com\r\n" +
- "Message-ID: <...>\r\n" +
- "Content-Transfer-Encoding: 7bit\r\n" +
- "Date: ...\r\n" +
- "MIME-Version: 1.0\r\n" +
- "\r\n" +
- "body\r\n" +
- "====== END MAIL #0 ======\n");
- });
-});
-
-Tinytest.add("email - date auto generated", function (test) {
- smokeEmailTest(function (stream) {
- // Test if date header is automatically generated, if not specified
- Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- subject: "This is the subject",
- text: "This is the body\nof the message\nFrom us.",
- headers: {
- 'X-Meteor-Test': 'a custom header',
- },
- });
-
- test.matches(canonicalize(stream.getContentsAsString("utf8")),
- /^Date: .+$/m);
- });
-});
-
-Tinytest.add("email - long lines", function (test) {
- smokeEmailTest(function (stream) {
- // Test that long header lines get wrapped with single leading whitespace,
- // and that long body lines get wrapped with quoted-printable conventions.
- Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- subject: "This is a very very very very very very very very very very very very long subject",
- text: "This is a very very very very very very very very very very very very long text",
- });
-
- test.equal(canonicalize(stream.getContentsAsString("utf8")),
- "====== BEGIN MAIL #0 ======\n" +
- devWarningBanner +
- "Content-Type: text/plain; charset=utf-8\r\n" +
- "From: foo@example.com\r\n" +
- "To: bar@example.com\r\n" +
- "Subject: This is a very very very very very very very very " +
- "very very very\r\n very long subject\r\n" +
- "Message-ID: <...>\r\n" +
- "Content-Transfer-Encoding: quoted-printable\r\n" +
- "Date: ...\r\n" +
- "MIME-Version: 1.0\r\n" +
- "\r\n" +
- "This is a very very very very very very very very very very " +
- "very very long =\r\ntext\r\n" +
- "====== END MAIL #0 ======\n");
- });
-});
-
-Tinytest.add("email - unicode", function (test) {
- smokeEmailTest(function (stream) {
- // Test that unicode characters in header and body get encoded.
- Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- subject: "\u263a",
- text: "I \u2665 Meteor",
- });
-
- test.equal(canonicalize(stream.getContentsAsString("utf8")),
- "====== BEGIN MAIL #0 ======\n" +
- devWarningBanner +
- "Content-Type: text/plain; charset=utf-8\r\n" +
- "From: foo@example.com\r\n" +
- "To: bar@example.com\r\n" +
- "Subject: =?UTF-8?B?4pi6?=\r\n" +
- "Message-ID: <...>\r\n" +
- "Content-Transfer-Encoding: quoted-printable\r\n" +
- "Date: ...\r\n" +
- "MIME-Version: 1.0\r\n" +
- "\r\n" +
- "I =E2=99=A5 Meteor\r\n" +
- "====== END MAIL #0 ======\n");
- });
-});
-
-Tinytest.add("email - text and html", function (test) {
- smokeEmailTest(function (stream) {
- // Test including both text and HTML versions of message.
- Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- text: "*Cool*, man",
- html: "Cool , man",
- });
-
- test.equal(canonicalize(stream.getContentsAsString("utf8")),
- "====== BEGIN MAIL #0 ======\n" +
- devWarningBanner +
- "Content-Type: multipart/alternative;\r\n" +
- ' boundary="--...-Part_1"\r\n' +
- "From: foo@example.com\r\n" +
- "To: bar@example.com\r\n" +
- "Message-ID: <...>\r\n" +
- "Date: ...\r\n" +
- "MIME-Version: 1.0\r\n" +
- "\r\n" +
- "----...-Part_1\r\n" +
- "Content-Type: text/plain; charset=utf-8\r\n" +
- "Content-Transfer-Encoding: 7bit\r\n" +
- "\r\n" +
- "*Cool*, man\r\n" +
- "----...-Part_1\r\n" +
- "Content-Type: text/html; charset=utf-8\r\n" +
- "Content-Transfer-Encoding: 7bit\r\n" +
- "\r\n" +
- "Cool , man\r\n" +
- "----...-Part_1--\r\n" +
- "====== END MAIL #0 ======\n");
- });
-});
-
-Tinytest.add("email - alternate API is used for sending gets data", function(test) {
- smokeEmailTest(function(stream) {
- Email.customTransport = (options) => {
- test.equal(options.from, 'foo@example.com');
- };
- Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- text: "*Cool*, man",
- html: "Cool , man",
- });
- test.equal(stream.getContentsAsString("utf8"), false);
- });
-
- smokeEmailTest(function(stream) {
- Meteor.settings.packages = { email: { service: '1on1', user: 'test', password: 'pwd' } };
- Email.customTransport = (options) => {
- test.equal(options.from, 'foo@example.com');
- test.equal(options.packageSettings?.service, '1on1');
- };
-
- Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- text: "*Cool*, man",
- html: "Cool , man",
- });
-
- test.equal(stream.getContentsAsString("utf8"), false);
- });
- Email.customTransport = undefined;
- Meteor.settings.packages = undefined;
-});
-
-Tinytest.add("email - URL string for known hosts", function(test) {
- const oneTransport = EmailTest.knowHostsTransport({ service: '1und1', user: 'test', password: 'pwd' });
- test.equal(oneTransport.transporter.auth.type, 'LOGIN');
- test.equal(oneTransport.transporter.auth.user, 'test');
-
- const aolUrlTransport = EmailTest.knowHostsTransport(null, 'AOL://test:pwd@aol.com');
- test.equal(aolUrlTransport.transporter.auth.user, 'test');
- test.equal(aolUrlTransport.transporter.auth.type, 'LOGIN');
-
- const outlookTransport = EmailTest.knowHostsTransport(null, 'Outlook365://firstname.lastname%40hotmail.com:password@hotmail.com');
- const outlookTransport2 = EmailTest.knowHostsTransport(undefined, 'Outlook365://firstname.lastname@hotmail.com:password@hotmail.com');
- test.equal(outlookTransport.transporter.auth.user, 'firstname.lastname%40hotmail.com');
- test.equal(outlookTransport.options.auth.user, 'firstname.lastname%40hotmail.com');
- test.equal(outlookTransport.transporter.options.service, 'outlook365');
- test.equal(outlookTransport2.transporter.auth.user, 'firstname.lastname%40hotmail.com');
- test.equal(outlookTransport2.transporter.options.service, 'outlook365');
-
- const hotmailTransport = EmailTest.knowHostsTransport(undefined, 'Hotmail://firstname.lastname@hotmail.com:password@hotmail.com');
- console.dir(hotmailTransport);
- test.equal(hotmailTransport.transporter.options.service, 'hotmail');
-
- const falseService = { service: '1on1', user: 'test', password: 'pwd' };
- const errorMsg = 'Could not recognize e-mail service. See list at https://nodemailer.com/smtp/well-known/ for services that we can configure for you.';
- test.throws(() => EmailTest.knowHostsTransport(falseService), errorMsg);
- test.throws(() => EmailTest.knowHostsTransport(null, 'smtp://bbb:bb@bb.com'), errorMsg);
-});
-
-Tinytest.add("email - hooks stop the sending", function(test) {
+Tinytest.add('[Sync] email - hooks stop the sending', function (test) {
// Register hooks
const hook1 = Email.hookSend((options) => {
// Test that we get options through
@@ -313,17 +94,218 @@ Tinytest.add("email - hooks stop the sending", function(test) {
const hook3 = Email.hookSend(() => {
console.log('FAIL');
});
- smokeEmailTest(function(stream) {
+ smokeEmailTest(function (stream) {
Email.send({
- from: "foo@example.com",
- to: "bar@example.com",
- text: "*Cool*, man",
- html: "Cool , man",
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ text: '*Cool*, man',
+ html: 'Cool , man',
+ stream,
});
- test.equal(stream.getContentsAsString("utf8"), false);
+ test.equal(stream.getContentsAsString('utf8'), false);
});
hook1.stop();
hook2.stop();
hook3.stop();
});
+
+// Individual Async tests
+
+Tinytest.addAsync(
+ '[Async] email - alternate API is used for sending gets data',
+ function (test, onComplete) {
+ const allPromises = [];
+ smokeEmailTest((stream) => {
+ Email.customTransport = (options) => {
+ test.equal(options.from, 'foo@example.com');
+ };
+ allPromises.push(
+ Email.sendAsync({
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ text: '*Cool*, man',
+ html: 'Cool , man',
+ stream,
+ }).then(() => {
+ test.equal(stream.getContentsAsString('utf8'), false);
+ })
+ );
+ });
+
+ smokeEmailTest(function (stream) {
+ Meteor.settings.packages = CUSTOM_TRANSPORT_SETTINGS;
+ Email.customTransport = (options) => {
+ test.equal(options.from, 'foo@example.com');
+ test.equal(options.packageSettings?.service, '1on1');
+ };
+
+ allPromises.push(
+ Email.sendAsync({
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ text: '*Cool*, man',
+ html: 'Cool , man',
+ stream,
+ }).then(() => {
+ test.equal(stream.getContentsAsString('utf8'), false);
+ })
+ );
+ });
+ Promise.all(allPromises).then(() => {
+ Email.customTransport = undefined;
+ Meteor.settings.packages = undefined;
+ onComplete();
+ });
+ }
+);
+
+Tinytest.addAsync(
+ '[Async] email - hooks stop the sending',
+ function (test, onComplete) {
+ // Register hooks
+ const hook1 = Email.hookSend((options) => {
+ // Test that we get options through
+ test.equal(options.from, 'foo@example.com');
+ console.log('EXECUTE');
+ return true;
+ });
+ const hook2 = Email.hookSend(() => {
+ console.log('STOP');
+ return false;
+ });
+ const hook3 = Email.hookSend(() => {
+ console.log('FAIL');
+ });
+ smokeEmailTest((stream) => {
+ Email.sendAsync({
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ text: '*Cool*, man',
+ html: 'Cool , man',
+ stream,
+ }).then(() => {
+ test.equal(stream.getContentsAsString('utf8'), false);
+ hook1.stop();
+ hook2.stop();
+ hook3.stop();
+ onComplete();
+ });
+ });
+ }
+);
+
+// Another tests
+
+Tinytest.add('[Sync] email - URL string for known hosts', function (test) {
+ const oneTransport = EmailTest.knowHostsTransport({
+ service: '1und1',
+ user: 'test',
+ password: 'pwd',
+ });
+ test.equal(oneTransport.transporter.auth.type, 'LOGIN');
+ test.equal(oneTransport.transporter.auth.user, 'test');
+
+ const aolUrlTransport = EmailTest.knowHostsTransport(
+ null,
+ 'AOL://test:pwd@aol.com'
+ );
+ test.equal(aolUrlTransport.transporter.auth.user, 'test');
+ test.equal(aolUrlTransport.transporter.auth.type, 'LOGIN');
+
+ const outlookTransport = EmailTest.knowHostsTransport(
+ null,
+ 'Outlook365://firstname.lastname%40hotmail.com:password@hotmail.com'
+ );
+ const outlookTransport2 = EmailTest.knowHostsTransport(
+ undefined,
+ 'Outlook365://firstname.lastname@hotmail.com:password@hotmail.com'
+ );
+ test.equal(
+ outlookTransport.transporter.auth.user,
+ 'firstname.lastname%40hotmail.com'
+ );
+ test.equal(
+ outlookTransport.options.auth.user,
+ 'firstname.lastname%40hotmail.com'
+ );
+ test.equal(outlookTransport.transporter.options.service, 'outlook365');
+ test.equal(
+ outlookTransport2.transporter.auth.user,
+ 'firstname.lastname%40hotmail.com'
+ );
+ test.equal(outlookTransport2.transporter.options.service, 'outlook365');
+
+ const hotmailTransport = EmailTest.knowHostsTransport(
+ undefined,
+ 'Hotmail://firstname.lastname@hotmail.com:password@hotmail.com'
+ );
+ console.dir(hotmailTransport);
+ test.equal(hotmailTransport.transporter.options.service, 'hotmail');
+
+ const falseService = CUSTOM_TRANSPORT_SETTINGS.email;
+ const errorMsg =
+ 'Could not recognize e-mail service. See list at https://nodemailer.com/smtp/well-known/ for services that we can configure for you.';
+ test.throws(() => EmailTest.knowHostsTransport(falseService), errorMsg);
+ test.throws(
+ () => EmailTest.knowHostsTransport(null, 'smtp://bbb:bb@bb.com'),
+ errorMsg
+ );
+});
+
+Tinytest.addAsync(
+ '[Async] email - with custom transport exception',
+ async function (test) {
+ Meteor.settings.packages = CUSTOM_TRANSPORT_SETTINGS;
+ Email.customTransport = (options) => {
+ test.equal(options.from, 'foo@example.com');
+ test.equal(options.packageSettings?.service, '1on1');
+ throw new Meteor.Error('Expected error');
+ };
+ await Email.sendAsync({
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ }).catch((err) => {
+ test.equal(err.error, 'Expected error');
+ });
+ Meteor.settings.packages = undefined;
+ Email.customTransport = undefined;
+ }
+);
+
+Tinytest.addAsync(
+ '[Async] email - with custom transport long time running',
+ async function (test) {
+ Meteor.settings.packages = CUSTOM_TRANSPORT_SETTINGS;
+ Email.customTransport = async (options) => {
+ await sleep(3000);
+ test.equal(options.from, 'foo@example.com');
+ test.equal(options.packageSettings?.service, '1on1');
+ };
+ await Email.sendAsync({
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ });
+ Meteor.settings.packages = undefined;
+ Email.customTransport = undefined;
+ }
+);
+
+Tinytest.addAsync(
+ '[Sync] email - with custom transport long time running',
+ function (test, onComplete) {
+ Meteor.settings.packages = CUSTOM_TRANSPORT_SETTINGS;
+ Email.customTransport = async (options) => {
+ await sleep(3000);
+ test.equal(options.from, 'foo@example.com');
+ test.equal(options.packageSettings?.service, '1on1');
+ Meteor.settings.packages = undefined;
+ Email.customTransport = undefined;
+ onComplete();
+ };
+ Email.send({
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ });
+ }
+);
diff --git a/packages/email/email_tests_data.js b/packages/email/email_tests_data.js
new file mode 100644
index 0000000000..095c1fb9d2
--- /dev/null
+++ b/packages/email/email_tests_data.js
@@ -0,0 +1,254 @@
+import { canonicalize, devWarningBanner } from './email_test_helpers';
+
+export const TEST_CASES = [
+ {
+ title: 'email - fully customizable',
+ options: {
+ 0: {
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ cc: ['friends@example.com', 'enemies@example.com'],
+ subject: 'This is the subject',
+ text: 'This is the body\nof the message\nFrom us.',
+ headers: {
+ 'X-Meteor-Test': 'a custom header',
+ Date: 'dummy',
+ },
+ },
+ },
+ testCalls: {
+ 0: (test, stream) => {
+ // XXX brittle if mailcomposer changes header order, etc
+ test.equal(
+ canonicalize(stream.getContentsAsString('utf8')),
+ '====== BEGIN MAIL #0 ======\n' +
+ devWarningBanner +
+ 'Content-Type: text/plain; charset=utf-8\r\n' +
+ 'X-Meteor-Test: a custom header\r\n' +
+ 'Date: dummy\r\n' +
+ 'From: foo@example.com\r\n' +
+ 'To: bar@example.com\r\n' +
+ 'Cc: friends@example.com, enemies@example.com\r\n' +
+ 'Subject: This is the subject\r\n' +
+ 'Message-ID: <...>\r\n' +
+ 'Content-Transfer-Encoding: 7bit\r\n' +
+ 'MIME-Version: 1.0\r\n' +
+ '\r\n' +
+ 'This is the body\n' +
+ 'of the message\n' +
+ 'From us.\r\n' +
+ '====== END MAIL #0 ======\n'
+ );
+ },
+ },
+ },
+ {
+ title: 'email - undefined headers sends properly',
+ options: {
+ 0: {
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ subject: 'This is the subject',
+ text: 'This is the body\nof the message\nFrom us.',
+ },
+ },
+ testCalls: {
+ 0: (test, stream) => {
+ test.matches(
+ canonicalize(stream.getContentsAsString('utf8')),
+ /^====== BEGIN MAIL #0 ======$[\s\S]+^To: bar@example.com$/m
+ );
+ },
+ },
+ },
+ {
+ title: 'email - multiple e-mails same stream',
+ options: {
+ 0: {
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ subject: 'This is the subject',
+ text: 'This is the body\nof the message\nFrom us.',
+ },
+ 1: {
+ from: 'qux@example.com',
+ to: 'baz@example.com',
+ subject: 'This is important',
+ text: 'This is another message\nFrom Qux.',
+ },
+ },
+
+ testCalls: {
+ 0: (test, stream) => {
+ const contents = canonicalize(stream.getContentsAsString('utf8'));
+ test.matches(contents, /^====== BEGIN MAIL #0 ======$/m);
+ test.matches(contents, /^From: foo@example.com$/m);
+ test.matches(contents, /^To: bar@example.com$/m);
+ },
+ 1: (test, stream) => {
+ const contents2 = canonicalize(stream.getContentsAsString('utf8'));
+ test.matches(contents2, /^====== BEGIN MAIL #1 ======$/m);
+ test.matches(contents2, /^From: qux@example.com$/m);
+ test.matches(contents2, /^To: baz@example.com$/m);
+ },
+ },
+ },
+ {
+ title: 'email - using mail composer',
+ options: {
+ 0: {
+ mailComposer: new EmailInternals.NpmModules.mailcomposer.module({
+ from: 'a@b.com',
+ text: 'body',
+ }),
+ },
+ },
+
+ testCalls: {
+ 0: (test, stream) => {
+ test.equal(
+ canonicalize(stream.getContentsAsString('utf8')),
+ '====== BEGIN MAIL #0 ======\n' +
+ devWarningBanner +
+ 'Content-Type: text/plain; charset=utf-8\r\n' +
+ 'From: a@b.com\r\n' +
+ 'Message-ID: <...>\r\n' +
+ 'Content-Transfer-Encoding: 7bit\r\n' +
+ 'Date: ...\r\n' +
+ 'MIME-Version: 1.0\r\n' +
+ '\r\n' +
+ 'body\r\n' +
+ '====== END MAIL #0 ======\n'
+ );
+ },
+ },
+ },
+ {
+ title: 'email - date auto generated',
+ options: {
+ 0: {
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ subject: 'This is the subject',
+ text: 'This is the body\nof the message\nFrom us.',
+ headers: {
+ 'X-Meteor-Test': 'a custom header',
+ },
+ },
+ },
+ testCalls: {
+ 0: (test, stream) => {
+ test.matches(
+ canonicalize(stream.getContentsAsString('utf8')),
+ /^Date: .+$/m
+ );
+ },
+ },
+ },
+ {
+ title: 'email - long lines',
+ options: {
+ 0: {
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ subject:
+ 'This is a very very very very very very very very very very very very long subject',
+ text: 'This is a very very very very very very very very very very very very long text',
+ },
+ },
+ testCalls: {
+ 0: (test, stream) => {
+ test.equal(
+ canonicalize(stream.getContentsAsString('utf8')),
+ '====== BEGIN MAIL #0 ======\n' +
+ devWarningBanner +
+ 'Content-Type: text/plain; charset=utf-8\r\n' +
+ 'From: foo@example.com\r\n' +
+ 'To: bar@example.com\r\n' +
+ 'Subject: This is a very very very very very very very very ' +
+ 'very very very\r\n very long subject\r\n' +
+ 'Message-ID: <...>\r\n' +
+ 'Content-Transfer-Encoding: quoted-printable\r\n' +
+ 'Date: ...\r\n' +
+ 'MIME-Version: 1.0\r\n' +
+ '\r\n' +
+ 'This is a very very very very very very very very very very ' +
+ 'very very long =\r\ntext\r\n' +
+ '====== END MAIL #0 ======\n'
+ );
+ },
+ },
+ },
+ {
+ title: 'email - unicode',
+ options: {
+ 0: {
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ subject: '\u263a',
+ text: 'I \u2665 Meteor',
+ },
+ },
+ testCalls: {
+ 0: (test, stream) => {
+ test.equal(
+ canonicalize(stream.getContentsAsString('utf8')),
+ '====== BEGIN MAIL #0 ======\n' +
+ devWarningBanner +
+ 'Content-Type: text/plain; charset=utf-8\r\n' +
+ 'From: foo@example.com\r\n' +
+ 'To: bar@example.com\r\n' +
+ 'Subject: =?UTF-8?B?4pi6?=\r\n' +
+ 'Message-ID: <...>\r\n' +
+ 'Content-Transfer-Encoding: quoted-printable\r\n' +
+ 'Date: ...\r\n' +
+ 'MIME-Version: 1.0\r\n' +
+ '\r\n' +
+ 'I =E2=99=A5 Meteor\r\n' +
+ '====== END MAIL #0 ======\n'
+ );
+ },
+ },
+ },
+ {
+ title: 'email - text and html',
+ options: {
+ 0: {
+ from: 'foo@example.com',
+ to: 'bar@example.com',
+ text: '*Cool*, man',
+ html: 'Cool , man',
+ },
+ },
+ testCalls: {
+ 0: (test, stream) => {
+ test.equal(
+ canonicalize(stream.getContentsAsString('utf8')),
+ '====== BEGIN MAIL #0 ======\n' +
+ devWarningBanner +
+ 'Content-Type: multipart/alternative;\r\n' +
+ ' boundary="--...-Part_1"\r\n' +
+ 'From: foo@example.com\r\n' +
+ 'To: bar@example.com\r\n' +
+ 'Message-ID: <...>\r\n' +
+ 'Date: ...\r\n' +
+ 'MIME-Version: 1.0\r\n' +
+ '\r\n' +
+ '----...-Part_1\r\n' +
+ 'Content-Type: text/plain; charset=utf-8\r\n' +
+ 'Content-Transfer-Encoding: 7bit\r\n' +
+ '\r\n' +
+ '*Cool*, man\r\n' +
+ '----...-Part_1\r\n' +
+ 'Content-Type: text/html; charset=utf-8\r\n' +
+ 'Content-Transfer-Encoding: 7bit\r\n' +
+ '\r\n' +
+ 'Cool , man\r\n' +
+ '----...-Part_1--\r\n' +
+ '====== END MAIL #0 ======\n'
+ );
+ },
+ },
+ },
+];
+
diff --git a/packages/email/package.js b/packages/email/package.js
index 326bad392a..cc02138f6d 100644
--- a/packages/email/package.js
+++ b/packages/email/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: 'Send email messages',
- version: '2.2.2',
+ version: '2.2.3',
});
Npm.depends({
diff --git a/packages/facebook-oauth/facebook_server.js b/packages/facebook-oauth/facebook_server.js
index c2964cf842..d9c824f27f 100644
--- a/packages/facebook-oauth/facebook_server.js
+++ b/packages/facebook-oauth/facebook_server.js
@@ -4,13 +4,13 @@ import { Accounts } from 'meteor/accounts-base';
const API_VERSION = Meteor.settings?.public?.packages?.['facebook-oauth']?.apiVersion || '13.0';
-Facebook.handleAuthFromAccessToken = (accessToken, expiresAt) => {
+Facebook.handleAuthFromAccessToken = async (accessToken, expiresAt) => {
// include basic fields from facebook
// https://developers.facebook.com/docs/facebook-login/permissions/
const whitelisted = ['id', 'email', 'name', 'first_name', 'last_name',
'middle_name', 'name_format', 'picture', 'short_name'];
- const identity = getIdentity(accessToken, whitelisted);
+ const identity = await getIdentity(accessToken, whitelisted);
const fields = {};
whitelisted.forEach(field => fields[field] = identity[field]);
@@ -34,8 +34,8 @@ Accounts.registerLoginHandler(request => {
return Accounts.updateOrCreateUserFromExternalService('facebook', facebookData.serviceData, facebookData.options);
});
-OAuth.registerService('facebook', 2, null, query => {
- const response = getTokenResponse(query);
+OAuth.registerService('facebook', 2, null, async query => {
+ const response = await getTokenResponse(query);
const { accessToken } = response;
const { expiresIn } = response;
@@ -52,7 +52,7 @@ function getAbsoluteUrlOptions(query) {
const redirectUrl = new URL(state.redirectUrl);
return {
rootUrl: redirectUrl.origin,
- }
+ };
} catch (e) {
console.error(
`Failed to complete OAuth handshake with Facebook because it was not able to obtain the redirect url from the state and you are using overrideRootUrlFromStateRedirectUrl.`, e
@@ -61,73 +61,86 @@ function getAbsoluteUrlOptions(query) {
}
}
-// returns an object containing:
-// - accessToken
-// - expiresIn: lifetime of token in seconds
-const getTokenResponse = query => {
- const config = ServiceConfiguration.configurations.findOne({service: 'facebook'});
- if (!config)
- throw new ServiceConfiguration.ConfigError();
+/**
+ * @typedef {Object} UserAccessToken
+ * @property {string} accessToken - User access Token
+ * @property {number} expiresIn - lifetime of token in seconds
+ */
+/**
+ * @async
+ * @function getTokenResponse
+ * @param {Object} query - An object with the code.
+ * @returns {Promise} - Promise with an Object containing the accessToken and expiresIn (lifetime of token in seconds)
+ */
+const getTokenResponse = async (query) => {
+ const config = ServiceConfiguration.configurations.findOne({
+ service: 'facebook',
+ });
+ if (!config) throw new ServiceConfiguration.ConfigError();
- let responseContent;
- try {
+ const absoluteUrlOptions = getAbsoluteUrlOptions(query);
+ const redirectUri = OAuth._redirectUri('facebook', config, undefined, absoluteUrlOptions);
- const absoluteUrlOptions = getAbsoluteUrlOptions(query);
- const redirectUri = OAuth._redirectUri('facebook', config, undefined, absoluteUrlOptions);
- // Request an access token
- responseContent = HTTP.get(
- `https://graph.facebook.com/v${API_VERSION}/oauth/access_token`, {
- params: {
- client_id: config.appId,
- redirect_uri: redirectUri,
- client_secret: OAuth.openSecret(config.secret),
- code: query.code
- }
- }).data;
- } catch (err) {
- throw Object.assign(
- new Error(`Failed to complete OAuth handshake with Facebook. ${err.message}`),
- { response: err.response },
- );
- }
-
- const fbAccessToken = responseContent.access_token;
- const fbExpires = responseContent.expires_in;
-
- if (!fbAccessToken) {
- throw new Error("Failed to complete OAuth handshake with facebook " +
- `-- can't find access token in HTTP response. ${responseContent}`);
- }
- return {
- accessToken: fbAccessToken,
- expiresIn: fbExpires
- };
+ return OAuth._fetch(
+ `https://graph.facebook.com/v${API_VERSION}/oauth/access_token`,
+ 'GET',
+ {
+ queryParams: {
+ client_id: config.appId,
+ redirect_uri: redirectUri,
+ client_secret: OAuth.openSecret(config.secret),
+ code: query.code,
+ },
+ }
+ )
+ .then((res) => res.json())
+ .then(data => {
+ const fbAccessToken = data.access_token;
+ const fbExpires = data.expires_in;
+ if (!fbAccessToken) {
+ throw new Error("Failed to complete OAuth handshake with facebook " +
+ `-- can't find access token in HTTP response. ${data}`);
+ }
+ return {
+ accessToken: fbAccessToken,
+ expiresIn: fbExpires
+ };
+ })
+ .catch((err) => {
+ throw Object.assign(
+ new Error(
+ `Failed to complete OAuth handshake with Facebook. ${err.message}`
+ ),
+ { response: err.response }
+ );
+ });
};
-const getIdentity = (accessToken, fields) => {
- const config = ServiceConfiguration.configurations.findOne({service: 'facebook'});
- if (!config)
- throw new ServiceConfiguration.ConfigError();
+const getIdentity = async (accessToken, fields) => {
+ const config = ServiceConfiguration.configurations.findOne({
+ service: 'facebook',
+ });
+ if (!config) throw new ServiceConfiguration.ConfigError();
// Generate app secret proof that is a sha256 hash of the app access token, with the app secret as the key
// https://developers.facebook.com/docs/graph-api/securing-requests#appsecret_proof
const hmac = crypto.createHmac('sha256', OAuth.openSecret(config.secret));
hmac.update(accessToken);
- try {
- return HTTP.get(`https://graph.facebook.com/v${API_VERSION}/me`, {
- params: {
- access_token: accessToken,
- appsecret_proof: hmac.digest('hex'),
- fields: fields.join(",")
- }
- }).data;
- } catch (err) {
- throw Object.assign(
- new Error(`Failed to fetch identity from Facebook. ${err.message}`),
- { response: err.response },
- );
- }
+ return OAuth._fetch(`https://graph.facebook.com/v${API_VERSION}/me`, 'GET', {
+ queryParams: {
+ access_token: accessToken,
+ appsecret_proof: hmac.digest('hex'),
+ fields: fields.join(','),
+ },
+ })
+ .then((res) => res.json())
+ .catch((err) => {
+ throw Object.assign(
+ new Error(`Failed to fetch identity from Facebook. ${err.message}`),
+ { response: err.response }
+ );
+ });
};
Facebook.retrieveCredential = (credentialToken, credentialSecret) =>
diff --git a/packages/facebook-oauth/package.js b/packages/facebook-oauth/package.js
index 5df363643a..98b393d2a9 100644
--- a/packages/facebook-oauth/package.js
+++ b/packages/facebook-oauth/package.js
@@ -1,13 +1,12 @@
Package.describe({
summary: "Facebook OAuth flow",
- version: '1.11.1'
+ version: '1.11.2'
});
Package.onUse(api => {
api.use('ecmascript', ['client', 'server']);
api.use('oauth2', ['client', 'server']);
api.use('oauth', ['client', 'server']);
- api.use('http@1.4.4 || 2.0.0', ['server']);
api.use('random', 'client');
api.use('service-configuration', ['client', 'server']);
diff --git a/packages/fetch/fetch.d.ts b/packages/fetch/fetch.d.ts
index 8d6eb289ad..9fdaddd3fd 100644
--- a/packages/fetch/fetch.d.ts
+++ b/packages/fetch/fetch.d.ts
@@ -1,4 +1,4 @@
-export declare function fetch(): typeof globalThis.fetch;
+export declare var fetch: typeof globalThis.fetch;
export declare var Headers: typeof globalThis.Headers;
export declare var Request: typeof globalThis.Request;
export declare var Response: typeof globalThis.Response;
diff --git a/packages/fetch/package.js b/packages/fetch/package.js
index 5648235dac..1d13e505d5 100644
--- a/packages/fetch/package.js
+++ b/packages/fetch/package.js
@@ -1,6 +1,6 @@
Package.describe({
name: "fetch",
- version: '0.1.2',
+ version: '0.1.3',
summary: "Isomorphic modern/legacy/Node polyfill for WHATWG fetch()",
documentation: "README.md"
});
diff --git a/packages/github-oauth/github_server.js b/packages/github-oauth/github_server.js
index b71995d1c0..7b4f36f5f6 100644
--- a/packages/github-oauth/github_server.js
+++ b/packages/github-oauth/github_server.js
@@ -1,12 +1,9 @@
Github = {};
-OAuth.registerService('github', 2, null, (query) => {
- const accessTokenCall = Meteor.wrapAsync(getAccessToken);
- const accessToken = accessTokenCall(query);
- const identityCall = Meteor.wrapAsync(getIdentity);
- const identity = identityCall(accessToken);
- const emailsCall = Meteor.wrapAsync(getEmails);
- const emails = emailsCall(accessToken);
+OAuth.registerService('github', 2, null, async (query) => {
+ const accessToken = await getAccessToken(query);
+ const identity = await getIdentity(accessToken);
+ const emails = await getEmails(accessToken);
const primaryEmail = emails.find((email) => email.primary);
return {
@@ -31,7 +28,7 @@ OAuth.registerService('github', 2, null, (query) => {
let userAgent = 'Meteor';
if (Meteor.release) userAgent += `/${Meteor.release}`;
-const getAccessToken = async (query, callback) => {
+const getAccessToken = async (query) => {
const config = ServiceConfiguration.configurations.findOne({
service: 'github'
});
@@ -68,18 +65,16 @@ const getAccessToken = async (query, callback) => {
);
}
if (response.error) {
- callback(response.error);
// if the http response was a json object with an error attribute
throw new Error(
`Failed to complete OAuth handshake with GitHub. ${response.error}`
);
} else {
- callback(null, response.access_token);
return response.access_token;
}
};
-const getIdentity = async (accessToken, callback) => {
+const getIdentity = async (accessToken) => {
try {
const request = await fetch('https://api.github.com/user', {
method: 'GET',
@@ -89,11 +84,8 @@ const getIdentity = async (accessToken, callback) => {
Authorization: `token ${accessToken}`
} // http://developer.github.com/v3/#user-agent-required
});
- const response = await request.json();
- callback(null, response);
- return response;
+ return await request.json();
} catch (err) {
- callback(err.message);
throw Object.assign(
new Error(`Failed to fetch identity from Github. ${err.message}`),
{ response: err.response }
@@ -101,7 +93,7 @@ const getIdentity = async (accessToken, callback) => {
}
};
-const getEmails = async (accessToken, callback) => {
+const getEmails = async (accessToken) => {
try {
const request = await fetch('https://api.github.com/user/emails', {
method: 'GET',
@@ -111,11 +103,8 @@ const getEmails = async (accessToken, callback) => {
Authorization: `token ${accessToken}`
} // http://developer.github.com/v3/#user-agent-required
});
- const response = await request.json();
- callback(null, response);
- return response;
+ return await request.json();
} catch (err) {
- callback(err.message, []);
return [];
}
};
diff --git a/packages/github-oauth/package.js b/packages/github-oauth/package.js
index de8e9415cb..2316e275a2 100644
--- a/packages/github-oauth/package.js
+++ b/packages/github-oauth/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: 'GitHub OAuth flow',
- version: '1.4.0'
+ version: '1.4.1'
});
Package.onUse(api => {
diff --git a/packages/google-oauth/google_server.js b/packages/google-oauth/google_server.js
index d13c285914..a25637be75 100644
--- a/packages/google-oauth/google_server.js
+++ b/packages/google-oauth/google_server.js
@@ -5,40 +5,46 @@ import { fetch } from 'meteor/fetch';
const hasOwn = Object.prototype.hasOwnProperty;
// https://developers.google.com/accounts/docs/OAuth2Login#userinfocall
-Google.whitelistedFields = ['id', 'email', 'verified_email', 'name', 'given_name',
- 'family_name', 'picture', 'locale', 'timezone', 'gender'];
+Google.whitelistedFields = [
+ 'id',
+ 'email',
+ 'verified_email',
+ 'name',
+ 'given_name',
+ 'family_name',
+ 'picture',
+ 'locale',
+ 'timezone',
+ 'gender',
+];
-const getServiceDataFromTokens = tokens => {
+const getServiceDataFromTokens = async (tokens, callback) => {
const { accessToken, idToken } = tokens;
- const scopesCall = Meteor.wrapAsync(getScopes);
- let scopes;
- try {
- scopes = scopesCall(accessToken);
- } catch (err) {
- throw Object.assign(
+ const scopes = await getScopes(accessToken).catch((err) => {
+ const error = Object.assign(
new Error(`Failed to fetch tokeninfo from Google. ${err.message}`),
{ response: err.response }
);
- }
- const identityCall = Meteor.wrapAsync(getIdentity);
- let identity;
- try {
- identity = identityCall(accessToken);
- } catch (err) {
- throw Object.assign(
+ callback && callback(error);
+ throw error;
+ });
+
+ let identity = await getIdentity(accessToken).catch((err) => {
+ const error = Object.assign(
new Error(`Failed to fetch identity from Google. ${err.message}`),
{ response: err.response }
);
- }
+ callback && callback(error);
+ throw error;
+ });
const serviceData = {
accessToken,
idToken,
- scope: scopes
+ scope: scopes,
};
- if (hasOwn.call(tokens, "expiresIn")) {
- serviceData.expiresAt =
- Date.now() + 1000 * parseInt(tokens.expiresIn, 10);
+ if (hasOwn.call(tokens, 'expiresIn')) {
+ serviceData.expiresAt = Date.now() + 1000 * parseInt(tokens.expiresIn, 10);
}
const fields = Object.create(null);
@@ -56,22 +62,25 @@ const getServiceDataFromTokens = tokens => {
if (tokens.refreshToken) {
serviceData.refreshToken = tokens.refreshToken;
}
-
- return {
+ const returnValue = {
serviceData,
options: {
profile: {
- name: identity.name
- }
- }
+ name: identity.name,
+ },
+ },
};
+
+ callback && callback(undefined, returnValue);
+
+ return returnValue;
};
-Accounts.registerLoginHandler(request => {
+Accounts.registerLoginHandler(async (request) => {
if (request.googleSignIn !== true) {
return;
}
-
+ console.log({ request });
const tokens = {
accessToken: request.accessToken,
refreshToken: request.refreshToken,
@@ -79,29 +88,38 @@ Accounts.registerLoginHandler(request => {
};
if (request.serverAuthCode) {
- Object.assign(tokens, getTokens({
- code: request.serverAuthCode
- }));
+ Object.assign(
+ tokens,
+ await getTokens({
+ code: request.serverAuthCode,
+ })
+ );
}
let result;
try {
- result = getServiceDataFromTokens(tokens);
+ result = await getServiceDataFromTokens(tokens);
} catch (err) {
throw Object.assign(
- new Error(`Failed to complete OAuth handshake with Google. ${err.message}`),
+ new Error(
+ `Failed to complete OAuth handshake with Google. ${err.message}`
+ ),
{ response: err.response }
);
}
-
- return Accounts.updateOrCreateUserFromExternalService("google", {
- id: request.userId,
- idToken: request.idToken,
- accessToken: request.accessToken,
- email: request.email,
- picture: request.imageUrl,
- ...result.serviceData,
- }, result.options);
+ console.log({ result });
+ return Accounts.updateOrCreateUserFromExternalService(
+ 'google',
+ {
+ id: request.userId,
+ idToken: request.idToken,
+ accessToken: request.accessToken,
+ email: request.email,
+ picture: request.imageUrl,
+ ...result.serviceData,
+ },
+ result.options
+ );
});
// returns an object containing:
@@ -109,45 +127,48 @@ Accounts.registerLoginHandler(request => {
// - expiresIn: lifetime of token in seconds
// - refreshToken, if this is the first authorization request
const getTokens = async (query, callback) => {
- const config = ServiceConfiguration.configurations.findOne({service: 'google'});
- if (!config)
- throw new ServiceConfiguration.ConfigError();
+ const config = ServiceConfiguration.configurations.findOne({
+ service: 'google',
+ });
+ if (!config) throw new ServiceConfiguration.ConfigError();
const content = new URLSearchParams({
code: query.code,
client_id: config.clientId,
client_secret: OAuth.openSecret(config.secret),
redirect_uri: OAuth._redirectUri('google', config),
- grant_type: 'authorization_code'
+ grant_type: 'authorization_code',
+ });
+ const request = await fetch('https://accounts.google.com/o/oauth2/token', {
+ method: 'POST',
+ headers: {
+ Accept: 'application/json',
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ body: content,
});
- const request = await fetch(
- "https://accounts.google.com/o/oauth2/token", {
- method: 'POST',
- headers: {
- Accept: 'application/json',
- 'Content-Type': 'application/x-www-form-urlencoded'
- },
- body: content,
- });
const response = await request.json();
- if (response.error) { // if the http response was a json object with an error attribute
- callback(response.error);
- throw new Meteor.Error(`Failed to complete OAuth handshake with Google. ${response.error}`);
+ if (response.error) {
+ // if the http response was a json object with an error attribute
+ callback && callback(response.error);
+ throw new Meteor.Error(
+ `Failed to complete OAuth handshake with Google. ${response.error}`
+ );
} else {
const data = {
accessToken: response.access_token,
refreshToken: response.refresh_token,
expiresIn: response.expires_in,
- idToken: response.id_token
+ idToken: response.id_token,
};
- callback(undefined, data);
+ callback && callback(undefined, data);
return data;
}
};
-const getTokensCall = Meteor.wrapAsync(getTokens);
-const getServiceData = query => getServiceDataFromTokens(getTokensCall(query));
+const getServiceData = async (query) =>
+ getServiceDataFromTokens(await getTokens(query));
OAuth.registerService('google', 2, null, getServiceData);
@@ -159,14 +180,15 @@ const getIdentity = async (accessToken, callback) => {
`https://www.googleapis.com/oauth2/v1/userinfo?${content.toString()}`,
{
method: 'GET',
- headers: { Accept: 'application/json' }
- });
+ headers: { Accept: 'application/json' },
+ }
+ );
response = await request.json();
} catch (e) {
- callback(e);
+ callback && callback(e);
throw new Meteor.Error(e.reason);
}
- callback(undefined, response);
+ callback && callback(undefined, response);
return response;
};
@@ -178,14 +200,15 @@ const getScopes = async (accessToken, callback) => {
`https://www.googleapis.com/oauth2/v1/tokeninfo?${content.toString()}`,
{
method: 'GET',
- headers: { Accept: 'application/json' }
- });
+ headers: { Accept: 'application/json' },
+ }
+ );
response = await request.json();
} catch (e) {
- callback(e);
+ callback && callback(e);
throw new Meteor.Error(e.reason);
}
- callback(undefined, response.scope.split(' '));
+ callback && callback(undefined, response.scope.split(' '));
return response.scope.split(' ');
};
diff --git a/packages/google-oauth/package.js b/packages/google-oauth/package.js
index 102f60b0ac..141c79e6c6 100644
--- a/packages/google-oauth/package.js
+++ b/packages/google-oauth/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Google OAuth flow",
- version: "1.4.2",
+ version: "1.4.3",
});
Cordova.depends({
diff --git a/packages/meetup-oauth/meetup_server.js b/packages/meetup-oauth/meetup_server.js
index cffa8da9e5..bfc465c7b3 100644
--- a/packages/meetup-oauth/meetup_server.js
+++ b/packages/meetup-oauth/meetup_server.js
@@ -1,10 +1,10 @@
Meetup = {};
-OAuth.registerService('meetup', 2, null, query => {
- const response = getAccessToken(query);
+OAuth.registerService('meetup', 2, null, async query => {
+ const response = await getAccessToken(query);
const accessToken = response.access_token;
const expiresAt = (+new Date) + (1000 * response.expires_in);
- const identity = getIdentity(accessToken);
+ const identity = await getIdentity(accessToken);
const {
id,
name,
@@ -33,50 +33,63 @@ OAuth.registerService('meetup', 2, null, query => {
};
});
-const getAccessToken = query => {
+const getAccessToken = async query => {
const config = ServiceConfiguration.configurations.findOne({service: 'meetup'});
if (!config)
throw new ServiceConfiguration.ConfigError();
- let response;
- try {
- response = HTTP.post(
- "https://secure.meetup.com/oauth2/access", {headers: {Accept: 'application/json'}, params: {
- code: query.code,
- client_id: config.clientId,
- client_secret: OAuth.openSecret(config.secret),
- grant_type: 'authorization_code',
- redirect_uri: OAuth._redirectUri('meetup', config),
- state: query.state
- }});
- } catch (err) {
- throw Object.assign(
- new Error(`Failed to complete OAuth handshake with Meetup. ${err.message}`),
- { response: err.response }
- );
- }
+ const body = OAuth._addValuesToQueryParams({
+ code: query.code,
+ client_id: config.clientId,
+ client_secret: OAuth.openSecret(config.secret),
+ grant_type: 'authorization_code',
+ redirect_uri: OAuth._redirectUri('meetup', config),
+ state: query.state
+ });
- if (response.data.error) { // if the http response was a json object with an error attribute
- throw new Error(`Failed to complete OAuth handshake with Meetup. ${response.data.error}`);
- } else {
- return response.data;
- }
+ return OAuth._fetch('https://secure.meetup.com/oauth2/access', 'POST', {
+ headers: {
+ Accept: 'application/json',
+ 'Content-type': 'application/x-www-form-urlencoded',
+ },
+ body,
+ })
+ .then(data => data.json())
+ .then(data => {
+ if (data.error) {
+ throw new Error(`Failed to complete OAuth handshake with Meetup. ${data.error.message}`);
+ }
+ return data;
+ })
+ .catch(err => {
+ throw Object.assign(
+ new Error(`Failed to complete OAuth handshake with Meetup. ${err.message}`),
+ { response: err.response },
+ );
+ });
};
-const getIdentity = accessToken => {
- try {
- const response = HTTP.get(
- "https://api.meetup.com/2/members",
- {params: {member_id: 'self', access_token: accessToken}});
- return response.data.results && response.data.results[0];
- } catch (err) {
+const getIdentity = async accessToken => {
+ const body = OAuth._addValuesToQueryParams({
+ member_id: 'self',
+ access_token: accessToken
+ });
+
+ return OAuth._fetch('https://api.meetup.com/2/members', 'POST', {
+ headers: {
+ Accept: 'application/json',
+ 'Content-type': 'application/x-www-form-urlencoded',
+ },
+ body,
+ }).then(data => data.json())
+ .then(({results = []}) => results.length && results[0])
+ .catch(err => {
throw Object.assign(
new Error(`Failed to fetch identity from Meetup. ${err.message}`),
{ response: err.response }
);
- }
+ });
};
-
Meetup.retrieveCredential = (credentialToken, credentialSecret) =>
OAuth.retrieveCredential(credentialToken, credentialSecret);
diff --git a/packages/meetup-oauth/package.js b/packages/meetup-oauth/package.js
index 83df9f74a3..e5049f19cf 100644
--- a/packages/meetup-oauth/package.js
+++ b/packages/meetup-oauth/package.js
@@ -1,13 +1,12 @@
Package.describe({
summary: 'Meetup OAuth flow',
- version: '1.1.1'
+ version: '1.1.2'
});
Package.onUse(api => {
api.use('ecmascript');
api.use('oauth2', ['client', 'server']);
api.use('oauth', ['client', 'server']);
- api.use('http@1.4.4 || 2.0.0', 'server');
api.use('random', 'client');
api.use('service-configuration', ['client', 'server']);
diff --git a/packages/meteor-developer-oauth/meteor_developer_server.js b/packages/meteor-developer-oauth/meteor_developer_server.js
index c563ba47e8..57dd193ae1 100644
--- a/packages/meteor-developer-oauth/meteor_developer_server.js
+++ b/packages/meteor-developer-oauth/meteor_developer_server.js
@@ -1,7 +1,7 @@
-OAuth.registerService("meteor-developer", 2, null, query => {
- const response = getTokens(query);
+OAuth.registerService("meteor-developer", 2, null, async query => {
+ const response = await getTokens(query);
const { accessToken } = response;
- const identity = getIdentity(accessToken);
+ const identity = await getIdentity(accessToken);
const serviceData = {
accessToken: OAuth.sealSecret(accessToken),
@@ -28,69 +28,77 @@ OAuth.registerService("meteor-developer", 2, null, query => {
// - expiresIn: lifetime of token in seconds
// - refreshToken, if this is the first authorization request and we got a
// refresh token from the server
-const getTokens = query => {
+const getTokens = async (query) => {
const config = ServiceConfiguration.configurations.findOne({
- service: 'meteor-developer'
+ service: 'meteor-developer',
});
- if (!config)
+ if (!config) {
throw new ServiceConfiguration.ConfigError();
+ }
- let response;
- try {
- response = HTTP.post(
- MeteorDeveloperAccounts._server + "/oauth2/token", {
- params: {
- grant_type: "authorization_code",
- code: query.code,
- client_id: config.clientId,
- client_secret: OAuth.openSecret(config.secret),
- redirect_uri: OAuth._redirectUri('meteor-developer', config)
- }
+ const body = OAuth._addValuesToQueryParams({
+ grant_type: 'authorization_code',
+ code: query.code,
+ client_id: config.clientId,
+ client_secret: OAuth.openSecret(config.secret),
+ redirect_uri: OAuth._redirectUri('meteor-developer', config),
+ }).toString();
+
+ return OAuth._fetch(
+ MeteorDeveloperAccounts._server + '/oauth2/token',
+ 'POST',
+ {
+ headers: {
+ Accept: 'application/json',
+ 'Content-type': 'application/x-www-form-urlencoded',
+ },
+ body,
+ }
+ )
+ .then((data) => data.json())
+ .then((data) => {
+ if (data.error) {
+ throw new Error(
+ 'Failed to complete OAuth handshake with Meteor developer accounts. ' +
+ (data ? data.error : 'No response data')
+ );
}
- );
- } catch (err) {
- throw Object.assign(
- new Error(
- "Failed to complete OAuth handshake with Meteor developer accounts. "
- + err.message
- ),
- {response: err.response}
- );
- }
-
- if (! response.data || response.data.error) {
- // if the http response was a json object with an error attribute
- throw new Error(
- "Failed to complete OAuth handshake with Meteor developer accounts. " +
- (response.data ? response.data.error :
- "No response data")
- );
- } else {
- return {
- accessToken: response.data.access_token,
- refreshToken: response.data.refresh_token,
- expiresIn: response.data.expires_in
- };
- }
+ return {
+ accessToken: data.access_token,
+ refreshToken: data.refresh_token,
+ expiresIn: data.expires_in,
+ };
+ })
+ .catch((err) => {
+ throw Object.assign(
+ new Error(
+ `Failed to complete OAuth handshake with Meteor developer accounts. ${err.message}`
+ ),
+ { response: err.response }
+ );
+ });
};
-const getIdentity = accessToken => {
- try {
- return HTTP.get(
- `${MeteorDeveloperAccounts._server}/api/v1/identity`,
- {
- headers: { Authorization: `Bearer ${accessToken}`}
- }
- ).data;
- } catch (err) {
- throw Object.assign(
- new Error("Failed to fetch identity from Meteor developer accounts. " +
- err.message),
- {response: err.response}
- );
- }
+const getIdentity = async (accessToken) => {
+ return OAuth._fetch(
+ `${MeteorDeveloperAccounts._server}/api/v1/identity`,
+ 'GET',
+ {
+ headers: { Authorization: `Bearer ${accessToken}` },
+ }
+ )
+ .then((data) => data.json())
+ .catch((err) => {
+ throw Object.assign(
+ new Error(
+ 'Failed to fetch identity from Meteor developer accounts. ' +
+ err.message
+ ),
+ { response: err.response }
+ );
+ });
};
-MeteorDeveloperAccounts.retrieveCredential =
- (credentialToken, credentialSecret) =>
+MeteorDeveloperAccounts.retrieveCredential =
+ (credentialToken, credentialSecret) =>
OAuth.retrieveCredential(credentialToken, credentialSecret);
diff --git a/packages/meteor-developer-oauth/package.js b/packages/meteor-developer-oauth/package.js
index b1463542d5..36e4dbb76c 100644
--- a/packages/meteor-developer-oauth/package.js
+++ b/packages/meteor-developer-oauth/package.js
@@ -1,12 +1,11 @@
Package.describe({
summary: 'Meteor developer accounts OAuth flow',
- version: '1.3.1'
+ version: '1.3.2'
});
Package.onUse(api => {
api.use('oauth2', ['client', 'server']);
api.use('oauth', ['client', 'server']);
- api.use('http@1.4.4 || 2.0.0', ['server']);
api.use(['ecmascript', 'service-configuration'], ['client', 'server']);
api.use('random', 'client');
diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js
index b28bbf6643..e31fcbacf3 100644
--- a/packages/meteor-tool/package.js
+++ b/packages/meteor-tool/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: 'The Meteor command-line tool',
- version: '2.8.1',
+ version: '2.9.1',
});
Package.includeTool();
diff --git a/packages/meteor/asl-helpers.js b/packages/meteor/asl-helpers.js
new file mode 100644
index 0000000000..27d9b227cb
--- /dev/null
+++ b/packages/meteor/asl-helpers.js
@@ -0,0 +1,22 @@
+const getAslStore = () => (Meteor.isServer && global?.asyncLocalStorage?.getStore()) || {};
+const getValueFromAslStore = key => getAslStore()[key];
+const updateAslStore = (key, value) => getAslStore()[key] = value;
+
+Meteor._isFibersEnabled = !process.env.DISABLE_FIBERS && Meteor.isServer;
+Meteor._getAslStore = getAslStore;
+Meteor._getValueFromAslStore = getValueFromAslStore;
+Meteor._updateAslStore = updateAslStore;
+
+Meteor._runAsync = (fn, ctx) => {
+ if (Meteor._isFibersEnabled) {
+ const Fiber = Npm.require('fibers');
+
+ return Fiber(() => {
+ fn.call(ctx);
+ }).run();
+ }
+
+ global.asyncLocalStorage.run(Meteor._getAslStore(), () => {
+ fn.call(ctx);
+ });
+};
diff --git a/packages/meteor/helpers.js b/packages/meteor/helpers.js
index ad28064003..242921945c 100644
--- a/packages/meteor/helpers.js
+++ b/packages/meteor/helpers.js
@@ -71,6 +71,38 @@ Meteor._delete = function (obj /*, arguments */) {
}
};
+
+/**
+ * Takes a function that has a callback argument as the last one and promissify it.
+ * One option would be to use node utils.promisify, but it won't work on the browser.
+ * @param fn
+ * @param context
+ * @param errorFirst - If the callback follows the errorFirst style
+ * @returns {function(...[*]): Promise}
+ */
+Meteor.promisify = function (fn, context, errorFirst = true) {
+ return function (...fnArgs) {
+ return new Promise((resolve, reject) => {
+ const callback = Meteor.bindEnvironment((error, result) => {
+ let _error = error, _result = result;
+ if (!errorFirst) {
+ _error = result;
+ _result = error;
+ }
+
+ if (_error) {
+ return reject(_error);
+ }
+
+ resolve(_result);
+ });
+
+ const filteredArgs = [...fnArgs, callback].filter(i => i !== undefined);
+ return fn.apply(context || this, filteredArgs);
+ });
+ };
+};
+
// wrapAsync can wrap any function that takes some number of arguments that
// can't be undefined, followed by some optional arguments, where the callback
// is the last optional argument.
@@ -171,5 +203,3 @@ function logErr(err) {
);
}
}
-
-Meteor._isFibersEnabled = global._isFibersEnabled;
diff --git a/packages/meteor/meteor.d.ts b/packages/meteor/meteor.d.ts
index 0a482c0aa9..eb08d994bd 100644
--- a/packages/meteor/meteor.d.ts
+++ b/packages/meteor/meteor.d.ts
@@ -147,12 +147,19 @@ export namespace Meteor {
}): void;
/**
- * Invokes a method passing any number of arguments.
+ * Invokes a method with a sync stub, passing any number of arguments.
* @param name Name of method to invoke
* @param args Optional method arguments
*/
function call(name: string, ...args: any[]): any;
+ /**
+ * Invokes a method with an async stub, passing any number of arguments.
+ * @param name Name of method to invoke
+ * @param args Optional method arguments
+ */
+ function callAsync(name: string, ...args: any[]): Promise;
+
function apply<
Result extends
| EJSONable
@@ -434,7 +441,14 @@ export namespace Meteor {
*/
function publish(
name: string | null,
- func: (this: Subscription, ...args: any[]) => void,
+ func: (
+ this: Subscription,
+ ...args: any[]
+ ) =>
+ | void
+ | Mongo.Cursor
+ | Mongo.Cursor[]
+ | Promise | Mongo.Cursor[]>,
options?: { is_auto: boolean }
): void;
diff --git a/packages/meteor/package.js b/packages/meteor/package.js
index 930478dc07..9056fec7d6 100644
--- a/packages/meteor/package.js
+++ b/packages/meteor/package.js
@@ -2,7 +2,7 @@
Package.describe({
summary: "Core Meteor environment",
- version: '1.10.2'
+ version: '1.10.4'
});
Package.registerBuildPlugin({
@@ -33,6 +33,7 @@ Package.onUse(function (api) {
api.addFiles('setimmediate.js', ['client', 'server']);
api.addFiles('timers.js', ['client', 'server']);
api.addFiles('errors.js', ['client', 'server']);
+ api.addFiles('asl-helpers.js', 'server');
api.addFiles('fiber_helpers.js', 'server');
api.addFiles('fiber_stubs_client.js', 'client');
api.addFiles('startup_client.js', ['client']);
diff --git a/packages/minifier-css/minifier-async-tests.js b/packages/minifier-css/minifier-async-tests.js
new file mode 100644
index 0000000000..755595ba6e
--- /dev/null
+++ b/packages/minifier-css/minifier-async-tests.js
@@ -0,0 +1,51 @@
+import { CssTools } from './minifier';
+const TEST_CASES = [
+ ['a \t\n{ color: red } \n', 'a{color:red}', 'whitespace check'],
+ [
+ 'a \t\n{ color: red; margin: 1; } \n',
+ 'a{color:red;margin:1}',
+ 'only last one loses semicolon',
+ ],
+ [
+ 'a \t\n{ color: red;;; margin: 1;;; } \n',
+ 'a{color:red;margin:1}',
+ 'more semicolons than needed',
+ ],
+ ['a , p \t\n{ color: red; } \n', 'a,p{color:red}', 'multiple selectors'],
+ ['body {}', '', 'removing empty rules'],
+ [
+ '*.my-class { color: #fff; }',
+ '.my-class{color:#fff}',
+ 'removing universal selector',
+ ],
+ [
+ 'p > *.my-class { color: #fff; }',
+ 'p>.my-class{color:#fff}',
+ 'removing optional whitespace around ">" in selector',
+ ],
+ [
+ 'p + *.my-class { color: #fff; }',
+ 'p+.my-class{color:#fff}',
+ 'removing optional whitespace around "+" in selector',
+ ],
+ [
+ 'a {\n\
+ font:12px \'Helvetica\',"Arial",\'Nautica\';\n\
+ background:url("/some/nice/picture.png");\n}',
+ 'a{font:12px Helvetica,Arial,Nautica;background:url(/some/nice/picture.png)}',
+ 'removing quotes in font and url (if possible)',
+ ],
+ ['/* no comments */ a { color: red; }', 'a{color:red}', 'remove comments'],
+];
+
+Tinytest.addAsync(
+ '[Async] minifier-css - simple CSS minification',
+ async (test) => {
+ const promises = TEST_CASES.map(([css, expected, desc]) =>
+ CssTools.minifyCssAsync(css).then((minifiedCss) => {
+ test.equal(minifiedCss[0], expected, desc);
+ })
+ );
+ return Promise.all(promises);
+ }
+);
diff --git a/packages/minifier-css/minifier.js b/packages/minifier-css/minifier.js
index 174452f1ee..a4c662e9e5 100644
--- a/packages/minifier-css/minifier.js
+++ b/packages/minifier-css/minifier.js
@@ -1,6 +1,5 @@
import path from 'path';
import url from 'url';
-import Future from 'fibers/future';
import postcss from 'postcss';
import cssnano from 'cssnano';
@@ -65,23 +64,21 @@ const CssTools = {
* @return {String[]} Array containing the minified CSS.
*/
minifyCss(cssText) {
- const f = new Future;
- postcss([
- cssnano({ safe: true }),
- ]).process(cssText, {
- from: void 0,
- }).then(result => {
- f.return(result.css);
- }).catch(error => {
- f.throw(error);
- });
- const minifiedCss = f.wait();
+ return Promise.await(CssTools.minifyCssAsync(cssText));
+ },
- // Since this function has always returned an array, we'll wrap the
- // minified css string in an array before returning, even though we're
- // only ever returning one minified css string in that array (maintaining
- // backwards compatibility).
- return [minifiedCss];
+ /**
+ * Minify the passed in CSS string.
+ *
+ * @param {string} cssText CSS string to minify.
+ * @return {Promise} Array containing the minified CSS.
+ */
+ async minifyCssAsync(cssText) {
+ return await postcss([cssnano({ safe: true })])
+ .process(cssText, {
+ from: void 0,
+ })
+ .then((result) => [result.css]);
},
/**
@@ -187,6 +184,7 @@ if (typeof Profile !== 'undefined') {
'parseCss',
'stringifyCss',
'minifyCss',
+ 'minifyCssAsync',
'mergeCssAsts',
'rewriteCssUrls',
].forEach(funcName => {
diff --git a/packages/minifier-css/package.js b/packages/minifier-css/package.js
index 022ed4c78c..373e5ae579 100644
--- a/packages/minifier-css/package.js
+++ b/packages/minifier-css/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: 'CSS minifier',
- version: '1.6.1'
+ version: '1.6.2'
});
Npm.depends({
@@ -19,6 +19,7 @@ Package.onTest(function (api) {
api.use('tinytest');
api.addFiles([
'minifier-tests.js',
+ 'minifier-async-tests.js',
'urlrewriting-tests.js'
], 'server');
});
diff --git a/packages/minimongo/cursor.js b/packages/minimongo/cursor.js
index 72a51cd67b..0c119a8f81 100644
--- a/packages/minimongo/cursor.js
+++ b/packages/minimongo/cursor.js
@@ -39,7 +39,11 @@ export default class Cursor {
}
/**
- * @summary Returns the number of documents that match a query.
+ * @deprecated in 2.9
+ * @summary Returns the number of documents that match a query. This method is
+ * [deprecated since MongoDB 4.0](https://www.mongodb.com/docs/v4.4/reference/command/count/);
+ * see `Collection.countDocuments` and
+ * `Collection.estimatedDocumentCount` for a replacement.
* @memberOf Mongo.Cursor
* @method count
* @instance
diff --git a/packages/minimongo/local_collection.js b/packages/minimongo/local_collection.js
index e3668eeb03..43877fb87e 100644
--- a/packages/minimongo/local_collection.js
+++ b/packages/minimongo/local_collection.js
@@ -39,6 +39,14 @@ export default class LocalCollection {
this.paused = false;
}
+ countDocuments(selector, options) {
+ return this.find(selector ?? {}, options).countAsync();
+ }
+
+ estimatedDocumentCount(options) {
+ return this.find({}, options).countAsync();
+ }
+
// options may include sort, skip, limit, reactive
// sort may be any of these forms:
// {a: 1, b: -1}
diff --git a/packages/minimongo/package.js b/packages/minimongo/package.js
index 3b8e47fb2f..2353ea1305 100644
--- a/packages/minimongo/package.js
+++ b/packages/minimongo/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Meteor's client-side datastore: a port of MongoDB to Javascript",
- version: '1.9.0'
+ version: '1.9.1'
});
Package.onUse(api => {
diff --git a/packages/mongo/collection.js b/packages/mongo/collection.js
index 3dcc12dc96..d5b99edae4 100644
--- a/packages/mongo/collection.js
+++ b/packages/mongo/collection.js
@@ -319,6 +319,33 @@ Object.assign(Mongo.Collection.prototype, {
///
/// Main collection API
///
+ /**
+ * @summary Gets the number of documents matching the filter. For a fast count of the total documents in a collection see `estimatedDocumentCount`.
+ * @locus Anywhere
+ * @method countDocuments
+ * @memberof Mongo.Collection
+ * @instance
+ * @param {MongoSelector} [selector] A query describing the documents to count
+ * @param {Object} [options] All options are listed in [MongoDB documentation](https://mongodb.github.io/node-mongodb-native/4.11/interfaces/CountDocumentsOptions.html). Please note that not all of them are available on the client.
+ * @returns {Promise}
+ */
+ countDocuments(...args) {
+ return this._collection.countDocuments(...args);
+ },
+
+ /**
+ * @summary Gets an estimate of the count of documents in a collection using collection metadata. For an exact count of the documents in a collection see `countDocuments`.
+ * @locus Anywhere
+ * @method estimatedDocumentCount
+ * @memberof Mongo.Collection
+ * @instance
+ * @param {MongoSelector} [selector] A query describing the documents to count
+ * @param {Object} [options] All options are listed in [MongoDB documentation](https://mongodb.github.io/node-mongodb-native/4.11/interfaces/EstimatedDocumentCountOptions.html). Please note that not all of them are available on the client.
+ * @returns {Promise}
+ */
+ estimatedDocumentCount(...args) {
+ return this._collection.estimatedDocumentCount(...args);
+ },
_getFindSelector(args) {
if (args.length == 0) return {};
diff --git a/packages/mongo/collection_async_tests.js b/packages/mongo/collection_async_tests.js
index 5d3a277fa0..d709cee26c 100644
--- a/packages/mongo/collection_async_tests.js
+++ b/packages/mongo/collection_async_tests.js
@@ -19,3 +19,14 @@ Tinytest.add('async collection - check for methods presence', function (test) {
isFunction(cursor.mapAsync);
isFunction(cursor[Symbol.asyncIterator]);
});
+
+['countDocuments', 'estimatedDocumentCount'].forEach(method => {
+ Tinytest.addAsync(`async collection - ${method}`, async test => {
+ const collection = new Mongo.Collection(method + test.id);
+ for (let index = 0; index < 10; ++index) {
+ test.instanceOf(collection[method](), Promise);
+ test.equal(await collection[method](), index);
+ collection.insert({});
+ }
+ });
+});
diff --git a/packages/mongo/collection_tests.js b/packages/mongo/collection_tests.js
index 78da9a1f18..fb92fb8b79 100644
--- a/packages/mongo/collection_tests.js
+++ b/packages/mongo/collection_tests.js
@@ -170,8 +170,8 @@ Tinytest.add('collection - calling find with a valid readPreference',
);
// Trigger the creation of _synchronousCursor
- defaultCursor.count();
- customCursor.count();
+ defaultCursor.fetch();
+ customCursor.fetch();
// defaultCursor._synchronousCursor._dbCursor.operation is not an option anymore
// as the cursor options are now private
@@ -384,3 +384,33 @@ Tinytest.add('collection - finding with a query with a binary field should retur
}
}
);
+
+
+Tinytest.add('collection - count should release the session',
+ function(test) {
+ const client = MongoInternals.defaultRemoteCollectionDriver().mongo.client;
+ var collectionName = 'count' + test.id;
+ var collection = new Mongo.Collection(collectionName);
+ collection.insert({ _id: '1' });
+ collection.insert({ _id: '2' });
+ collection.insert({ _id: '3' });
+ const preCount = client.s.activeSessions.size;
+
+ test.equal(collection.find().count(), 3);
+
+ // options and selector still work
+ test.equal(collection.find({ _id: { $ne: '1' } }, { skip: 1 }).count(), 1);
+
+ // cursor reuse
+ const cursor1 = collection.find({ _id: { $ne: '1' } }, { skip: 1 });
+ test.equal(cursor1.count(), 1);
+ test.equal(cursor1.fetch().length, 1);
+
+ const cursor2 = collection.find({ _id: { $ne: '1' } }, { skip: 1 });
+ test.equal(cursor2.fetch().length, 1);
+ test.equal(cursor2.count(), 1);
+
+ const postCount = client.s.activeSessions.size;
+ test.equal(preCount, postCount);
+ }
+);
diff --git a/packages/mongo/mongo_driver.js b/packages/mongo/mongo_driver.js
index 5d653636a8..7b7b24ec00 100644
--- a/packages/mongo/mongo_driver.js
+++ b/packages/mongo/mongo_driver.js
@@ -826,6 +826,18 @@ MongoConnection.prototype.createIndex = function (collectionName, index,
future.wait();
};
+MongoConnection.prototype.countDocuments = function (collectionName, ...args) {
+ args = args.map(arg => replaceTypes(arg, replaceMeteorAtomWithMongo));
+ const collection = this.rawCollection(collectionName);
+ return collection.countDocuments(...args);
+};
+
+MongoConnection.prototype.estimatedDocumentCount = function (collectionName, ...args) {
+ args = args.map(arg => replaceTypes(arg, replaceMeteorAtomWithMongo));
+ const collection = this.rawCollection(collectionName);
+ return collection.estimatedDocumentCount(...args);
+};
+
MongoConnection.prototype._ensureIndex = MongoConnection.prototype.createIndex;
MongoConnection.prototype._dropIndex = function (collectionName, index) {
@@ -907,11 +919,24 @@ function setupSynchronousCursor(cursor, method) {
return cursor._synchronousCursor;
}
+
+Cursor.prototype.count = function () {
+ const collection = this._mongo.rawCollection(this._cursorDescription.collectionName);
+ return Promise.await(collection.countDocuments(
+ replaceTypes(this._cursorDescription.selector, replaceMeteorAtomWithMongo),
+ replaceTypes(this._cursorDescription.options, replaceMeteorAtomWithMongo),
+ ));
+};
+
[...ASYNC_CURSOR_METHODS, Symbol.iterator, Symbol.asyncIterator].forEach(methodName => {
- Cursor.prototype[methodName] = function (...args) {
- const cursor = setupSynchronousCursor(this, methodName);
- return cursor[methodName](...args);
- };
+ // count is handled specially since we don't want to create a cursor.
+ // it is still included in ASYNC_CURSOR_METHODS because we still want an async version of it to exist.
+ if (methodName !== 'count') {
+ Cursor.prototype[methodName] = function (...args) {
+ const cursor = setupSynchronousCursor(this, methodName);
+ return cursor[methodName](...args);
+ };
+ }
// These methods are handled separately.
if (methodName === Symbol.iterator || methodName === Symbol.asyncIterator) {
diff --git a/packages/mongo/oplog_v2_converter.js b/packages/mongo/oplog_v2_converter.js
index 952a37478f..43c6e64411 100644
--- a/packages/mongo/oplog_v2_converter.js
+++ b/packages/mongo/oplog_v2_converter.js
@@ -36,7 +36,7 @@ function join(prefix, key) {
return prefix ? `${prefix}.${key}` : key;
}
-const arrayOperatorKeyRegex = /^(a|u\d+)$/;
+const arrayOperatorKeyRegex = /^(a|[su]\d+)$/;
function isArrayOperatorKey(field) {
return arrayOperatorKeyRegex.test(field);
@@ -96,7 +96,9 @@ function convertOplogDiff(oplogEntry, diff, prefix) {
}
const positionKey = join(join(prefix, key), position.slice(1));
- if (value === null) {
+ if (position[0] === 's') {
+ convertOplogDiff(oplogEntry, value, positionKey);
+ } else if (value === null) {
oplogEntry.$unset ??= {};
oplogEntry.$unset[positionKey] = true;
} else {
diff --git a/packages/mongo/oplog_v2_converter_tests.js b/packages/mongo/oplog_v2_converter_tests.js
index f87c8877f3..79bcbada93 100644
--- a/packages/mongo/oplog_v2_converter_tests.js
+++ b/packages/mongo/oplog_v2_converter_tests.js
@@ -77,6 +77,71 @@ const cases = [
{ $v: 2, diff: { u: { params: { e: { _str: '5f953cde8ceca90030bdb86f' } } } } },
{ $v: 2, $set: { params: { e: { _str: '5f953cde8ceca90030bdb86f' } } } },
],
+ [
+ {
+ $v: 2,
+ diff: {
+ sitems: {
+ a: true,
+ s0: {
+ u: { id: 'm57DsX8g8L66bM5JX', name: 'Alice' },
+ sbio: { u: { en: 'Just Alice' } },
+ slanguages: {
+ a: true,
+ s0: {
+ u: { englishName: 'English', key: 'en', localName: 'English' },
+ },
+ },
+ },
+ u1: {
+ id: 'FJwSQHqwpenCN6RQH',
+ name: 'Bob',
+ title: { en: 'Fictional character', sv: '' },
+ bio: { en: 'Just Bob', sv: '' },
+ avatar: null,
+ languages: [
+ { key: 'sv', englishName: 'Swedish', localName: 'Sverige' },
+ ],
+ },
+ u2: null
+ },
+ },
+ },
+ {
+ $v: 2,
+ $set: {
+ 'items.0.id': 'm57DsX8g8L66bM5JX',
+ 'items.0.name': 'Alice',
+ 'items.0.bio.en': 'Just Alice',
+ 'items.0.languages.0.englishName': 'English',
+ 'items.0.languages.0.key': 'en',
+ 'items.0.languages.0.localName': 'English',
+ 'items.1': {
+ id: 'FJwSQHqwpenCN6RQH',
+ name: 'Bob',
+ title: {
+ en: 'Fictional character',
+ sv: '',
+ },
+ bio: {
+ en: 'Just Bob',
+ sv: '',
+ },
+ avatar: null,
+ languages: [
+ {
+ key: 'sv',
+ englishName: 'Swedish',
+ localName: 'Sverige',
+ },
+ ],
+ },
+ },
+ $unset: {
+ 'items.2': true
+ }
+ },
+ ]
];
Tinytest.add('oplog - v2/v1 conversion', function (test) {
diff --git a/packages/mongo/package.js b/packages/mongo/package.js
index 31ef5d4b77..e744c56705 100644
--- a/packages/mongo/package.js
+++ b/packages/mongo/package.js
@@ -9,7 +9,7 @@
Package.describe({
summary: "Adaptor for using MongoDB and Minimongo over DDP",
- version: '1.16.1'
+ version: '1.16.3'
});
Npm.depends({
diff --git a/packages/mongo/remote_collection_driver.js b/packages/mongo/remote_collection_driver.js
index f237879de0..035af45157 100644
--- a/packages/mongo/remote_collection_driver.js
+++ b/packages/mongo/remote_collection_driver.js
@@ -4,13 +4,28 @@ MongoInternals.RemoteCollectionDriver = function (
self.mongo = new MongoConnection(mongo_url, options);
};
+const REMOTE_COLLECTION_METHODS = [
+ '_createCappedCollection',
+ '_dropIndex',
+ '_ensureIndex',
+ 'createIndex',
+ 'countDocuments',
+ 'dropCollection',
+ 'estimatedDocumentCount',
+ 'find',
+ 'findOne',
+ 'insert',
+ 'rawCollection',
+ 'remove',
+ 'update',
+ 'upsert',
+];
+
Object.assign(MongoInternals.RemoteCollectionDriver.prototype, {
open: function (name) {
var self = this;
var ret = {};
- ['find', 'findOne', 'insert', 'update', 'upsert',
- 'remove', '_ensureIndex', 'createIndex', '_dropIndex', '_createCappedCollection',
- 'dropCollection', 'rawCollection'].forEach(
+ REMOTE_COLLECTION_METHODS.forEach(
function (m) {
ret[m] = _.bind(self.mongo[m], self.mongo, name);
});
diff --git a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json
index 11662ebe99..b276e22ce7 100644
--- a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json
+++ b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json
@@ -62,214 +62,224 @@
}
},
"@aws-sdk/abort-controller": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.190.0.tgz",
- "integrity": "sha512-M6qo2exTzEfHT5RuW7K090OgesUojhb2JyWiV4ulu7ngY4DWBUBMKUqac696sHRUZvGE5CDzSi0606DMboM+kA=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.215.0.tgz",
+ "integrity": "sha512-HTvL542nawhVqe0oC1AJchdcomEOmPivJEzYUT1LqiG3e8ikxMNa2KWSqqLPeKi2t0A/cfQy7wDUyg9+BZhDSQ=="
},
"@aws-sdk/client-cognito-identity": {
- "version": "3.192.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.192.0.tgz",
- "integrity": "sha512-nIRmiv5JY8wWGUadhG7yLx8o8aVETj5CAgO8e8UJIwwqfue/Yv9bHi2mvkUphO1pj0TeBatAtvu79neJQtsR5g=="
+ "version": "3.218.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.218.0.tgz",
+ "integrity": "sha512-IHzM9jpLqdeqj2w7YA7FrmLCQyKaun7eXtu1OJYMFbJT5XHx6B4jlQ1T/N8xivSSzDfjpJxG6/MMmjec4pI+CA=="
},
"@aws-sdk/client-sso": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.190.0.tgz",
- "integrity": "sha512-joEKRjJEzgvXnEih/x2UDDCPlvXWCO3MAHmqi44yJ36Ph4YsFS299mOjPdVLuzUtpQ+cST1nRO7hXNFrulW2jQ=="
+ "version": "3.218.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.218.0.tgz",
+ "integrity": "sha512-kVMlpjaVblxgb1G8q3wD65mKxO3RzKwnjUjIBmOHpmseXzlSkAdAvYcikaDoJP+CRmys4uXk5DN8c7ZdL0OmgA=="
+ },
+ "@aws-sdk/client-sso-oidc": {
+ "version": "3.216.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.216.0.tgz",
+ "integrity": "sha512-O8kmM86BHwiSwyNoIe+iHXuSpUE9PBWl3re8u+/igt/w5W5VmMVz+zQr7gRUDQ1FDgLWNEdAJa0r+JFx3pZdzA=="
},
"@aws-sdk/client-sts": {
- "version": "3.192.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.192.0.tgz",
- "integrity": "sha512-iv72dmRxbZ1cN5jGn4KIVzzu11eduS2fXHbNgd7JsFd5hLBV5TvJaugQzUdXNmy2gN4HiRJr+qa9WkD5b39lsA=="
+ "version": "3.218.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.218.0.tgz",
+ "integrity": "sha512-0A81eHvryKFEPq7IeY34Opzh5b9bVhhLlf2fDy5VuZjCFf4R9vD2ceOANvFSJeMsmdlqVDq8U1mHYl0E6FRUug=="
},
"@aws-sdk/config-resolver": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.190.0.tgz",
- "integrity": "sha512-K+VnDtjTgjpf7yHEdDB0qgGbHToF0pIL0pQMSnmk2yc8BoB3LGG/gg1T0Ki+wRlrFnDCJ6L+8zUdawY2qDsbyw=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.215.0.tgz",
+ "integrity": "sha512-DxX4R+YYLQOtg0qfceKBrjVD4t1mQBG1eb7IVr2QSlckFCX8ztUNymFMuaSEo3938Jyy/NpgfUDpFqPDaSKnng=="
},
"@aws-sdk/credential-provider-cognito-identity": {
- "version": "3.192.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.192.0.tgz",
- "integrity": "sha512-CWo+KyHCGyYtvjlmDIGtnwBEkdiondergZADiStbFFvie8pPI7IsdTXNVssQQ1VxKIBGGHVebgZGSklHBqthwA=="
+ "version": "3.218.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.218.0.tgz",
+ "integrity": "sha512-ndhlPBvnxUgje23TnVw0fkDgTZHh0GVapKSgeEIxmxAy3IVLN15iMs7dCV7LWvb7z1P0cYx9cwvxa0nTrVxjtg=="
},
"@aws-sdk/credential-provider-env": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.190.0.tgz",
- "integrity": "sha512-GTY7l3SJhTmRGFpWddbdJOihSqoMN8JMo3CsCtIjk4/h3xirBi02T4GSvbrMyP7FP3Fdl4NAdT+mHJ4q2Bvzxw=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.215.0.tgz",
+ "integrity": "sha512-n5G7I7Pxfsn81+tNsSOzspKp9SYai78oRfImsfFY4JLTcWutv7szMgFUbtEzBfUUINHpOxLiO2Lk5yu5K1C7IQ=="
},
"@aws-sdk/credential-provider-imds": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.190.0.tgz",
- "integrity": "sha512-gI5pfBqGYCKdmx8igPvq+jLzyE2kuNn9Q5u73pdM/JZxiq7GeWYpE/MqqCubHxPtPcTFgAwxCxCFoXlUTBh/2g=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.215.0.tgz",
+ "integrity": "sha512-/4FUUR6u9gkNfxB6mEwBr0kk0myIkrDcXbAocWN3fPd/t7otzxpx/JqPZXgM6kcVP7M4T/QT75l1E1RRHLWCCQ=="
},
"@aws-sdk/credential-provider-ini": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.190.0.tgz",
- "integrity": "sha512-Z7NN/evXJk59hBQlfOSWDfHntwmxwryu6uclgv7ECI6SEVtKt1EKIlPuCLUYgQ4lxb9bomyO5lQAl/1WutNT5w=="
+ "version": "3.218.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.218.0.tgz",
+ "integrity": "sha512-tDDrGW+4A+PQThVJ+l9ee03CsDoD0XLpOB5dcf+dr/dCHjcQ7x/CeVFZ8eM+XUtGQnZVvuzXZGwzS8bUWEdJIg=="
},
"@aws-sdk/credential-provider-node": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.190.0.tgz",
- "integrity": "sha512-ctCG5+TsIK2gVgvvFiFjinPjc5nGpSypU3nQKCaihtPh83wDN6gCx4D0p9M8+fUrlPa5y+o/Y7yHo94ATepM8w=="
+ "version": "3.218.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.218.0.tgz",
+ "integrity": "sha512-J9PB6XFA+V0mgxleuY5W6Jjh5WejV8HjMViTJQpp2JN+NWZP3bGvquUSQHRqWGRGg2fSJy6Z/J4zQ8fpPbGsdQ=="
},
"@aws-sdk/credential-provider-process": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.190.0.tgz",
- "integrity": "sha512-sIJhICR80n5XY1kW/EFHTh5ZzBHb5X+744QCH3StcbKYI44mOZvNKfFdeRL2fQ7yLgV7npte2HJRZzQPWpZUrw=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.215.0.tgz",
+ "integrity": "sha512-JNvj4L5B7W8byoFdfn/8Y4scoPiwCi+Ha/fRsFCrdSC7C+snDuxM/oQj33HI8DpKY1cjuigzEnpnxiNWaA09EA=="
},
"@aws-sdk/credential-provider-sso": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.190.0.tgz",
- "integrity": "sha512-uarU9vk471MHHT+GJj3KWFSmaaqLNL5n1KcMer2CCAZfjs+mStAi8+IjZuuKXB4vqVs5DxdH8cy5aLaJcBlXwQ=="
+ "version": "3.218.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.218.0.tgz",
+ "integrity": "sha512-HecWvmxD+xffmY8G4SfLRfCOgSoLFki45wOOU8ESgRM9fQp2+3CfRSyiThKZI5PTmE+xhPTRvmR61HUmQjEv8w=="
},
"@aws-sdk/credential-provider-web-identity": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.190.0.tgz",
- "integrity": "sha512-nlIBeK9hGHKWC874h+ITAfPZ9Eaok+x/ydZQVKsLHiQ9PH3tuQ8AaGqhuCwBSH0hEAHZ/BiKeEx5VyWAE8/x+Q=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.215.0.tgz",
+ "integrity": "sha512-AWaDDEE3VU1HeLrXvyUrkQ6Wb3PQij5bvvrMil9L0da3b1yrcpoDanQQy7wBFBXcZIVmcmSFe5MMA/nyh2Le4g=="
},
"@aws-sdk/credential-providers": {
- "version": "3.192.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.192.0.tgz",
- "integrity": "sha512-iBTrEPkfOHlfgQyk7EeUCmZnhUKXsGcc/hhxBbc6Z/Xc7Y8LqRVLbEmHq9lruXraFuvs26xV9oZi1s1UMXneQA=="
+ "version": "3.218.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.218.0.tgz",
+ "integrity": "sha512-MWpb5k+Oq56NrHA5fYPIDX8QRYUAw4Jp8ErTELBd83kLhTgqTw025YQ05YbhIzAs84+viMeWKif0z/5kNshphw=="
},
"@aws-sdk/fetch-http-handler": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.190.0.tgz",
- "integrity": "sha512-5riRpKydARXAPLesTZm6eP6QKJ4HJGQ3k0Tepi3nvxHVx3UddkRNoX0pLS3rvbajkykWPNC2qdfRGApWlwOYsA=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.215.0.tgz",
+ "integrity": "sha512-JfZyrJOE+0ik1PumsIUZd0NfgEx4sZ43VSdPCD9GRhssRWudNsSF1B5fz3xA5v+1y5oQPjXZyaWCzKtnYruiWw=="
},
"@aws-sdk/hash-node": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.190.0.tgz",
- "integrity": "sha512-DNwVT3O8zc9Jk/bXiXcN0WsD98r+JJWryw9F1/ZZbuzbf6rx2qhI8ZK+nh5X6WMtYPU84luQMcF702fJt/1bzg=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.215.0.tgz",
+ "integrity": "sha512-MkSRuZvo1RCRmI0VNEmRYCGGD/DkMd9lqnLtOyglMPnSX1mhyD4/DyXmcc3rYa7PsjDRAfykGWJRiMqpoMLjiQ=="
},
"@aws-sdk/invalid-dependency": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.190.0.tgz",
- "integrity": "sha512-crCh63e8d/Uw9y3dQlVTPja7+IZiXpNXyH6oSuAadTDQwMq6KK87Av1/SDzVf6bAo2KgAOo41MyO2joaCEk0dQ=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.215.0.tgz",
+ "integrity": "sha512-++bK4BUQe8/CL/YcLZcQB8qPOhiXxhbuhYzfFS7PNVvW1QOLqKRZL/lKs24gzjcOmw7IhAbCybDZwvu2TM4DAg=="
},
"@aws-sdk/is-array-buffer": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.188.0.tgz",
- "integrity": "sha512-n69N4zJZCNd87Rf4NzufPzhactUeM877Y0Tp/F3KiHqGeTnVjYUa4Lv1vLBjqtfjYb2HWT3NKlYn5yzrhaEwiQ=="
+ "version": "3.201.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz",
+ "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg=="
},
"@aws-sdk/middleware-content-length": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.190.0.tgz",
- "integrity": "sha512-sSU347SuC6I8kWum1jlJlpAqeV23KP7enG+ToWcEcgFrJhm3AvuqB//NJxDbkKb2DNroRvJjBckBvrwNAjQnBQ=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.215.0.tgz",
+ "integrity": "sha512-zKJRb6jDLFl9nl/muSFbiQHA4uK3skinuDRcyLbpMvvzhuK/PVodv9QI1+wIUsFdXkaSxAlva1oG4bL8ZFi+sQ=="
+ },
+ "@aws-sdk/middleware-endpoint": {
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.215.0.tgz",
+ "integrity": "sha512-W0QXL5emcN9IXtMbnWT/abLxBFH2tGIfnre2jPNmZ9M7uVFxUwwv5OTUXxNLGNehJHKhiJPwhfQvMy20IDzVcw=="
},
"@aws-sdk/middleware-host-header": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.190.0.tgz",
- "integrity": "sha512-cL7Vo/QSpGx/DDmFxjeV0Qlyi1atvHQDPn3MLBBmi1icu+3GKZkCMAJwzsrV3U4+WoVoDYT9FJ9yMQf2HaIjeQ=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.215.0.tgz",
+ "integrity": "sha512-GOqI7VwoENZwn+6tIMrrJ4SipIqL2JCh+BNvORVcy7CQxn1ViKkna7iaCx+QMjpg/kn9cR6kfY0n1FmgZR1w9A=="
},
"@aws-sdk/middleware-logger": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.190.0.tgz",
- "integrity": "sha512-rrfLGYSZCBtiXNrIa8pJ2uwUoUMyj6Q82E8zmduTvqKWviCr6ZKes0lttGIkWhjvhql2m4CbjG5MPBnY7RXL4A=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.215.0.tgz",
+ "integrity": "sha512-0h4GGF0rV3jnY3jxmcAWsOdqHCYf25s0biSjmgTei+l/5S+geOGrovRPCNep0LLg0i9D8bkZsXISojilETbf+g=="
},
"@aws-sdk/middleware-recursion-detection": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.190.0.tgz",
- "integrity": "sha512-5tc1AIIZe5jDNdyuJW+7vIFmQOxz3q031ZVrEtUEIF7cz2ySho2lkOWziz+v+UGSLhjHGKMz3V26+aN1FLZNxQ=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.215.0.tgz",
+ "integrity": "sha512-KQ+kiEsaluM4i6opjusUukxY78+UhfR7vzXHDkzZK/GplQ1hY0B+rwVO1eaULmlnmf3FK+Wd6lwrPV7xS2W+EA=="
},
"@aws-sdk/middleware-retry": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.190.0.tgz",
- "integrity": "sha512-h1bPopkncf2ue/erJdhqvgR2AEh0bIvkNsIHhx93DckWKotZd/GAVDq0gpKj7/f/7B+teHH8Fg5GDOwOOGyKcg=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.215.0.tgz",
+ "integrity": "sha512-I/dnUPVg2Kp3lW+MywBoPp06EOng8IfuaS9ph4bcJpQKrhNU5ekRgCHH2C4k1A6GcP8uyHxQ5TVV6j+l0QPIsA=="
},
"@aws-sdk/middleware-sdk-sts": {
- "version": "3.192.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.192.0.tgz",
- "integrity": "sha512-xzTV7MyG5ipWYTvekWX1tQc5ExsUvCYsDTBCD3LR5hBrP8assUDPo52zGSe+QMcjgnQv7BcYIzeikTkLEG0dUw=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.215.0.tgz",
+ "integrity": "sha512-wJRxoDf+2egbRgochaQL8+zzADx8FM/2W0spKNj8x+t/3iqw70QwxCfuEKW/uFQ3ph6eaIrv7gYc8RRjwhD8rg=="
},
"@aws-sdk/middleware-serde": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.190.0.tgz",
- "integrity": "sha512-S132hEOK4jwbtZ1bGAgSuQ0DMFG4TiD4ulAwbQRBYooC7tiWZbRiR0Pkt2hV8d7WhOHgUpg7rvqlA7/HXXBAsA=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.215.0.tgz",
+ "integrity": "sha512-+uhLXdKvvQZcRRFc3UmemSr/YUHA4Jc+1YMjHxc3v8vvfztFJBb0wgBx999myOi8PmkYThlRBQDzXy9UCIhIJw=="
},
"@aws-sdk/middleware-signing": {
- "version": "3.192.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.192.0.tgz",
- "integrity": "sha512-qTRIU/TL/dvtTrNj+AkZkgYeTIFslib3Y3XnQNNM6RCm4cMxIgs2K/lnhaUmLdbzHrpOQb4cISkY8yiHo+pNsw=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.215.0.tgz",
+ "integrity": "sha512-3BqzYqkmdPeOxjI8DVQE7Bm7J5QIvDy30abglXqrDg6npw6KonKI2Q3FIPFf+oLpZTMStwkoQOnwXHTPrSZ6Tg=="
},
"@aws-sdk/middleware-stack": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.190.0.tgz",
- "integrity": "sha512-h1mqiWNJdi1OTSEY8QovpiHgDQEeRG818v8yShpqSYXJKEqdn54MA3Z1D2fg/Wv/8ZJsFrBCiI7waT1JUYOmCg=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.215.0.tgz",
+ "integrity": "sha512-rdSVL7LxRgjlvoluqwODD4ypBy2k/YVl6FrDplyCMSi8m2WHZG99FzdmR9bpnWK+0DGzYZSMRYx6ynJ9N9PsSw=="
},
"@aws-sdk/middleware-user-agent": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.190.0.tgz",
- "integrity": "sha512-y/2cTE1iYHKR0nkb3DvR3G8vt12lcTP95r/iHp8ZO+Uzpc25jM/AyMHWr2ZjqQiHKNlzh8uRw1CmQtgg4sBxXQ=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.215.0.tgz",
+ "integrity": "sha512-X6GfoMNoEITTw7rGL/gWs8UZ0cmmmezvKcl+KtHsA642R05OR4mY5G7LdbWAw0bcrwKsuKOGmwUrC9lzGqbWUw=="
},
"@aws-sdk/node-config-provider": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.190.0.tgz",
- "integrity": "sha512-TJPUchyeK5KeEXWrwb6oW5/OkY3STCSGR1QIlbPcaTGkbo4kXAVyQmmZsY4KtRPuDM6/HlfUQV17bD716K65rQ=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.215.0.tgz",
+ "integrity": "sha512-notckD94QwwxC0GsfpTxB7VH8SREIIlMsUSddqGtpModa0cq/wRb9rqnydZSoznbYpK1ND6h0C9hr/2PNz89zw=="
},
"@aws-sdk/node-http-handler": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.190.0.tgz",
- "integrity": "sha512-3Klkr73TpZkCzcnSP+gmFF0Baluzk3r7BaWclJHqt2LcFUWfIJzYlnbBQNZ4t3EEq7ZlBJX85rIDHBRlS+rUyA=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.215.0.tgz",
+ "integrity": "sha512-btKWSR7m0UuWIN3p5MfSIvhqeYik7xri7U6nWuVI5GVzIYjzxEZOMvPAinDLDxL5wipodi0ZvTUNdDJdm7BcGQ=="
},
"@aws-sdk/property-provider": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.190.0.tgz",
- "integrity": "sha512-uzdKjHE2blbuceTC5zeBgZ0+Uo/hf9pH20CHpJeVNtrrtF3GALtu4Y1Gu5QQVIQBz8gjHnqANx0XhfYzorv69Q=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.215.0.tgz",
+ "integrity": "sha512-dDPjMCCopkRURAmOJCMSlpIQ5BGWCpYj0+FIfZ5qWQs24fn1PAkQHecOiBhJO0ZSVuQy3xcIyWsAp1NE5e+7ug=="
},
"@aws-sdk/protocol-http": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.190.0.tgz",
- "integrity": "sha512-s5MVfeONpfZYRzCSbqQ+wJ3GxKED+aSS7+CQoeaYoD6HDTDxaMGNv9aiPxVCzW02sgG7py7f29Q6Vw+5taZXZA=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.215.0.tgz",
+ "integrity": "sha512-qp6Y6v4S534LAjadiVl9p7ErK7ImphOKq6yhFyQwxko6iITLcz8ib3yU27fs4QJcnNj5ZooqW/YlL/0EikDxCQ=="
},
"@aws-sdk/querystring-builder": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.190.0.tgz",
- "integrity": "sha512-w9mTKkCsaLIBC8EA4RAHrqethNGbf60CbpPzN/QM7yCV3ZZJAXkppFfjTVVOMbPaI8GUEOptJtzgqV68CRB7ow=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.215.0.tgz",
+ "integrity": "sha512-eilk8CqG37BVhQklLif00K2dOJgDzacUi8h3KVQ72ry1V3h345i4HsmaFIxvnz8XtNyDvV8qFAzeYg9n2P9RQA=="
},
"@aws-sdk/querystring-parser": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.190.0.tgz",
- "integrity": "sha512-vCKP0s33VtS47LSYzEWRRr2aTbi3qNkUuQyIrc5LMqBfS5hsy79P1HL4Q7lCVqZB5fe61N8fKzOxDxWRCF0sXg=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.215.0.tgz",
+ "integrity": "sha512-8h/9H8dWM4fZO27UGzo8W5JXln4yJMugPyUl4qFA437gzPgNFN95+oLJWXtHMlfCHC5T/PDKetY9TarMDgBD0Q=="
},
"@aws-sdk/service-error-classification": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.190.0.tgz",
- "integrity": "sha512-g+s6xtaMa5fCMA2zJQC4BiFGMP7FN5/L1V/UwxCnKy8skCwaN0K5A1tFffBjjbYiPI7Gu7LVorWD2A0Y4xl01Q=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.215.0.tgz",
+ "integrity": "sha512-SKBvClGFGzMPsjBBKjneaUazLCNr6bSxe9eFvOr3gCwuwE2jPQwW3VE1mb62howuvm6cLthEDwLQp/FsT1gMsw=="
},
"@aws-sdk/shared-ini-file-loader": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.190.0.tgz",
- "integrity": "sha512-CZC/xsGReUEl5w+JgfancrxfkaCbEisyIFy6HALUYrioWQe80WMqLAdUMZSXHWjIaNK9mH0J/qvcSV2MuIoMzQ=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.215.0.tgz",
+ "integrity": "sha512-unzQeLOyUiYHr8WxxandHo0OaCj31gx0wpt8dn2cZcHm/MdCqHcHcsQqOVnQsWQrrxY/XZ27cPyMVQeicNKYwQ=="
},
"@aws-sdk/signature-v4": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.190.0.tgz",
- "integrity": "sha512-L/R/1X2T+/Kg2k/sjoYyDFulVUGrVcRfyEKKVFIUNg0NwUtw5UKa1/gS7geTKcg4q8M2pd/v+OCBrge2X7phUw=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.215.0.tgz",
+ "integrity": "sha512-Rc73uUCi3eJneO25DydLTfJYamXeuKS9YIhNMTKlpvcN1UQAmAnUbAmCuEmqvkYOiGD1i4/kd8kBga708iIikQ=="
},
"@aws-sdk/smithy-client": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.190.0.tgz",
- "integrity": "sha512-f5EoCwjBLXMyuN491u1NmEutbolL0cJegaJbtgK9OJw2BLuRHiBknjDF4OEVuK/WqK0kz2JLMGi9xwVPl4BKCA=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.215.0.tgz",
+ "integrity": "sha512-PiZfCdZkPohzMPrRmJ46TPOf2Tr/dhKYdwQArRnOOIsJABUGXjlzCUE8vysDN35XZYRx5f9hd+/U7kayhniq2w=="
+ },
+ "@aws-sdk/token-providers": {
+ "version": "3.216.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.216.0.tgz",
+ "integrity": "sha512-cEmOfG7njWl0OA5lR65Sp2SW1i8ZLjf7C95TZ1e6t2Oo5aUFeN3aKBxMOV//1yc+BNzcFBnoHP/f29GhWxUOxA=="
},
"@aws-sdk/types": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.190.0.tgz",
- "integrity": "sha512-mkeZ+vJZzElP6OdRXvuLKWHSlDQxZP9u8BjQB9N0Rw0pCXTzYS0vzIhN1pL0uddWp5fMrIE68snto9xNR6BQuA=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz",
+ "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q=="
},
"@aws-sdk/url-parser": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.190.0.tgz",
- "integrity": "sha512-FKFDtxA9pvHmpfWmNVK5BAVRpDgkWMz3u4Sg9UzB+WAFN6UexRypXXUZCFAo8S04FbPKfYOR3O0uVlw7kzmj9g=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz",
+ "integrity": "sha512-r/qIk3TUlV36JvoRjTErFm0LzzgNKLB1YUG8zVZCGAc2TEATi8OVEmsZvi+KfTmsbszulITJVcjZKbHLbGoUzg=="
},
- "@aws-sdk/util-base64-browser": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz",
- "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg=="
- },
- "@aws-sdk/util-base64-node": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.188.0.tgz",
- "integrity": "sha512-r1dccRsRjKq+OhVRUfqFiW3sGgZBjHbMeHLbrAs9jrOjU2PTQ8PSzAXLvX/9lmp7YjmX17Qvlsg0NCr1tbB9OA=="
+ "@aws-sdk/util-base64": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz",
+ "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg=="
},
"@aws-sdk/util-body-length-browser": {
"version": "3.188.0",
@@ -277,59 +287,64 @@
"integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg=="
},
"@aws-sdk/util-body-length-node": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.188.0.tgz",
- "integrity": "sha512-XwqP3vxk60MKp4YDdvDeCD6BPOiG2e+/Ou4AofZOy5/toB6NKz2pFNibQIUg2+jc7mPMnGnvOW3MQEgSJ+gu/Q=="
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz",
+ "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg=="
},
"@aws-sdk/util-buffer-from": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.188.0.tgz",
- "integrity": "sha512-NX1WXZ8TH20IZb4jPFT2CnLKSqZWddGxtfiWxD9M47YOtq/SSQeR82fhqqVjJn4P8w2F5E28f+Du4ntg/sGcxA=="
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz",
+ "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw=="
},
"@aws-sdk/util-config-provider": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.188.0.tgz",
- "integrity": "sha512-LBA7tLbi7v4uvbOJhSnjJrxbcRifKK/1ZVK94JTV2MNSCCyNkFotyEI5UWDl10YKriTIUyf7o5cakpiDZ3O4xg=="
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz",
+ "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg=="
},
"@aws-sdk/util-defaults-mode-browser": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.190.0.tgz",
- "integrity": "sha512-FKxTU4tIbFk2pdUbBNneStF++j+/pB4NYJ1HRSEAb/g4D2+kxikR/WKIv3p0JTVvAkwcuX/ausILYEPUyDZ4HQ=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.215.0.tgz",
+ "integrity": "sha512-MiNfZgB0I4dR8CBxH163W7c9KvE38sgCHNPWopMqSX5ezz7cuCPohCU0XsWd4I7K31PvzuqmKgOiKBAZraQJMA=="
},
"@aws-sdk/util-defaults-mode-node": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.190.0.tgz",
- "integrity": "sha512-qBiIMjNynqAP7p6urG1+ZattYkFaylhyinofVcLEiDvM9a6zGt6GZsxru2Loq0kRAXXGew9E9BWGt45HcDc20g=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.215.0.tgz",
+ "integrity": "sha512-mSp3R8GljQ+4UT3QMOksQk9L0cWbFLvR7bBmAlt4+GobgTjpRfzFjBP3uwrCqFa3BKDUR3FeJq3qwo+xeY1Krg=="
+ },
+ "@aws-sdk/util-endpoints": {
+ "version": "3.216.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.216.0.tgz",
+ "integrity": "sha512-uHje4H6Qj/z/op8UZoSuvGpEZhz/r+AGY0rCihFo7XjhT4RYVxb2Eb9uHRK/IAeHU4kjHAdpQiWGMSmnT/UacA=="
},
"@aws-sdk/util-hex-encoding": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.188.0.tgz",
- "integrity": "sha512-QyWovTtjQ2RYxqVM+STPh65owSqzuXURnfoof778spyX4iQ4z46wOge1YV2ZtwS8w5LWd9eeVvDrLu5POPYOnA=="
+ "version": "3.201.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz",
+ "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA=="
},
"@aws-sdk/util-locate-window": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.188.0.tgz",
- "integrity": "sha512-SxobBVLZkkLSawTCfeQnhVX3Azm9O+C2dngZVe1+BqtF8+retUbVTs7OfYeWBlawVkULKF2e781lTzEHBBjCzw=="
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz",
+ "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg=="
},
"@aws-sdk/util-middleware": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.190.0.tgz",
- "integrity": "sha512-qzTJ/qhFDzHZS+iXdHydQ/0sWAuNIB5feeLm55Io/I8Utv3l3TKYOhbgGwTsXY+jDk7oD+YnAi7hLN5oEBCwpg=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.215.0.tgz",
+ "integrity": "sha512-DfHGlFlQCr+T/xhjS36HH8JEThDVB5lg5NZ6x4Cibhyeps9YX/4ovLAIx3B19H34sdWhZi7q6LfslCHLRu2+7Q=="
},
"@aws-sdk/util-uri-escape": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.188.0.tgz",
- "integrity": "sha512-4Y6AYZMT483Tiuq8dxz5WHIiPNdSFPGrl6tRTo2Oi2FcwypwmFhqgEGcqxeXDUJktvaCBxeA08DLr/AemVhPCg=="
+ "version": "3.201.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz",
+ "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA=="
},
"@aws-sdk/util-user-agent-browser": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.190.0.tgz",
- "integrity": "sha512-c074wjsD+/u9vT7DVrBLkwVhn28I+OEHuHaqpTVCvAIjpueZ3oms0e99YJLfpdpEgdLavOroAsNFtAuRrrTZZw=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.215.0.tgz",
+ "integrity": "sha512-uZz6BJWr8sJcA+onveS1lFqnbIXBHwvkyHLgCuuGhAxd5yY6YNLhpJBnhy9Fb8/aSbk6yao3qxlokqw9gthmAw=="
},
"@aws-sdk/util-user-agent-node": {
- "version": "3.190.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.190.0.tgz",
- "integrity": "sha512-R36BMvvPX8frqFhU4lAsrOJ/2PJEHH/Jz1WZzO3GWmVSEAQQdHmo8tVPE3KOM7mZWe5Hj1dZudFAIxWHHFYKJA=="
+ "version": "3.215.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.215.0.tgz",
+ "integrity": "sha512-4lrdd1oGRwJEwfvgvg1jcJ2O0bwElsvtiqZfTRHN6MNTFUqsKl0xHlgFChQsz3Hfrc1niWtZCmbqQKGdO5ARpw=="
},
"@aws-sdk/util-utf8-browser": {
"version": "3.188.0",
@@ -337,14 +352,14 @@
"integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q=="
},
"@aws-sdk/util-utf8-node": {
- "version": "3.188.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.188.0.tgz",
- "integrity": "sha512-hCgP4+C0Lekjpjt2zFJ2R/iHes5sBGljXa5bScOFAEkRUc0Qw0VNgTv7LpEbIOAwGmqyxBoCwBW0YHPW1DfmYQ=="
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz",
+ "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ=="
},
"@types/node": {
- "version": "18.11.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz",
- "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw=="
+ "version": "18.11.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz",
+ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg=="
},
"@types/webidl-conversions": {
"version": "7.0.0",
@@ -376,11 +391,6 @@
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="
},
- "denque": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
- "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
- },
"fast-xml-parser": {
"version": "4.0.11",
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
@@ -402,14 +412,14 @@
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
},
"mongodb": {
- "version": "4.11.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.11.0.tgz",
- "integrity": "sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg=="
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.12.1.tgz",
+ "integrity": "sha512-koT87tecZmxPKtxRQD8hCKfn+ockEL2xBiUvx3isQGI6mFmagWt4f4AyCE9J4sKepnLhMacoCTQQA6SLAI2L6w=="
},
"mongodb-connection-string-url": {
- "version": "2.5.4",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz",
- "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w=="
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
+ "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ=="
},
"punycode": {
"version": "2.1.1",
@@ -447,9 +457,9 @@
"integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA=="
},
"tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
},
"uuid": {
"version": "8.3.2",
diff --git a/packages/npm-mongo/package.js b/packages/npm-mongo/package.js
index 63696bf272..45d1a87a27 100644
--- a/packages/npm-mongo/package.js
+++ b/packages/npm-mongo/package.js
@@ -3,12 +3,12 @@
Package.describe({
summary: "Wrapper around the mongo npm package",
- version: '4.11.0',
+ version: '4.12.1',
documentation: null
});
Npm.depends({
- mongodb: "4.11.0"
+ mongodb: "4.12.1"
});
Package.onUse(function (api) {
diff --git a/packages/oauth/oauth_server.js b/packages/oauth/oauth_server.js
index 6d7b0cb578..1b591a455b 100644
--- a/packages/oauth/oauth_server.js
+++ b/packages/oauth/oauth_server.js
@@ -136,7 +136,7 @@ OAuth._checkRedirectUrlOrigin = redirectUrl => {
);
};
-const middleware = (req, res, next) => {
+const middleware = async (req, res, next) => {
let requestData;
// Make sure to catch any exceptions because otherwise we'd crash
@@ -168,7 +168,7 @@ const middleware = (req, res, next) => {
requestData = req.body;
}
- handler(service, requestData, res);
+ await handler(service, requestData, res);
} catch (err) {
// if we got thrown an error, save it off, it will get passed to
// the appropriate login call (if any) and reported there.
@@ -473,3 +473,31 @@ OAuth.openSecrets = (serviceData, userId) => {
);
return result;
};
+
+OAuth._addValuesToQueryParams = (
+ values = {},
+ queryParams = new URLSearchParams()
+) => {
+ Object.entries(values).forEach(([key, value]) => {
+ queryParams.set(key, `${value}`);
+ });
+ return queryParams;
+};
+
+OAuth._fetch = async (
+ url,
+ method = 'GET',
+ { headers = {}, queryParams = {}, body, ...options } = {}
+) => {
+ const urlWithParams = new URL(url);
+
+ OAuth._addValuesToQueryParams(queryParams, urlWithParams.searchParams);
+
+ const requestOptions = {
+ method: method.toUpperCase(),
+ headers,
+ ...(body ? { body } : {}),
+ ...options,
+ };
+ return fetch(urlWithParams.toString(), requestOptions);
+};
diff --git a/packages/oauth/package.js b/packages/oauth/package.js
index 8962aeb282..4b56f43d33 100644
--- a/packages/oauth/package.js
+++ b/packages/oauth/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Common code for OAuth-based services",
- version: "2.1.2"
+ version: "2.1.3"
});
Package.onUse(api => {
@@ -11,6 +11,7 @@ Package.onUse(api => {
api.use(['reload', 'base64'], 'client');
api.use('oauth-encryption', 'server', {weak: true});
+ api.use('fetch', 'server');
api.export('OAuth');
diff --git a/packages/oauth1/oauth1_binding.js b/packages/oauth1/oauth1_binding.js
index aab9629605..015553611e 100644
--- a/packages/oauth1/oauth1_binding.js
+++ b/packages/oauth1/oauth1_binding.js
@@ -19,12 +19,12 @@ export class OAuth1Binding {
this._urls = urls;
}
- prepareRequestToken(callbackUrl) {
+ async prepareRequestToken(callbackUrl) {
const headers = this._buildHeader({
oauth_callback: callbackUrl
});
- const response = this._call('POST', this._urls.requestToken, headers);
+ const response = await this._call({method: 'POST', url: this._urls.requestToken, headers});
const tokens = querystring.parse(response.content);
if (! tokens.oauth_callback_confirmed)
@@ -35,7 +35,7 @@ export class OAuth1Binding {
this.requestTokenSecret = tokens.oauth_token_secret;
}
- prepareAccessToken(query, requestTokenSecret) {
+ async prepareAccessToken(query, requestTokenSecret) {
// support implementations that use request token secrets. This is
// read by this._call.
//
@@ -50,7 +50,7 @@ export class OAuth1Binding {
oauth_verifier: query.oauth_verifier
});
- const response = this._call('POST', this._urls.accessToken, headers);
+ const response = await this._call({ method: 'POST', url: this._urls.accessToken, headers });
const tokens = querystring.parse(response.content);
if (! tokens.oauth_token || ! tokens.oauth_token_secret) {
@@ -66,7 +66,7 @@ export class OAuth1Binding {
this.accessTokenSecret = tokens.oauth_token_secret;
}
- call(method, url, params, callback) {
+ async callAsync(method, url, params, callback) {
const headers = this._buildHeader({
oauth_token: this.accessToken
});
@@ -75,14 +75,29 @@ export class OAuth1Binding {
params = {};
}
- return this._call(method, url, headers, params, callback);
+ return this._call({ method, url, headers, params, callback });
+ }
+
+ async getAsync(url, params, callback) {
+ return this.callAsync('GET', url, params, callback);
+ }
+
+ async postAsync(url, params, callback) {
+ return this.callAsync('POST', url, params, callback);
+ }
+
+ call(method, url, params, callback) {
+ // Require changes when remove Fibers. Exposed to public api.
+ return Promise.await(this.callAsync(method, url, params, callback));
}
get(url, params, callback) {
+ // Require changes when remove Fibers. Exposed to public api.
return this.call('GET', url, params, callback);
}
post(url, params, callback) {
+ // Require changes when remove Fibers. Exposed to public api.
return this.call('POST', url, params, callback);
}
@@ -118,7 +133,7 @@ export class OAuth1Binding {
return crypto.createHmac('SHA1', signingKey).update(signatureBase).digest('base64');
};
- _call(method, url, headers = {}, params = {}, callback) {
+ async _call({method, url, headers = {}, params = {}, callback}) {
// all URLs to be functions to support parameters/customization
if(typeof url === "function") {
url = url(this);
@@ -141,29 +156,52 @@ export class OAuth1Binding {
// Make a authorization string according to oauth1 spec
const authString = this._getAuthHeaderString(headers);
-
// Make signed request
- try {
- const response = HTTP.call(method, url, {
- params,
- headers: {
- Authorization: authString
+ return OAuth._fetch(url, method, {
+ headers: {
+ Authorization: authString,
+ ...(method.toUpperCase() === 'POST' ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {})
+ },
+ ...(method.toUpperCase() === 'POST' ?
+ { body: OAuth._addValuesToQueryParams(params).toString() }
+ : { queryParams: params })
+ }).then((res) =>
+ res.text().then((content) => {
+ const responseHeaders = Array.from(res.headers.entries()).reduce(
+ (acc, [key, val]) => {
+ return { ...acc, [key.toLowerCase()]: val };
+ },
+ {}
+ );
+ const data = responseHeaders['content-type'].includes('application/json') ?
+ JSON.parse(content) : undefined;
+ return {
+ content: data ? '' : content,
+ data,
+ headers: { ...responseHeaders, nonce: headers.oauth_nonce },
+ redirected: res.redirected,
+ ok: res.ok,
+ statusCode: res.status,
+ };
+ })
+ )
+ .then((response) => {
+ if (callback) {
+ callback(undefined, response);
}
- }, callback && ((error, response) => {
- if (! error) {
- response.nonce = headers.oauth_nonce;
+ return response;
+ })
+ .catch((err) => {
+ if (callback) {
+ callback(err);
}
- callback(error, response);
- }));
- // We store nonce so that JWTs can be validated
- if (response)
- response.nonce = headers.oauth_nonce;
- return response;
- } catch (err) {
- throw Object.assign(new Error(`Failed to send OAuth1 request to ${url}. ${err.message}`),
- {response: err.response});
- }
- };
+ console.log({ err });
+ throw Object.assign(
+ new Error(`Failed to send OAuth1 request to ${url}. ${err.message}`),
+ { response: err.response }
+ );
+ });
+ }
_encodeHeader(header) {
return Object.keys(header).reduce((memo, key) => {
diff --git a/packages/oauth1/oauth1_server.js b/packages/oauth1/oauth1_server.js
index eb54458825..d0c8e3732a 100644
--- a/packages/oauth1/oauth1_server.js
+++ b/packages/oauth1/oauth1_server.js
@@ -6,7 +6,7 @@ OAuth._queryParamsWithAuthTokenUrl = (authUrl, oauthBinding, params = {}, whitel
Object.assign(
redirectUrlObj.query,
- whitelistedQueryParams.reduce((prev, param) =>
+ whitelistedQueryParams.reduce((prev, param) =>
params.query[param] ? { ...prev, param: params.query[param] } : prev,
{}
),
@@ -25,7 +25,7 @@ OAuth._queryParamsWithAuthTokenUrl = (authUrl, oauthBinding, params = {}, whitel
};
// connect middleware
-OAuth._requestHandlers['1'] = (service, query, res) => {
+OAuth._requestHandlers['1'] = async (service, query, res) => {
const config = ServiceConfiguration.configurations.findOne({service: service.serviceName});
if (! config) {
throw new ServiceConfiguration.ConfigError(service.serviceName);
@@ -45,7 +45,7 @@ OAuth._requestHandlers['1'] = (service, query, res) => {
});
// Get a request token to start auth process
- oauthBinding.prepareRequestToken(callbackUrl);
+ await oauthBinding.prepareRequestToken(callbackUrl);
// Keep track of request token so we can verify it on the next step
OAuth._storeRequestToken(
@@ -91,10 +91,10 @@ OAuth._requestHandlers['1'] = (service, query, res) => {
// subsequent call to the `login` method will be immediate.
// Get the access token for signing requests
- oauthBinding.prepareAccessToken(query, requestTokenInfo.requestTokenSecret);
+ await oauthBinding.prepareAccessToken(query, requestTokenInfo.requestTokenSecret);
// Run service-specific handler.
- const oauthResult = service.handleOauthRequest(
+ const oauthResult = await service.handleOauthRequest(
oauthBinding, { query: query });
const credentialToken = OAuth._credentialTokenFromQuery(query);
diff --git a/packages/oauth1/oauth1_tests.js b/packages/oauth1/oauth1_tests.js
index a9f266af02..d4b283a97a 100644
--- a/packages/oauth1/oauth1_tests.js
+++ b/packages/oauth1/oauth1_tests.js
@@ -1,7 +1,7 @@
import http from 'http';
import { OAuth1Binding } from './oauth1_binding';
-const testPendingCredential = (test, method) => {
+const testPendingCredential = async (test, method) => {
const twitterfooId = Random.id();
const twitterfooName = `nickname${Random.id()}`;
const twitterfooAccessToken = Random.id();
@@ -17,8 +17,8 @@ const testPendingCredential = (test, method) => {
authenticate: "https://example.com/oauth/authenticate"
};
- OAuth1Binding.prototype.prepareRequestToken = () => {};
- OAuth1Binding.prototype.prepareAccessToken = function() {
+ OAuth1Binding.prototype.prepareRequestToken = async () => {};
+ OAuth1Binding.prototype.prepareAccessToken = async function() {
this.accessToken = twitterfooAccessToken;
this.accessTokenSecret = twitterfooAccessTokenSecret;
};
@@ -27,7 +27,7 @@ const testPendingCredential = (test, method) => {
try {
// register a fake login service
- OAuth.registerService(serviceName, 1, urls, query => ({
+ OAuth.registerService(serviceName, 1, urls, async query => ({
serviceData: {
id: twitterfooId,
screenName: twitterfooName,
@@ -71,7 +71,7 @@ const testPendingCredential = (test, method) => {
respData += args[0];
return end.apply(this, arguments);
};
- OAuthTest.middleware(req, res);
+ await OAuthTest.middleware(req, res);
const credentialSecret = respData;
// Test that the result for the token is available
@@ -94,17 +94,17 @@ const testPendingCredential = (test, method) => {
}
};
-Tinytest.add("oauth1 - pendingCredential is stored and can be retrieved (without oauth encryption)", test => {
+Tinytest.addAsync("oauth1 - pendingCredential is stored and can be retrieved (without oauth encryption)", async test => {
OAuthEncryption.loadKey(null);
- testPendingCredential(test, "GET");
- testPendingCredential(test, "POST");
+ await testPendingCredential(test, "GET");
+ await testPendingCredential(test, "POST");
});
-Tinytest.add("oauth1 - pendingCredential is stored and can be retrieved (with oauth encryption)", test => {
+Tinytest.addAsync("oauth1 - pendingCredential is stored and can be retrieved (with oauth encryption)", async test => {
try {
OAuthEncryption.loadKey(Buffer.from([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]).toString("base64"));
- testPendingCredential(test, "GET");
- testPendingCredential(test, "POST");
+ await testPendingCredential(test, "GET");
+ await testPendingCredential(test, "POST");
} finally {
OAuthEncryption.loadKey(null);
}
diff --git a/packages/oauth1/package.js b/packages/oauth1/package.js
index 550fdc2448..7435caf024 100644
--- a/packages/oauth1/package.js
+++ b/packages/oauth1/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Common code for OAuth1-based login services",
- version: "1.5.0",
+ version: "1.5.1",
});
Package.onUse(api => {
@@ -8,10 +8,7 @@ Package.onUse(api => {
api.use('random');
api.use('service-configuration', ['client', 'server']);
api.use('oauth', ['client', 'server']);
- api.use([
- 'check',
- 'http@1.4.4 || 2.0.0'
- ], 'server');
+ api.use('check', 'server');
api.use('mongo');
diff --git a/packages/oauth2/oauth2_server.js b/packages/oauth2/oauth2_server.js
index cf990d8691..86eead93ba 100644
--- a/packages/oauth2/oauth2_server.js
+++ b/packages/oauth2/oauth2_server.js
@@ -1,5 +1,5 @@
// connect middleware
-OAuth._requestHandlers['2'] = (service, query, res) => {
+OAuth._requestHandlers['2'] = async (service, query, res) => {
let credentialSecret;
// check if user authorized access
@@ -7,7 +7,7 @@ OAuth._requestHandlers['2'] = (service, query, res) => {
// Prepare the login results before returning.
// Run service-specific handler.
- const oauthResult = service.handleOauthRequest(query);
+ const oauthResult = await service.handleOauthRequest(query);
credentialSecret = Random.secret();
const credentialToken = OAuth._credentialTokenFromQuery(query);
diff --git a/packages/oauth2/oauth2_tests.js b/packages/oauth2/oauth2_tests.js
index 1ce47813b4..49b94f4eb0 100644
--- a/packages/oauth2/oauth2_tests.js
+++ b/packages/oauth2/oauth2_tests.js
@@ -1,6 +1,6 @@
import http from 'http';
-const testPendingCredential = function (test, method) {
+const testPendingCredential = async function (test, method) {
const foobookId = Random.id();
const foobookOption1 = Random.id();
const credentialToken = Random.id();
@@ -51,7 +51,7 @@ const testPendingCredential = function (test, method) {
return end.apply(this, args);
};
- OAuthTest.middleware(req, res);
+ await OAuthTest.middleware(req, res);
const credentialSecret = respData;
// Test that the result for the token is available
@@ -72,17 +72,17 @@ const testPendingCredential = function (test, method) {
}
};
-Tinytest.add("oauth2 - pendingCredential is stored and can be retrieved (without oauth encryption)", test => {
+Tinytest.addAsync("oauth2 - pendingCredential is stored and can be retrieved (without oauth encryption)", async test => {
OAuthEncryption.loadKey(null);
- testPendingCredential(test, "GET");
- testPendingCredential(test, "POST");
+ await testPendingCredential(test, "GET");
+ await testPendingCredential(test, "POST");
});
-Tinytest.add("oauth2 - pendingCredential is stored and can be retrieved (with oauth encryption)", test => {
+Tinytest.addAsync("oauth2 - pendingCredential is stored and can be retrieved (with oauth encryption)", async test => {
try {
OAuthEncryption.loadKey(Buffer.from([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]).toString("base64"));
- testPendingCredential(test, "GET");
- testPendingCredential(test, "POST");
+ await testPendingCredential(test, "GET");
+ await testPendingCredential(test, "POST");
} finally {
OAuthEncryption.loadKey(null);
}
diff --git a/packages/oauth2/package.js b/packages/oauth2/package.js
index c5f2fd0917..4ba099aa41 100644
--- a/packages/oauth2/package.js
+++ b/packages/oauth2/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Common code for OAuth2-based login services",
- version: "1.3.1",
+ version: "1.3.2",
});
Package.onUse(api => {
diff --git a/packages/package-version-parser/package-version-parser-tests.js b/packages/package-version-parser/package-version-parser-tests.js
index 855dc56057..ff82ae9086 100644
--- a/packages/package-version-parser/package-version-parser-tests.js
+++ b/packages/package-version-parser/package-version-parser-tests.js
@@ -464,14 +464,14 @@ Tinytest.add("package-version-parser - Invalid in 0.9.2", function (test) {
var invalidVersions =
["1.0.0_1", "1.0.0 || 2.0.0", "1.0.0-rc1_1",
"3.4.0-rc1 || =1.0.0"];
- _.each(invalidVersions, function (v) {
+ invalidVersions.forEach(function (v) {
test.isTrue(PackageVersion.invalidFirstFormatConstraint(v));
});
// These are all valid in 0.9.2.
var validVersions =
["1.0.0", "2.0.0-rc1", "=2.5.0"];
- _.each(validVersions, function (v) {
+ validVersions.forEach(function (v) {
test.isFalse(PackageVersion.invalidFirstFormatConstraint(v));
});
});
diff --git a/packages/package-version-parser/package.js b/packages/package-version-parser/package.js
index 4c6ff0dc62..78a084498d 100644
--- a/packages/package-version-parser/package.js
+++ b/packages/package-version-parser/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Parses Meteor Smart Package version strings",
- version: "3.2.0"
+ version: "3.2.1"
});
Npm.depends({
@@ -14,7 +14,6 @@ Package.onUse(function (api) {
});
Package.onTest(function (api) {
- api.use('package-version-parser');
- api.use(['tinytest', 'underscore']);
+ api.use(['package-version-parser', 'tinytest']);
api.addFiles('package-version-parser-tests.js', 'server');
});
diff --git a/packages/promise/package.js b/packages/promise/package.js
index 181ef21b3b..fcf72881c5 100644
--- a/packages/promise/package.js
+++ b/packages/promise/package.js
@@ -1,6 +1,6 @@
Package.describe({
name: "promise",
- version: "0.12.1",
+ version: "0.12.2",
summary: "ECMAScript 2015 Promise polyfill with Fiber support",
git: "https://github.com/meteor/promise",
documentation: "README.md"
diff --git a/packages/promise/server.js b/packages/promise/server.js
index e07faeb52b..2f5f59a3c0 100644
--- a/packages/promise/server.js
+++ b/packages/promise/server.js
@@ -1,11 +1,13 @@
require("./extensions.js");
-require("meteor-promise").makeCompatible(
- Promise,
- // Allow every Promise callback to run in a Fiber drawn from a pool of
- // reusable Fibers.
- require("fibers")
-);
+if (!process.env.DISABLE_FIBERS) {
+ require("meteor-promise").makeCompatible(
+ Promise,
+ // Allow every Promise callback to run in a Fiber drawn from a pool of
+ // reusable Fibers.
+ require("fibers")
+ );
+}
// Reference: https://caniuse.com/#feat=promises
require("meteor/modern-browsers").setMinimumBrowserVersions({
diff --git a/packages/standard-minifier-css/package.js b/packages/standard-minifier-css/package.js
index 97e0d8f3eb..7d6b2746e9 100644
--- a/packages/standard-minifier-css/package.js
+++ b/packages/standard-minifier-css/package.js
@@ -1,6 +1,6 @@
Package.describe({
name: 'standard-minifier-css',
- version: '1.8.2',
+ version: '1.8.3',
summary: 'Standard css minifier used with Meteor apps by default.',
documentation: 'README.md'
});
diff --git a/packages/standard-minifier-css/plugin/minify-css.js b/packages/standard-minifier-css/plugin/minify-css.js
index 2b8c4d5e44..8ac2b0db75 100644
--- a/packages/standard-minifier-css/plugin/minify-css.js
+++ b/packages/standard-minifier-css/plugin/minify-css.js
@@ -60,7 +60,7 @@ class CssToolsMinifier {
path: 'merged-stylesheets.css'
}];
} else {
- const minifiedFiles = CssTools.minifyCss(merged.code);
+ const minifiedFiles = await CssTools.minifyCssAsync(merged.code);
result = minifiedFiles.map(minified => ({
data: minified
diff --git a/packages/test-helpers/async_multi.js b/packages/test-helpers/async_multi.js
index e5ec3cb43c..04be6aedfe 100644
--- a/packages/test-helpers/async_multi.js
+++ b/packages/test-helpers/async_multi.js
@@ -142,8 +142,13 @@ testAsyncMulti = function (name, funcs, { isOnly = false } = {}) {
test.extraDetails.asyncBlock = i++;
new Promise(resolve => {
- resolve(func.apply(context, [test, _.bind(em.expect, em)]));
- }).then(result => {
+ const result = func.apply(context, [test, _.bind(em.expect, em)]);
+ if (result && typeof result.then === "function") {
+ return result.then((r) => resolve(r))
+ }
+
+ return resolve(result);
+ }).then(() => {
em.done();
}, exception => {
if (em.cancel()) {
@@ -191,3 +196,24 @@ pollUntil = function (expect, f, timeout, step, noFail) {
step
);
};
+
+/**
+ * Helper that is used on the async tests.
+ * Just run the function and assert if we have an error or not.
+ * @param fn
+ * @param test
+ * @param shouldErrorOut
+ * @returns {Promise<*>}
+ */
+runAndThrowIfNeeded = async (fn, test, shouldErrorOut) => {
+ let err, result;
+ try {
+ result = await fn();
+ } catch (e) {
+ err = e;
+ }
+
+ test[shouldErrorOut ? "isTrue" : "isFalse"](err);
+
+ return result;
+};
diff --git a/packages/test-helpers/package.js b/packages/test-helpers/package.js
index 17b6e0f37a..399e768cbe 100644
--- a/packages/test-helpers/package.js
+++ b/packages/test-helpers/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Utility functions for tests",
- version: '1.3.0'
+ version: '1.3.1'
});
Package.onUse(function (api) {
@@ -28,7 +28,8 @@ Package.onUse(function (api) {
'SeededRandom', 'clickElement', 'blurElement',
'focusElement', 'simulateEvent', 'getStyleProperty', 'canonicalizeHtml',
'renderToDiv', 'clickIt',
- 'withCallbackLogger', 'testAsyncMulti', 'simplePoll',
+ 'withCallbackLogger', 'testAsyncMulti',
+ 'simplePoll', 'runAndThrowIfNeeded',
'makeTestConnection', 'DomUtils']);
api.addFiles('try_all_permutations.js');
diff --git a/packages/test-in-browser/driver.js b/packages/test-in-browser/driver.js
index d0d5fa4423..b8fb0a9ecf 100644
--- a/packages/test-in-browser/driver.js
+++ b/packages/test-in-browser/driver.js
@@ -451,7 +451,7 @@ Template.test.helpers({
eventsArray: function() {
var events = this.events.filter(function(e) {
- return e[type] != "finish";
+ return e.type != "finish";
});
var partitionBy = function(seq, func) {
@@ -583,4 +583,4 @@ Template.event.helpers({
is_debuggable: function() {
return !!this.cookie;
}
-});
\ No newline at end of file
+});
diff --git a/packages/test-in-browser/package.js b/packages/test-in-browser/package.js
index a090172f76..57e3474024 100644
--- a/packages/test-in-browser/package.js
+++ b/packages/test-in-browser/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Run tests interactively in the browser",
- version: '1.3.1',
+ version: '1.3.2',
documentation: null
});
diff --git a/packages/test-in-console/puppeteerRunner.js b/packages/test-in-console/puppeteerRunner.js
index a2d07f633f..c6509bd93d 100644
--- a/packages/test-in-console/puppeteerRunner.js
+++ b/packages/test-in-console/puppeteerRunner.js
@@ -1,12 +1,16 @@
const puppeteer = require('../../dev_bundle/lib/node_modules/puppeteer');
+let testNumber = 0;
+
async function runNextUrl(browser) {
const page = await browser.newPage();
page.on('console', msg => {
- if (msg._text !== undefined) {
- console.log(msg._text);
- }
+ // this is a way to make sure the travis does not timeout
+ // if the test is running for too long without any output to the console (10 minutes)
+ if (msg._text !== undefined) console.log(msg._text);
+ else console.log(`Test number: ${ testNumber }`);
+ testNumber++;
});
if (!process.env.URL) {
@@ -19,11 +23,15 @@ async function runNextUrl(browser) {
async function poll() {
if (await isDone(page)) {
let failCount = await getFailCount(page);
- console.log(`Tests complete with ${failCount} failures`);
- console.log(`Tests complete with ${await getPassCount(page)} passes`);
+ console.log(`
+ The number of tests from Test number may be different because
+ of the way the test is written. causing the test to fail or
+ to run more than once. in the console. Test number total: ${ testNumber }`);
+ console.log(`Tests complete with ${ failCount } failures`);
+ console.log(`Tests complete with ${ await getPassCount(page) } passes`);
if (failCount > 0) {
const failed = await getFailed(page);
- failed.map( (f) => console.log(`${f.name} failed: ${f.info}`));
+ failed.map((f) => console.log(`${ f.name } failed: ${ f.info }`));
await page.close();
await browser.close();
process.exit(1);
@@ -46,7 +54,7 @@ async function runNextUrl(browser) {
* @return {Promise}
*/
async function isDone(page) {
- return await page.evaluate(function() {
+ return await page.evaluate(function () {
if (typeof TEST_STATUS !== 'undefined') {
return TEST_STATUS.DONE;
}
@@ -61,7 +69,7 @@ async function isDone(page) {
* @return {Promise}
*/
async function getPassCount(page) {
- return await page.evaluate(function() {
+ return await page.evaluate(function () {
if (typeof TEST_STATUS !== 'undefined') {
return TEST_STATUS.PASSED;
}
@@ -76,7 +84,7 @@ async function getPassCount(page) {
* @return {Promise}
*/
async function getFailCount(page) {
- return await page.evaluate(function() {
+ return await page.evaluate(function () {
if (typeof TEST_STATUS !== 'undefined') {
return TEST_STATUS.FAILURES;
}
@@ -95,7 +103,7 @@ async function getFailCount(page) {
* @return {Promise<[{name: string, info: string}]>}
*/
async function getFailed(page) {
- return await page.evaluate(function() {
+ return await page.evaluate(function () {
if (typeof TEST_STATUS !== 'undefined') {
return TEST_STATUS.WHERE_FAILED;
}
@@ -104,11 +112,11 @@ async function getFailed(page) {
}
async function runTests() {
- console.log(`Running test with Puppeteer at ${process.env.URL}`);
+ console.log(`Running test with Puppeteer at ${ process.env.URL }`);
// --no-sandbox and --disable-setuid-sandbox must be disabled for CI compatibility
const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] });
- console.log(`Using version: ${await browser.version()}`);
+ console.log(`Using version: ${ await browser.version() }`);
runNextUrl(browser);
}
diff --git a/packages/tinytest/package.js b/packages/tinytest/package.js
index 862749494b..21a7a053f3 100644
--- a/packages/tinytest/package.js
+++ b/packages/tinytest/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Tiny testing framework",
- version: '1.2.1'
+ version: '1.2.2'
});
Package.onUse(function (api) {
diff --git a/packages/tinytest/tinytest.js b/packages/tinytest/tinytest.js
index 045548c6de..f5cd025b98 100644
--- a/packages/tinytest/tinytest.js
+++ b/packages/tinytest/tinytest.js
@@ -1,5 +1,3 @@
-const Future = Meteor.isServer && require('fibers/future');
-
/******************************************************************************/
/* TestCaseResults */
/******************************************************************************/
@@ -186,6 +184,43 @@ export class TestCaseResults {
this.ok();
}
+ _assertActual(actual, predicate, message) {
+ if (actual && predicate(actual))
+ this.ok();
+ else
+ this.fail({
+ type: "throws",
+ message: (actual ?
+ "wrong error thrown: " + actual.message :
+ "did not throw an error as expected") + (message ? ": " + message : ""),
+ });
+ }
+
+ _guessPredicate(expected) {
+ let predicate;
+
+ if (expected === undefined) {
+ predicate = function () {
+ return true;
+ };
+ } else if (typeof expected === "string") {
+ predicate = function (actual) {
+ return typeof actual.message === "string" &&
+ actual.message.indexOf(expected) !== -1;
+ };
+ } else if (expected instanceof RegExp) {
+ predicate = function (actual) {
+ return expected.test(actual.message);
+ };
+ } else if (typeof expected === 'function') {
+ predicate = expected;
+ } else {
+ throw new Error('expected should be a string, regexp, or predicate function');
+ }
+
+ return predicate;
+ }
+
// expected can be:
// undefined: accept any exception.
// string: pass if the string is a substring of the exception message.
@@ -204,26 +239,8 @@ export class TestCaseResults {
// particular class, use a predicate function.
//
throws(f, expected, message) {
- var actual, predicate;
-
- if (expected === undefined) {
- predicate = function (actual) {
- return true;
- };
- } else if (typeof expected === "string") {
- predicate = function (actual) {
- return typeof actual.message === "string" &&
- actual.message.indexOf(expected) !== -1;
- };
- } else if (expected instanceof RegExp) {
- predicate = function (actual) {
- return expected.test(actual.message);
- };
- } else if (typeof expected === 'function') {
- predicate = expected;
- } else {
- throw new Error('expected should be a string, regexp, or predicate function');
- }
+ let actual;
+ const predicate = this._guessPredicate(expected);
try {
f();
@@ -231,15 +248,27 @@ export class TestCaseResults {
actual = exception;
}
- if (actual && predicate(actual))
- this.ok();
- else
- this.fail({
- type: "throws",
- message: (actual ?
- "wrong error thrown: " + actual.message :
- "did not throw an error as expected") + (message ? ": " + message : ""),
- });
+ this._assertActual(actual, predicate, message);
+ }
+
+ /**
+ * Same as throw, but accepts an async function as a parameter.
+ * @param f
+ * @param expected
+ * @param message
+ * @returns {Promise}
+ */
+ async throwsAsync(f, expected, message) {
+ let actual;
+ const predicate = this._guessPredicate(expected);
+
+ try {
+ await f();
+ } catch (exception) {
+ actual = exception;
+ }
+
+ this._assertActual(actual, predicate, message);
}
isTrue(v, msg) {
@@ -309,7 +338,7 @@ export class TestCaseResults {
pass = true;
}
} else {
- /* fail -- not something that contains other things */;
+ /* fail -- not something that contains other things */
}
if (pass === ! not) {
@@ -546,37 +575,37 @@ export class TestRun {
}
if (Meteor.isServer) {
- // On the server, ensure that only one test runs at a time, even
- // with multiple clients.
this.manager.testQueue.queueTask(() => {
- // The future resolves when the test completes or times out.
- var future = new Future();
- Meteor.setTimeout(
- () => {
- if (future.isResolved())
- // If the future has resolved the test has completed.
- return;
- test.timedOut = true;
- this._report(test, {
- type: "exception",
- details: {
- message: "test timed out"
- }
- });
- future['return']();
- },
- 3 * 60 * 1000 // 3 minutes
- );
- this._runTest(test, () => {
- // The test can complete after it has timed out (it might
- // just be slow), so only resolve the future if the test
- // hasn't timed out.
- if (! future.isResolved())
- future['return']();
- }, stop_at_offset);
- // Wait for the test to complete or time out.
- future.wait();
- onComplete && onComplete();
+ // On the server, ensure that only one test runs at a time, even
+ // with multiple clients.
+ let hasRan = false;
+ const timeoutPromise = new Promise((resolve) => {
+ Meteor.setTimeout(() => {
+ if (!hasRan) {
+ test.timedOut = true;
+ this._report(test, {
+ type: "exception",
+ details: {
+ message: "test timed out"
+ }
+ });
+ }
+
+ resolve();
+ }, 3 * 60 * 1000);
+ });
+ const runnerPromise = new Promise((resolve) => {
+ this._runTest(test, () => {
+ if (!hasRan) {
+ hasRan = true;
+ }
+ resolve();
+ }, stop_at_offset);
+ });
+
+ Promise.race([runnerPromise, timeoutPromise]).finally(() => {
+ onComplete && onComplete();
+ });
});
} else {
// client
diff --git a/packages/tinytest/tinytest_server.js b/packages/tinytest/tinytest_server.js
index c43fb12b34..331a7007e7 100644
--- a/packages/tinytest/tinytest_server.js
+++ b/packages/tinytest/tinytest_server.js
@@ -9,7 +9,7 @@ import {
export { Tinytest };
-const Fiber = require('fibers');
+const Fiber = Meteor._isFibersEnabled && require('fibers');
const handlesForRun = new Map;
const reportsForRun = new Map;
@@ -58,7 +58,7 @@ Meteor.methods({
}
function onReport(report) {
- if (! Fiber.current) {
+ if (Fiber && !Fiber.current) {
Meteor._debug("Trying to report a test not in a fiber! "+
"You probably forgot to wrap a callback in bindEnvironment.");
console.trace();
diff --git a/packages/twitter-oauth/package.js b/packages/twitter-oauth/package.js
index 6a8bd6793b..62d7646ca8 100644
--- a/packages/twitter-oauth/package.js
+++ b/packages/twitter-oauth/package.js
@@ -1,6 +1,6 @@
Package.describe({
summary: "Twitter OAuth flow",
- version: '1.3.1'
+ version: '1.3.2'
});
Package.onUse(function(api) {
diff --git a/packages/twitter-oauth/twitter_server.js b/packages/twitter-oauth/twitter_server.js
index 6a973ac57d..090d455172 100644
--- a/packages/twitter-oauth/twitter_server.js
+++ b/packages/twitter-oauth/twitter_server.js
@@ -15,9 +15,9 @@ var urls = {
// https://dev.twitter.com/docs/api/1.1/get/account/verify_credentials
Twitter.whitelistedFields = ['profile_image_url', 'profile_image_url_https', 'lang', 'email'];
-OAuth.registerService('twitter', 1, urls, function(oauthBinding) {
- var identity = oauthBinding.get('https://api.twitter.com/1.1/account/verify_credentials.json?include_email=true').data;
-
+OAuth.registerService('twitter', 1, urls, async function(oauthBinding) {
+ const response = await oauthBinding.getAsync('https://api.twitter.com/1.1/account/verify_credentials.json?include_email=true');
+ const { data: identity } = response;
var serviceData = {
id: identity.id_str,
screenName: identity.screen_name,
diff --git a/packages/typescript/package.js b/packages/typescript/package.js
index df071432b9..21db263e8c 100644
--- a/packages/typescript/package.js
+++ b/packages/typescript/package.js
@@ -1,6 +1,6 @@
Package.describe({
name: 'typescript',
- version: '4.5.4',
+ version: '4.6.4',
summary:
'Compiler plugin that compiles TypeScript and ECMAScript in .ts and .tsx files',
documentation: 'README.md',
diff --git a/packages/weibo-oauth/package.js b/packages/weibo-oauth/package.js
index 02cea0b9c6..e2de8dd3ba 100644
--- a/packages/weibo-oauth/package.js
+++ b/packages/weibo-oauth/package.js
@@ -1,13 +1,12 @@
Package.describe({
summary: "Weibo OAuth flow",
- version: "1.3.1",
+ version: "1.3.2",
});
Package.onUse(api => {
api.use('oauth1', ['client', 'server']);
api.use('oauth', ['client', 'server']);
api.use('random', 'client');
- api.use('http@1.4.4 || 2.0.0', 'server');
api.use(['service-configuration', 'ecmascript'], ['client', 'server']);
api.addFiles('weibo_client.js', 'client');
diff --git a/packages/weibo-oauth/weibo_server.js b/packages/weibo-oauth/weibo_server.js
index 539022aa8d..24d56438fd 100644
--- a/packages/weibo-oauth/weibo_server.js
+++ b/packages/weibo-oauth/weibo_server.js
@@ -1,8 +1,8 @@
Weibo = {};
-OAuth.registerService('weibo', 2, null, query => {
+OAuth.registerService('weibo', 2, null, async query => {
- const response = getTokenResponse(query);
+ const response = await getTokenResponse(query);
const uid = parseInt(response.uid, 10);
// different parts of weibo's api seem to expect numbers, or strings
@@ -11,7 +11,7 @@ OAuth.registerService('weibo', 2, null, query => {
throw new Error(`Expected 'uid' to parse to an integer: ${JSON.stringify(response)}`);
}
- const identity = getIdentity(response.access_token, uid);
+ const identity = await getIdentity(response.access_token, uid);
return {
serviceData: {
@@ -31,46 +31,48 @@ OAuth.registerService('weibo', 2, null, query => {
// - uid
// - access_token
// - expires_in: lifetime of this token in seconds (5 years(!) right now)
-const getTokenResponse = query => {
- const config = ServiceConfiguration.configurations.findOne({service: 'weibo'});
- if (!config)
- throw new ServiceConfiguration.ConfigError();
+const getTokenResponse = async (query) => {
+ const config = ServiceConfiguration.configurations.findOne({
+ service: 'weibo',
+ });
+ if (!config) throw new ServiceConfiguration.ConfigError();
- let response;
- try {
- response = HTTP.post(
- "https://api.weibo.com/oauth2/access_token", {params: {
- code: query.code,
- client_id: config.clientId,
- client_secret: OAuth.openSecret(config.secret),
- redirect_uri: OAuth._redirectUri('weibo', config, null, {replaceLocalhost: true}),
- grant_type: 'authorization_code'
- }});
- } catch (err) {
- throw Object.assign(new Error(`Failed to complete OAuth handshake with Weibo. ${err.message}`),
- {response: err.response});
- }
-
- // result.headers["content-type"] is 'text/plain;charset=UTF-8', so
- // the http package doesn't automatically populate result.data
- response.data = JSON.parse(response.content);
-
- if (response.data.error) { // if the http response was a json object with an error attribute
- throw new Error(`Failed to complete OAuth handshake with Weibo. ${response.data.error}`);
- } else {
- return response.data;
- }
+ return OAuth._fetch('https://api.weibo.com/oauth2/access_token', 'POST', {
+ queryParams: {
+ code: query.code,
+ client_id: config.clientId,
+ client_secret: OAuth.openSecret(config.secret),
+ redirect_uri: OAuth._redirectUri('weibo', config, null, {
+ replaceLocalhost: true,
+ }),
+ grant_type: 'authorization_code',
+ },
+ })
+ .then((res) => res.json())
+ .catch((err) => {
+ throw Object.assign(
+ new Error(
+ `Failed to complete OAuth handshake with Weibo. ${err.message}`
+ ),
+ { response: err.response }
+ );
+ });
};
-const getIdentity = (accessToken, userId) => {
- try {
- return HTTP.get(
- "https://api.weibo.com/2/users/show.json",
- {params: {access_token: accessToken, uid: userId}}).data;
- } catch (err) {
- throw Object.assign(new Error("Failed to fetch identity from Weibo. " + err.message),
- {response: err.response});
- }
+const getIdentity = async (accessToken, userId) => {
+ return OAuth._fetch('https://api.weibo.com/2/users/show.json', 'GET', {
+ queryParams: {
+ access_token: accessToken,
+ uid: userId,
+ },
+ })
+ .then((res) => res.json())
+ .catch((err) => {
+ throw Object.assign(
+ new Error('Failed to fetch identity from Weibo. ' + err.message),
+ { response: err.response }
+ );
+ });
};
Weibo.retrieveCredential = (credentialToken, credentialSecret) =>
diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json
index e475269aa6..7a18f6f0ef 100644
--- a/scripts/admin/meteor-release-experimental.json
+++ b/scripts/admin/meteor-release-experimental.json
@@ -1,6 +1,6 @@
{
"track": "METEOR",
- "version": "2.8.1-rc.0",
+ "version": "2.9.1-rc.0",
"recommended": false,
"official": false,
"description": "Meteor experimental release"
diff --git a/scripts/admin/meteor-release-official.json b/scripts/admin/meteor-release-official.json
index b49fccf05e..2920330372 100644
--- a/scripts/admin/meteor-release-official.json
+++ b/scripts/admin/meteor-release-official.json
@@ -1,6 +1,6 @@
{
"track": "METEOR",
- "version": "2.8.1",
+ "version": "2.9.1",
"recommended": false,
"official": true,
"description": "The Official Meteor Distribution"
diff --git a/scripts/build-dev-bundle-common.sh b/scripts/build-dev-bundle-common.sh
index ef6013c4e5..6928825c20 100644
--- a/scripts/build-dev-bundle-common.sh
+++ b/scripts/build-dev-bundle-common.sh
@@ -5,7 +5,7 @@ set -u
UNAME=$(uname)
ARCH=$(uname -m)
-NODE_VERSION=14.21.1
+NODE_VERSION=14.21.2
MONGO_VERSION_64BIT=5.0.5
MONGO_VERSION_32BIT=3.2.22
NPM_VERSION=6.14.17
diff --git a/scripts/dev-bundle-tool-package.js b/scripts/dev-bundle-tool-package.js
index a2d440e238..13c5ba5771 100644
--- a/scripts/dev-bundle-tool-package.js
+++ b/scripts/dev-bundle-tool-package.js
@@ -15,7 +15,7 @@ var packageJson = {
"node-gyp": "8.0.0",
"node-pre-gyp": "0.15.0",
typescript: "4.5.4",
- "@meteorjs/babel": "7.16.0-beta.1",
+ "@meteorjs/babel": "7.18.0-beta.4",
// Keep the versions of these packages consistent with the versions
// found in dev-bundle-server-package.js.
"meteor-promise": "0.9.0",
diff --git a/tools/cli/commands-packages.js b/tools/cli/commands-packages.js
index 2c8f3ff4e2..9f26b97089 100644
--- a/tools/cli/commands-packages.js
+++ b/tools/cli/commands-packages.js
@@ -883,7 +883,7 @@ main.registerCommand({
relConf.packages = {};
var toPublish = [];
-
+ Console.info(`Will publish new version for MeteorJS: ${relConf.version}`);
main.captureAndExit("=> Errors in release packages:", function () {
_.each(allPackages, function (packageName) {
buildmessage.enterJob("checking consistency of " + packageName, function () {
@@ -927,7 +927,7 @@ main.registerCommand({
return;
}
toPublish.push(packageName);
- Console.info("Will publish new version for " + packageName);
+ Console.info(`Will publish new version for ${ packageName }: ${ packageSource.version }`);
return;
} else {
var isopk = projectContext.isopackCache.getIsopack(packageName);
diff --git a/tools/cli/commands.js b/tools/cli/commands.js
index 4a726cb3f3..2467f05879 100644
--- a/tools/cli/commands.js
+++ b/tools/cli/commands.js
@@ -12,6 +12,13 @@ var archinfo = require('../utils/archinfo');
var catalog = require('../packaging/catalog/catalog.js');
var stats = require('../meteor-services/stats.js');
var Console = require('../console/console.js').Console;
+const {
+ blue,
+ green,
+ purple,
+ red,
+ yellow
+} = require('../console/console.js').colors;
var projectContextModule = require('../project-context.js');
var release = require('../packaging/release.js');
@@ -514,6 +521,7 @@ export const AVAILABLE_SKELETONS = [
DEFAULT_SKELETON,
"typescript",
"vue",
+ 'vue-2',
"svelte",
"tailwind",
"chakra-ui",
@@ -533,12 +541,14 @@ main.registerCommand({
blaze: { type: Boolean },
react: { type: Boolean },
vue: { type: Boolean },
+ 'vue-2': { type: Boolean },
typescript: { type: Boolean },
apollo: { type: Boolean },
svelte: { type: Boolean },
tailwind: { type: Boolean },
'chakra-ui': { type: Boolean },
solid: { type: Boolean },
+ prototype: { type: Boolean }
},
catalogRefresh: new catalog.Refresh.Never()
}, function (options) {
@@ -547,7 +557,13 @@ main.registerCommand({
// latest release to create a package if we are inside an app)
if (options.package) {
var packageName = options.args[0];
-
+ if (options.prototype) {
+ Console.error(
+ `The ${Console.command('--prototype')} option is no longer supported for packages.`
+ );
+ Console.error();
+ throw new main.ShowUsage;
+ }
if (options.list || options.example) {
Console.error("No package examples exist at this time.");
Console.error();
@@ -790,6 +806,22 @@ main.registerCommand({
return transform(f);
},
transformContents: function (contents, f) {
+
+ // check if this app is just for prototyping if it is then we need to add autopublish and insecure in the packages file
+ if ((/packages/).test(f)) {
+
+ const prototypePackages =
+ () =>
+ 'autopublish # Publish all data to the clients (for prototyping)\n' +
+ 'insecure # Allow all DB writes from clients (for prototyping)';
+
+ // XXX: if there is the need to add more options maybe we should have a better abstraction for this if-else
+ if (options.prototype) {
+ return Buffer.from(contents.toString().replace(/~prototype~/g, prototypePackages()))
+ } else {
+ return Buffer.from(contents.toString().replace(/~prototype~/g, ''))
+ }
+ }
if ((/(\.html|\.[jt]sx?|\.css)/).test(f)) {
return Buffer.from(transform(contents.toString()));
} else {
@@ -905,7 +937,8 @@ main.registerCommand({
cmd("meteor create --minimal # to create an app with as few Meteor packages as possible");
cmd("meteor create --full # to create a more complete scaffolded app");
cmd("meteor create --react # to create a basic React-based app");
- cmd("meteor create --vue # to create a basic Vue-based app");
+ cmd("meteor create --vue # to create a basic Vue3-based app");
+ cmd("meteor create --vue-2 # to create a basic Vue2-based app");
cmd("meteor create --apollo # to create a basic Apollo + React app");
cmd("meteor create --svelte # to create a basic Svelte app");
cmd("meteor create --typescript # to create an app using TypeScript and React");
@@ -2508,6 +2541,298 @@ main.registerCommand({
});
+///////////////////////////////////////////////////////////////////////////////
+// generate
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @param question
+ * @returns {function(string): Promise}
+ */
+const createPrompt = () => {
+ const readline = require('readline')
+ .createInterface({ input: process.stdin, output: process.stdout });
+ return async (question) => new Promise((resolve, reject) => {
+ readline.question(question, (answer) => {
+ resolve(answer);
+ })
+ })
+}
+
+const sanitizeBoolAnswer = (string) => {
+ if (string === '') return true;
+
+ if (string.toLowerCase() === 'y' || string.toLowerCase() === 'yes') return true;
+
+ if (string.toLowerCase() === 'n' || string.toLowerCase() === 'no' ) return false;
+
+ Console.error(red('You must provide a valid answer'));
+ Console.error(yellow('it should be either (y)es or (n)o or just press enter to accept the default value'));
+ throw new main.ExitWithCode(2);
+}
+
+/**
+ * simple verification for the name
+ * @param scaffoldName {string}
+ */
+const checkScaffoldName = (scaffoldName) => {
+ if (scaffoldName === '') {
+ Console.error(red('You must provide a name for your model.'));
+ Console.error(yellow('Model names should not be empty.'));
+ throw new main.ExitWithCode(2);
+ }
+
+ if (scaffoldName.includes('/')) {
+ Console.error(red('You must provide a valid name for your model.'));
+ Console.error(yellow('Model names should not contain slashes.'));
+ throw new main.ExitWithCode(2);
+ }
+
+ const allNonWordRegex = /[^a-zA-Z0-9_-]/g; // all numbers and letters plus _ and -
+ if (allNonWordRegex.test(scaffoldName)) {
+ Console.error(red('You must provide a valid name for your model.'));
+ Console.error(yellow('Model names should not contain special characters except _ and -'));
+ throw new main.ExitWithCode(2);
+ }
+}
+
+main.registerCommand({
+ name: 'generate',
+ maxArgs: 1,
+ minArgs: 0,
+ options: {
+ path: { type: String },
+ methods: { type: Boolean },
+ publications: { type: Boolean },
+ templatePath : { type: String },
+ replaceFn : { type: String },
+ },
+ pretty: false,
+ catalogRefresh: new catalog.Refresh.Never()
+}, async function (options) {
+ const { args, appDir } = options;
+
+ const setup = async (arg0) => {
+ if (arg0 === undefined) {
+ const ask = createPrompt();
+ // the ANSI color chart is here: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors
+ const scaffoldName = await ask(`What is the name of your ${yellow('model')}? `);
+ checkScaffoldName(scaffoldName);
+ const areMethods = await ask(`There will be methods [${green('Y')}/${red('n')}]? press enter for ${green('yes')} `);
+ const methods = sanitizeBoolAnswer(areMethods);
+ const arePublications = await ask(`There will be publications [${green('Y')}/${red('n')}]? press enter for ${green('yes')} `);
+ const publications = sanitizeBoolAnswer(arePublications);
+ const path = await ask(`Where it will be placed? press enter for ${yellow('./imports/api/')} `);
+ return {
+ isWizard: true,
+ scaffoldName,
+ path,
+ methods,
+ publications,
+ }
+ }
+
+ const {
+ path,
+ methods,
+ publications
+ } = options;
+
+ return {
+ isWizard: false,
+ scaffoldName: arg0,
+ path,
+ methods,
+ publications,
+ }
+ }
+ /**
+ * @type{string}
+ */
+ const {
+ isWizard,
+ scaffoldName,
+ path,
+ methods,
+ publications
+ } = await setup(args[0]);
+
+ checkScaffoldName(scaffoldName);
+ // get directory where we will place our files
+ const scaffoldPath = path ||`${ appDir }/imports/api/${ scaffoldName }`;
+
+ /**
+ *
+ * @param appDir
+ * @returns {string[]}
+ */
+ const getFilesInDir = (appDir) => {
+ const appPath = files.pathResolve(appDir);
+ return files.readdir(appPath);
+ }
+
+ const getExtension = () => {
+ const rootFiles = getFilesInDir(appDir);
+ if (rootFiles.includes('tsconfig.json')) return 'ts'
+ else return 'js'
+ }
+
+ /**
+ *
+ * @returns {string}
+ */
+ const userTransformFilenameFn = (filename) => {
+ const path = files.pathResolve(files.pathJoin(appDir, options.replaceFn));
+ const replaceFn = require(path).transformFilename;
+ if (typeof replaceFn !== 'function') {
+ Console.error(red('You must provide a valid function transformFilename.'));
+ Console.error(yellow('The function should be named transformFilename and should be exported.'));
+ throw new main.ExitWithCode(2);
+ }
+ return replaceFn(scaffoldName, filename);
+ }
+ /**
+ *
+ * @returns {string}
+ */
+ const userTransformContentsFn = (contents, fileName) => {
+ const path = files.pathResolve(files.pathJoin(appDir, options.replaceFn));
+ const replaceFn = require(path).transformContents;
+ if (typeof replaceFn !== 'function') {
+ Console.error(red('You must provide a valid function transformContents.'));
+ Console.error(yellow('The function should be named transformContents and should be exported.'));
+ throw new main.ExitWithCode(2);
+ }
+ return replaceFn(scaffoldName, contents, fileName);
+ }
+
+ /**
+ * if contains - turns into pascal
+ * @param str{string}
+ * @returns {string}
+ */
+ const toPascalCase = (str) => {
+ if(!str.includes('-')) return str.charAt(0).toUpperCase() + str.slice(1);
+ else return str.split('-').map(toPascalCase).join('');
+ }
+ const toCamelCase = (str) => {
+ if(!str.includes('-')) return str.charAt(0).toLowerCase() + str.slice(1);
+ else return str.split('-').map(toPascalCase).join('');
+ }
+
+ /**
+ *
+ * @param name {string}
+ */
+ const transformName = (name) => {
+ return name.replace(/\$\$name\$\$|\$\$PascalName\$\$|\$\$camelName\$\$/g, function (substring, args) {
+ if (substring === '$$name$$') return scaffoldName;
+ if (substring === '$$PascalName$$') return toPascalCase(scaffoldName);
+ if (substring === '$$camelName$$') return toCamelCase(scaffoldName);
+ })
+ }
+
+ /**
+ *
+ * @param content{string}
+ * @param fileName{string}
+ * @returns {string}
+ */
+ const removeUnusedLines = (content, fileName) => {
+ if (methods && publications) return content;
+ if (!methods && !publications) return content;
+ if(!fileName.startsWith('index')) return content;
+ return content
+ .split('\n')
+ .filter(line => {
+ if (!methods && line.includes('methods')) return false;
+ if (!publications && line.includes('publications')) return false;
+ return true;
+ })
+ .join('\n');
+ }
+ /// Program
+ const rootFiles = getFilesInDir(appDir);
+ if (!rootFiles.includes('.meteor')) {
+ Console.error(red('You must be in a Meteor project to run this command'));
+ Console.error(yellow('You can create a new Meteor project with `meteor create`'));
+ throw new main.ExitWithCode(2);
+ }
+
+ const extension = getExtension()
+ const assetsPath = () => {
+ if (options.templatePath){
+ const templatePath = files.pathJoin(appDir, options.templatePath)
+ Console.info(`Using template that is in: ${purple(templatePath)}`)
+ return templatePath;
+ }
+ return files.pathJoin(
+ __dirnameConverted,
+ '..',
+ 'static-assets',
+ `scaffolds-${ extension }`)
+ }
+ // create directory
+ const isOk = files.mkdir_p(scaffoldPath);
+ if (!isOk) {
+ Console.error(red('Something went wrong when creating the folder'));
+ Console.error(yellow('Do you have the correct permissions?'));
+ throw new main.ExitWithCode(2);
+ }
+
+ files.cp_r(assetsPath(), files.pathResolve(scaffoldPath), {
+ transformFilename: function (f) {
+ if (options.replaceFn) return userTransformFilenameFn(f);
+ return transformName(f);
+ },
+ transformContents: function (contents, fileName) {
+ if (options.replaceFn) return userTransformContentsFn(contents.toString(), fileName);
+ const cleaned = removeUnusedLines(contents.toString(), fileName);
+ return transformName(cleaned);
+ }
+ })
+
+ const checkAndRemoveFiles = () => {
+ if (!methods)
+ files.unlink(files.pathJoin(scaffoldPath, `methods.${ extension }`));
+
+ if (!publications)
+ files.unlink(files.pathJoin(scaffoldPath, `publications.${ extension }`));
+ }
+
+ const xor = (a, b) => ( a || b ) && !( a && b );
+
+ if (!isWizard && xor(methods, publications)) {
+ checkAndRemoveFiles()
+ }
+
+ if (isWizard) {
+ checkAndRemoveFiles()
+ }
+
+ const packageJsonPath = files.pathJoin(appDir, 'package.json');
+ const packageJsonFile = files.readFile(packageJsonPath, 'utf8');
+ const packageJson = JSON.parse(packageJsonFile);
+
+ const mainJsPath =
+ packageJson?.meteor?.mainModule?.server
+ ? files.pathJoin(appDir, packageJson.meteor.mainModule.server)
+ : files.pathJoin(appDir, 'server', 'main.js');
+ const mainJs = files.readFile(mainJsPath);
+ const mainJsLines = mainJs.toString().split('\n');
+ const importLine = path
+ ? `import '${path}';`
+ : `import '/imports/api/${ scaffoldName }';`
+ const mainJsFile = [importLine, ...mainJsLines].join('\n');
+ files.writeFile(mainJsPath, mainJsFile);
+
+ Console.info(`Created ${ blue(scaffoldName) } scaffold in ${ yellow(scaffoldPath) }`);
+
+ return 0;
+});
+
+
///////////////////////////////////////////////////////////////////////////////
// admin get-machine
///////////////////////////////////////////////////////////////////////////////
diff --git a/tools/cli/help.txt b/tools/cli/help.txt
index 8091e7b025..71b63daf23 100644
--- a/tools/cli/help.txt
+++ b/tools/cli/help.txt
@@ -150,7 +150,7 @@ Options:
>>> create
Create a new project.
-Usage: meteor create [--release ] [--bare|--minimal|--full|--react|--vue|--apollo|--svelte|--blaze|--tailwind|--chakra-ui|--solid]
+Usage: meteor create [--release ] [--bare|--minimal|--full|--react|--vue|--vue-2|--apollo|--svelte|--blaze|--tailwind|--chakra-ui|--solid]
meteor create [--release ] --example []
meteor create --list
meteor create --package []
@@ -183,7 +183,8 @@ Options:
--minimal Create an app with as few Meteor packages as possible.
--full Create a fully scaffolded app.
--react Create a basic react-based app, same as default.
- --vue Create a basic vue-based app.
+ --vue Create a basic vue3-based app.
+ --vue-2 Create a basic vue2-based app.
--apollo Create a basic apollo-based app.
--svelte Create a basic svelte-based app.
--typescript Create a basic Typescript React-based app.
@@ -191,6 +192,7 @@ Options:
--tailwind Create a basic react-based app, with tailwind configured.
--chakra-ui Create a basic react-based app, with chakra-ui configured.
--solid Create a basic solid-based app.
+ --prototype Create a prototype app with the insecure & autopublish packages. Can be used along with other app commands
>>> update
@@ -841,6 +843,34 @@ command. To see sites in a region other than us-east-1, set the DEPLOY_HOSTNAME
environment variable. For example,
`DEPLOY_HOSTNAME=eu-west-1.galaxy-deploy.meteor.com meteor list-sites`
+>>> generate
+
+Generate boilerplate code for a MeteorJS RPC api.
+It generates a collection with the name you pass and its methods.
+Is JS and TS compatible. No collection name
+runs the wizard.
+
+Usage: meteor generate [] [options]
+
+By default, generates a collection.ts|js file with the name you pass,
+methods(insert, update, remove, find, findOne) in a methods.js|ts file
+and publications.js|ts. If you just use the command without collectionName,
+it will generate run the wizard, asking you what is necessary.
+
+We do have as well the templatePath, wich uses the template you pass to generate
+the boilerplate code. You can use the default template or create your own.
+for replacing the names, we offer $$PascalName$$, $$camelName$$, $$name$$.
+
+This is a MeteorJS project command.
+
+Options:
+ --help Show help.
+ --path The path to the folder where the files will be generated. Default is the current folder.
+ --templatePath Path to the template file check https://docs.meteor.com/commandline.html#meteorgenerate-templating for more info.
+ --replaceFn Replace function to replace the names in the template. Check https://docs.meteor.com/commandline.html#meteorgenerate-templating for more info.
+ --methods Generate methods.
+ --publications Generate publications.
+
>>> publish-release
Publish a new meteor release to the package server.
diff --git a/tools/console/console.js b/tools/console/console.js
index 16ebd55da9..7715560354 100644
--- a/tools/console/console.js
+++ b/tools/console/console.js
@@ -1320,4 +1320,19 @@ class Console extends ConsoleBase {
}
}
+const yellow = (text) => `\x1b[33m${ text }\x1b[0m`;
+const red = (text) => `\x1b[31m${ text }\x1b[0m`;
+const purple = (text) => `\x1b[35m${ text }\x1b[0m`;
+const green = (text) => `\x1b[32m${ text }\x1b[0m`;
+const blue = (text) => `\x1b[34m${ text }\x1b[0m`;
+
+const colors = {
+ yellow,
+ red,
+ purple,
+ green,
+ blue,
+};
+
+exports.colors = colors;
exports.Console = new Console;
diff --git a/tools/isobuild/compiler-deprecated-compile-step.js b/tools/isobuild/compiler-deprecated-compile-step.js
index fe3b9c76c8..0fad0c671d 100644
--- a/tools/isobuild/compiler-deprecated-compile-step.js
+++ b/tools/isobuild/compiler-deprecated-compile-step.js
@@ -1,7 +1,7 @@
// This file contains an old definition of CompileStep, an object that is passed
// to the package-provided file handler.
// Since then, the newer API called "Batch Plugins" have replaced it but we keep
-// the functionality for the backwards-compitability.
+// the functionality for the backwards-compatibility.
// @deprecated
// XXX COMPAT WITH 1.1.0.2
diff --git a/tools/packaging/package-client.js b/tools/packaging/package-client.js
index 78af222cfd..3075970647 100644
--- a/tools/packaging/package-client.js
+++ b/tools/packaging/package-client.js
@@ -809,7 +809,6 @@ exports.publishPackage = function (options) {
// XXX If package version already exists, print a nice error message
// telling them to try 'meteor publish-for-arch' if they want to
// publish a new build.
-
// Documentation is smaller than the source. Upload it first, to minimize
// the chances of PUT URLs expiring. (XXX: in the far future, parallelize this)
buildmessage.enterJob("uploading documentation", function () {
diff --git a/tools/static-assets/README.md b/tools/static-assets/README.md
index db232e18af..1884abb1d6 100644
--- a/tools/static-assets/README.md
+++ b/tools/static-assets/README.md
@@ -40,6 +40,14 @@ Similar to `skel`, `skel-chakra-ui` is copied on `meteor create --chakra-ui` com
Similar to `skel`, `skel-solid` is copied on `meteor create --solid` command.
+## skel-vue - Package Skeleton
+
+Similar to `skel`, `skel-vue` is copied on `meteor create --vue` command.
+
+## skel-vue-2 - Package Skeleton
+
+Similar to `skel`, `skel-vue-2` is copied on `meteor create --vue-2` command.
+
## server - Bundled App's Bootstrap
The `server` folder is copied by Isobuild when the app is bundled (on
diff --git a/tools/static-assets/scaffolds-js/collection.js b/tools/static-assets/scaffolds-js/collection.js
new file mode 100644
index 0000000000..a8a92d7cde
--- /dev/null
+++ b/tools/static-assets/scaffolds-js/collection.js
@@ -0,0 +1,3 @@
+import { Mongo } from 'meteor/mongo';
+
+export const $$PascalName$$Collection = new Mongo.Collection('$$name$$');
diff --git a/tools/static-assets/scaffolds-js/index.js b/tools/static-assets/scaffolds-js/index.js
new file mode 100644
index 0000000000..59951d14bb
--- /dev/null
+++ b/tools/static-assets/scaffolds-js/index.js
@@ -0,0 +1,3 @@
+export * from './collection';
+export * from './methods';
+export * from './publications';
diff --git a/tools/static-assets/scaffolds-js/methods.js b/tools/static-assets/scaffolds-js/methods.js
new file mode 100644
index 0000000000..415f0ebb0a
--- /dev/null
+++ b/tools/static-assets/scaffolds-js/methods.js
@@ -0,0 +1,29 @@
+import { Meteor } from 'meteor/meteor';
+import { check } from 'meteor/check';
+import { $$PascalName$$Collection } from './collection';
+
+export async function create(data) {
+ return $$PascalName$$Collection.insertAsync({ ...data });
+}
+
+export async function update(_id, data) {
+ check(_id, String);
+ return $$PascalName$$Collection.updateAsync(_id, { ...data });
+}
+
+export async function remove(_id) {
+ check(_id, String);
+ return $$PascalName$$Collection.removeAsync(_id);
+}
+
+export async function findById(_id) {
+ check(_id, String);
+ return $$PascalName$$Collection.findOneAsync(_id);
+}
+
+Meteor.methods({
+ '$$PascalName$$.create': create,
+ '$$PascalName$$.update': update,
+ '$$PascalName$$.remove': remove,
+ '$$PascalName$$.find': findById
+});
diff --git a/tools/static-assets/scaffolds-js/publications.js b/tools/static-assets/scaffolds-js/publications.js
new file mode 100644
index 0000000000..7e3a996634
--- /dev/null
+++ b/tools/static-assets/scaffolds-js/publications.js
@@ -0,0 +1,6 @@
+import { Meteor } from 'meteor/meteor';
+import { $$PascalName$$Collection } from './collection';
+
+Meteor.publish('all$$PascalName$$s', function publish$$PascalName$$s() {
+ return $$PascalName$$Collection.find({});
+});
diff --git a/tools/static-assets/scaffolds-ts/collection.ts b/tools/static-assets/scaffolds-ts/collection.ts
new file mode 100644
index 0000000000..f579cd71a2
--- /dev/null
+++ b/tools/static-assets/scaffolds-ts/collection.ts
@@ -0,0 +1,9 @@
+import { Mongo } from 'meteor/mongo';
+
+export type $$PascalName$$ = {
+ _id?: string;
+ name: string;
+ createdAt: Date;
+}
+
+export const $$PascalName$$Collection = new Mongo.Collection<$$PascalName$$, $$PascalName$$>('$$name$$');
diff --git a/tools/static-assets/scaffolds-ts/index.ts b/tools/static-assets/scaffolds-ts/index.ts
new file mode 100644
index 0000000000..59951d14bb
--- /dev/null
+++ b/tools/static-assets/scaffolds-ts/index.ts
@@ -0,0 +1,3 @@
+export * from './collection';
+export * from './methods';
+export * from './publications';
diff --git a/tools/static-assets/scaffolds-ts/methods.ts b/tools/static-assets/scaffolds-ts/methods.ts
new file mode 100644
index 0000000000..d36e1cd42c
--- /dev/null
+++ b/tools/static-assets/scaffolds-ts/methods.ts
@@ -0,0 +1,30 @@
+import { Meteor } from 'meteor/meteor';
+import { Mongo } from 'meteor/mongo';
+import { check } from 'meteor/check';
+import { $$PascalName$$, $$PascalName$$Collection } from './collection';
+
+export async function create(data: $$PascalName$$) {
+ return $$PascalName$$Collection.insertAsync({ ...data });
+}
+
+export async function update(_id: string, data: Mongo.Modifier<$$PascalName$$>) {
+ check(_id, String);
+ return $$PascalName$$Collection.updateAsync(_id, { ...data });
+}
+
+export async function remove(_id: string) {
+ check(_id, String);
+ return $$PascalName$$Collection.removeAsync(_id);
+}
+
+export async function findById(_id: string) {
+ check(_id, String);
+ return $$PascalName$$Collection.findOneAsync(_id);
+}
+
+Meteor.methods({
+ '$$PascalName$$.create': create,
+ '$$PascalName$$.update': update,
+ '$$PascalName$$.remove': remove,
+ '$$PascalName$$.find': findById
+});
diff --git a/tools/static-assets/scaffolds-ts/publications.ts b/tools/static-assets/scaffolds-ts/publications.ts
new file mode 100644
index 0000000000..818932bba3
--- /dev/null
+++ b/tools/static-assets/scaffolds-ts/publications.ts
@@ -0,0 +1,6 @@
+import { Meteor, Subscription } from 'meteor/meteor';
+import { $$PascalName$$Collection } from './collection';
+
+Meteor.publish('all$$PascalName$$s', function publish$$PascalName$$s() {
+ return $$PascalName$$Collection.find({});
+});
diff --git a/tools/static-assets/skel-apollo/.meteor/packages b/tools/static-assets/skel-apollo/.meteor/packages
index caa775ee6f..0addfea192 100644
--- a/tools/static-assets/skel-apollo/.meteor/packages
+++ b/tools/static-assets/skel-apollo/.meteor/packages
@@ -16,7 +16,7 @@ ecmascript # Enable ECMAScript2015+ syntax in app code
typescript # Enable TypeScript syntax in .ts and .tsx modules
shell-server # Server-side component of the `meteor shell` command
hot-module-replacement # Update client in development without reloading the page
-
+~prototype~
static-html # Define static page content in .html files
apollo # Basic Apollo integration for Meteor apps
swydo:graphql # Import .graphql files
diff --git a/tools/static-assets/skel-bare/.meteor/packages b/tools/static-assets/skel-bare/.meteor/packages
index 62bedd2c00..294120e852 100644
--- a/tools/static-assets/skel-bare/.meteor/packages
+++ b/tools/static-assets/skel-bare/.meteor/packages
@@ -10,7 +10,7 @@ mongo # The database Meteor supports right now
static-html # Define static page content in .html files
reactive-var # Reactive variable for tracker
tracker # Meteor's client-side reactive programming library
-
+~prototype~
standard-minifier-css # CSS minifier run for production mode
standard-minifier-js # JS minifier run for production mode
es5-shim # ECMAScript 5 compatibility for older browsers
diff --git a/tools/static-assets/skel-blaze/.meteor/packages b/tools/static-assets/skel-blaze/.meteor/packages
index c2506a81ed..5e929125ff 100644
--- a/tools/static-assets/skel-blaze/.meteor/packages
+++ b/tools/static-assets/skel-blaze/.meteor/packages
@@ -19,8 +19,7 @@ ecmascript # Enable ECMAScript2015+ syntax in app code
typescript # Enable TypeScript syntax in .ts and .tsx modules
shell-server # Server-side component of the `meteor shell` command
-autopublish # Publish all data to the clients (for prototyping)
-insecure # Allow all DB writes from clients (for prototyping)
+~prototype~
hot-module-replacement # Update code in development without reloading the page
blaze-hot # Update files using Blaze's API with HMR
diff --git a/tools/static-assets/skel-chakra-ui/.meteor/packages b/tools/static-assets/skel-chakra-ui/.meteor/packages
index 72de92e77b..90ce4b06dd 100644
--- a/tools/static-assets/skel-chakra-ui/.meteor/packages
+++ b/tools/static-assets/skel-chakra-ui/.meteor/packages
@@ -17,7 +17,6 @@ typescript # Enable TypeScript syntax in .ts and .tsx modules
shell-server # Server-side component of the `meteor shell` command
hot-module-replacement # Update client in development without reloading the page
-autopublish # Publish all data to the clients (for prototyping)
-insecure # Allow all DB writes from clients (for prototyping)
+~prototype~
static-html # Define static page content in .html files
react-meteor-data # React higher-order component for reactively tracking Meteor data
diff --git a/tools/static-assets/skel-full/.meteor/packages b/tools/static-assets/skel-full/.meteor/packages
index 8f6a2ce1df..42dd3fa370 100644
--- a/tools/static-assets/skel-full/.meteor/packages
+++ b/tools/static-assets/skel-full/.meteor/packages
@@ -11,6 +11,7 @@ blaze-html-templates # Compile .html files into Meteor Blaze views
jquery # Wrapper package for npm-installed jquery
reactive-var # Reactive variable for tracker
tracker # Meteor's client-side reactive programming library
+~prototype~
standard-minifier-css # CSS minifier run for production mode
standard-minifier-js # JS minifier run for production mode
diff --git a/tools/static-assets/skel-minimal/.meteor/packages b/tools/static-assets/skel-minimal/.meteor/packages
index 60ed1976b3..d0998cd7ad 100644
--- a/tools/static-assets/skel-minimal/.meteor/packages
+++ b/tools/static-assets/skel-minimal/.meteor/packages
@@ -15,3 +15,4 @@ shell-server # Server-side component of the `meteor shell` command
webapp # Serves a Meteor app over HTTP
server-render # Support for server-side rendering
hot-module-replacement # Rebuilds the client if there is a change on the client without restarting the server
+~prototype~
diff --git a/tools/static-assets/skel-react/.meteor/packages b/tools/static-assets/skel-react/.meteor/packages
index 72de92e77b..90ce4b06dd 100644
--- a/tools/static-assets/skel-react/.meteor/packages
+++ b/tools/static-assets/skel-react/.meteor/packages
@@ -17,7 +17,6 @@ typescript # Enable TypeScript syntax in .ts and .tsx modules
shell-server # Server-side component of the `meteor shell` command
hot-module-replacement # Update client in development without reloading the page
-autopublish # Publish all data to the clients (for prototyping)
-insecure # Allow all DB writes from clients (for prototyping)
+~prototype~
static-html # Define static page content in .html files
react-meteor-data # React higher-order component for reactively tracking Meteor data
diff --git a/tools/static-assets/skel-solid/.meteor/packages b/tools/static-assets/skel-solid/.meteor/packages
index d6c05d244b..492b563f76 100644
--- a/tools/static-assets/skel-solid/.meteor/packages
+++ b/tools/static-assets/skel-solid/.meteor/packages
@@ -17,7 +17,6 @@ typescript # Enable TypeScript syntax in .ts and .tsx modules
shell-server # Server-side component of the `meteor shell` command
hot-module-replacement # Update client in development without reloading the page
-autopublish # Publish all data to the clients (for prototyping)
-insecure # Allow all DB writes from clients (for prototyping)
+~prototype~
static-html # Define static page content in .html files
vite:bundler
diff --git a/tools/static-assets/skel-svelte/.meteor/packages b/tools/static-assets/skel-svelte/.meteor/packages
index 0e3c38c047..b6c7d8a95d 100644
--- a/tools/static-assets/skel-svelte/.meteor/packages
+++ b/tools/static-assets/skel-svelte/.meteor/packages
@@ -7,7 +7,6 @@
meteor-base # Packages every Meteor app needs to have
mobile-experience # Packages for a great mobile UX
mongo # The database Meteor supports right now
-reactive-var # Reactive variable for tracker
standard-minifier-css # CSS minifier run for production mode
standard-minifier-js # JS minifier run for production mode
@@ -16,9 +15,8 @@ ecmascript # Enable ECMAScript2015+ syntax in app code
typescript # Enable TypeScript syntax in .ts and .tsx modules
shell-server # Server-side component of the `meteor shell` command
-autopublish # Publish all data to the clients (for prototyping)
-insecure # Allow all DB writes from clients (for prototyping)
+~prototype~
static-html # Define static page content in .html files
zodern:melte # Meteor package to allow us to create files with the .svelte extension
-rdb:svelte-meteor-data # Meteor package which allows us to consume Meteor's reactive data sources inside of our Svelte components
hot-module-replacement # Update client in development without reloading the page
+zodern:types # Enable types from meteor/atmosphere packages
diff --git a/tools/static-assets/skel-svelte/imports/ui/App.svelte b/tools/static-assets/skel-svelte/imports/ui/App.svelte
index 4bbdfecdc4..d64c1297ee 100644
--- a/tools/static-assets/skel-svelte/imports/ui/App.svelte
+++ b/tools/static-assets/skel-svelte/imports/ui/App.svelte
@@ -1,8 +1,21 @@
@@ -13,10 +26,15 @@
You've pressed the button {counter} times.
Learn Meteor!
-
+ {#if subIsReady}
+
+ {#each links as link (link._id)}
+ {link.title}
+ {/each}
+
+ {:else}
+ Loading ...
+ {/if}
+ Typescript ready
+ Just add lang="ts" to .svelte components.
diff --git a/tools/static-assets/skel-svelte/package.json b/tools/static-assets/skel-svelte/package.json
index 0b0aae237d..0ae79b3327 100644
--- a/tools/static-assets/skel-svelte/package.json
+++ b/tools/static-assets/skel-svelte/package.json
@@ -8,9 +8,12 @@
"visualize": "meteor --production --extra-packages bundle-visualizer"
},
"dependencies": {
- "@babel/runtime": "^7.17.9",
- "meteor-node-stubs": "^1.2.1",
- "svelte": "^3.46.4"
+ "@babel/runtime": "^7.20.6",
+ "meteor-node-stubs": "^1.2.5",
+ "svelte": "^3.54.0"
+ },
+ "devDependencies": {
+ "svelte-preprocess": "^5.0.0"
},
"meteor": {
"mainModule": {
diff --git a/tools/static-assets/skel-svelte/server/main.js b/tools/static-assets/skel-svelte/server/main.js
index b43489013b..886520b487 100644
--- a/tools/static-assets/skel-svelte/server/main.js
+++ b/tools/static-assets/skel-svelte/server/main.js
@@ -5,6 +5,10 @@ async function insertLink({ title, url }) {
await LinksCollection.insertAsync({ title, url, createdAt: new Date() });
}
+Meteor.publish('links.all', function publishLinksAll() {
+ return LinksCollection.find();
+})
+
Meteor.startup(async () => {
// If the Links collection is empty, add some data.
if (await LinksCollection.find().countAsync() === 0) {
diff --git a/tools/static-assets/skel-svelte/tsconfig.json b/tools/static-assets/skel-svelte/tsconfig.json
new file mode 100644
index 0000000000..11f2c45698
--- /dev/null
+++ b/tools/static-assets/skel-svelte/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ // see https://guide.meteor.com/build-tool.html#typescript for a config example
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true, // to be able to import eg meteor/mongo
+ "baseUrl": ".", // required by "paths"
+ "module": "esNext", // required by "preserveValueImports"
+ "moduleResolution": "node", // required by zodern:types (not documented)
+ "paths": {
+ "/*": ["*"], // support absolute /imports/* with a leading '/'
+ // support Meteor/Atmospehere packages, required by zodern:types
+ "meteor/*": [
+ "node_modules/@types/meteor/*",
+ ".meteor/local/types/packages.d.ts"
+ ]
+ },
+ "preserveSymlinks": true, // required by zodern:types
+ "preserveValueImports": true // otherwise TS will remove imported components
+ },
+ "exclude": ["./.meteor/**", "./packages/**"] // this may solve VS Code Svelte plugin warnings
+}
diff --git a/tools/static-assets/skel-tailwind/.meteor/packages b/tools/static-assets/skel-tailwind/.meteor/packages
index 72de92e77b..90ce4b06dd 100644
--- a/tools/static-assets/skel-tailwind/.meteor/packages
+++ b/tools/static-assets/skel-tailwind/.meteor/packages
@@ -17,7 +17,6 @@ typescript # Enable TypeScript syntax in .ts and .tsx modules
shell-server # Server-side component of the `meteor shell` command
hot-module-replacement # Update client in development without reloading the page
-autopublish # Publish all data to the clients (for prototyping)
-insecure # Allow all DB writes from clients (for prototyping)
+~prototype~
static-html # Define static page content in .html files
react-meteor-data # React higher-order component for reactively tracking Meteor data
diff --git a/tools/static-assets/skel-typescript/.meteor/packages b/tools/static-assets/skel-typescript/.meteor/packages
index 72de92e77b..90ce4b06dd 100644
--- a/tools/static-assets/skel-typescript/.meteor/packages
+++ b/tools/static-assets/skel-typescript/.meteor/packages
@@ -17,7 +17,6 @@ typescript # Enable TypeScript syntax in .ts and .tsx modules
shell-server # Server-side component of the `meteor shell` command
hot-module-replacement # Update client in development without reloading the page
-autopublish # Publish all data to the clients (for prototyping)
-insecure # Allow all DB writes from clients (for prototyping)
+~prototype~
static-html # Define static page content in .html files
react-meteor-data # React higher-order component for reactively tracking Meteor data
diff --git a/tools/static-assets/skel-typescript/package.json b/tools/static-assets/skel-typescript/package.json
index c7c54d5cc4..76457880f7 100644
--- a/tools/static-assets/skel-typescript/package.json
+++ b/tools/static-assets/skel-typescript/package.json
@@ -18,7 +18,7 @@
"@types/mocha": "^8.2.3",
"@types/react": "^17.0.43",
"@types/react-dom": "^17.0.14",
- "typescript": "^4.6.3"
+ "typescript": "^4.6.4"
},
"meteor": {
"mainModule": {
diff --git a/tools/static-assets/skel-vue-2/.gitignore b/tools/static-assets/skel-vue-2/.gitignore
new file mode 100644
index 0000000000..c2658d7d1b
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/.gitignore
@@ -0,0 +1 @@
+node_modules/
diff --git a/tools/static-assets/skel-vue-2/.meteor/.gitignore b/tools/static-assets/skel-vue-2/.meteor/.gitignore
new file mode 100644
index 0000000000..4083037423
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/.meteor/.gitignore
@@ -0,0 +1 @@
+local
diff --git a/tools/static-assets/skel-vue-2/.meteor/packages b/tools/static-assets/skel-vue-2/.meteor/packages
new file mode 100644
index 0000000000..83be6b3a62
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/.meteor/packages
@@ -0,0 +1,24 @@
+# Meteor packages used by this project, one per line.
+# Check this file (and the other files in this directory) into your repository.
+#
+# 'meteor add' and 'meteor remove' will edit this file for you,
+# but you can also edit it by hand.
+
+meteor-base # Packages every Meteor app needs to have
+mobile-experience # Packages for a great mobile UX
+mongo # The database Meteor supports right now
+reactive-var # Reactive variable for tracker
+
+standard-minifier-css # CSS minifier run for production mode
+standard-minifier-js # JS minifier run for production mode
+es5-shim # ECMAScript 5 compatibility for older browsers
+ecmascript # Enable ECMAScript2015+ syntax in app code
+typescript # Enable TypeScript syntax in .ts and .tsx modules
+shell-server # Server-side component of the `meteor shell` command
+
+tracker # Dependency tracker to allow reactive callbacks
+static-html # Define static page content in .html files
+akryum:vue-component # Vue-CLI template to publish components
+
+meteortesting:mocha # A package for writing and running your meteor app and package tests with mocha
+johanbrook:publication-collector # Test a Meteor publication by collecting its output
diff --git a/tools/static-assets/skel-vue-2/.meteor/platforms b/tools/static-assets/skel-vue-2/.meteor/platforms
new file mode 100644
index 0000000000..efeba1b50c
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/.meteor/platforms
@@ -0,0 +1,2 @@
+server
+browser
diff --git a/tools/static-assets/skel-vue-2/client/main.html b/tools/static-assets/skel-vue-2/client/main.html
new file mode 100644
index 0000000000..99c3dfb74c
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/client/main.html
@@ -0,0 +1,7 @@
+
+ ~name~
+
+
+
+
+
diff --git a/tools/static-assets/skel-vue-2/client/main.js b/tools/static-assets/skel-vue-2/client/main.js
new file mode 100644
index 0000000000..665c6aa1b1
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/client/main.js
@@ -0,0 +1,12 @@
+import Vue from 'vue'
+
+import '../imports/ui/plugins'
+
+import App from '../imports/ui/App.vue'
+
+Meteor.startup(() => {
+ new Vue({
+ el: '#app',
+ ...App,
+ })
+})
diff --git a/tools/static-assets/skel-vue/imports/api/collections/Links.js b/tools/static-assets/skel-vue-2/imports/api/collections/Links.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/api/collections/Links.js
rename to tools/static-assets/skel-vue-2/imports/api/collections/Links.js
diff --git a/tools/static-assets/skel-vue/imports/api/collections/Links.tests.js b/tools/static-assets/skel-vue-2/imports/api/collections/Links.tests.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/api/collections/Links.tests.js
rename to tools/static-assets/skel-vue-2/imports/api/collections/Links.tests.js
diff --git a/tools/static-assets/skel-vue/imports/api/fixtures.js b/tools/static-assets/skel-vue-2/imports/api/fixtures.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/api/fixtures.js
rename to tools/static-assets/skel-vue-2/imports/api/fixtures.js
diff --git a/tools/static-assets/skel-vue/imports/api/methods/createLink.js b/tools/static-assets/skel-vue-2/imports/api/methods/createLink.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/api/methods/createLink.js
rename to tools/static-assets/skel-vue-2/imports/api/methods/createLink.js
diff --git a/tools/static-assets/skel-vue/imports/api/methods/createLink.tests.js b/tools/static-assets/skel-vue-2/imports/api/methods/createLink.tests.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/api/methods/createLink.tests.js
rename to tools/static-assets/skel-vue-2/imports/api/methods/createLink.tests.js
diff --git a/tools/static-assets/skel-vue/imports/api/methods/index.js b/tools/static-assets/skel-vue-2/imports/api/methods/index.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/api/methods/index.js
rename to tools/static-assets/skel-vue-2/imports/api/methods/index.js
diff --git a/tools/static-assets/skel-vue/imports/api/publications/index.js b/tools/static-assets/skel-vue-2/imports/api/publications/index.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/api/publications/index.js
rename to tools/static-assets/skel-vue-2/imports/api/publications/index.js
diff --git a/tools/static-assets/skel-vue/imports/api/publications/links.js b/tools/static-assets/skel-vue-2/imports/api/publications/links.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/api/publications/links.js
rename to tools/static-assets/skel-vue-2/imports/api/publications/links.js
diff --git a/tools/static-assets/skel-vue/imports/api/publications/links.tests.js b/tools/static-assets/skel-vue-2/imports/api/publications/links.tests.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/api/publications/links.tests.js
rename to tools/static-assets/skel-vue-2/imports/api/publications/links.tests.js
diff --git a/tools/static-assets/skel-vue-2/imports/ui/App.vue b/tools/static-assets/skel-vue-2/imports/ui/App.vue
new file mode 100644
index 0000000000..e126098ccb
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/imports/ui/App.vue
@@ -0,0 +1,26 @@
+
+
+
Welcome to Meteor!
+
+
+
+
+
+
+
+
diff --git a/tools/static-assets/skel-vue/imports/ui/components/Hello.vue b/tools/static-assets/skel-vue-2/imports/ui/components/Hello.vue
similarity index 100%
rename from tools/static-assets/skel-vue/imports/ui/components/Hello.vue
rename to tools/static-assets/skel-vue-2/imports/ui/components/Hello.vue
diff --git a/tools/static-assets/skel-vue/imports/ui/components/Info.vue b/tools/static-assets/skel-vue-2/imports/ui/components/Info.vue
similarity index 100%
rename from tools/static-assets/skel-vue/imports/ui/components/Info.vue
rename to tools/static-assets/skel-vue-2/imports/ui/components/Info.vue
diff --git a/tools/static-assets/skel-vue/imports/ui/plugins.js b/tools/static-assets/skel-vue-2/imports/ui/plugins.js
similarity index 100%
rename from tools/static-assets/skel-vue/imports/ui/plugins.js
rename to tools/static-assets/skel-vue-2/imports/ui/plugins.js
diff --git a/tools/static-assets/skel-vue-2/package.json b/tools/static-assets/skel-vue-2/package.json
new file mode 100644
index 0000000000..e8cfe3ee72
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "~name~",
+ "private": true,
+ "scripts": {
+ "start": "meteor run",
+ "test": "meteor test --once --driver-package meteortesting:mocha",
+ "test-app": "TEST_WATCH=1 meteor test --full-app --driver-package meteortesting:mocha",
+ "visualize": "meteor --production --extra-packages bundle-visualizer"
+ },
+ "dependencies": {
+ "@babel/runtime": "^7.17.9",
+ "meteor-node-stubs": "^1.2.1",
+ "vue": "^2.6.14",
+ "vue-meteor-tracker": "^2.0.0-beta.5"
+ },
+ "meteor": {
+ "mainModule": {
+ "client": "client/main.js",
+ "server": "server/main.js"
+ },
+ "testModule": "tests/main.js"
+ }
+}
diff --git a/tools/static-assets/skel-vue-2/server/main.js b/tools/static-assets/skel-vue-2/server/main.js
new file mode 100644
index 0000000000..42950618b6
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/server/main.js
@@ -0,0 +1,3 @@
+import '../imports/api/fixtures'
+import '../imports/api/methods'
+import '../imports/api/publications'
diff --git a/tools/static-assets/skel-vue-2/tests/main.js b/tools/static-assets/skel-vue-2/tests/main.js
new file mode 100644
index 0000000000..6d2a32e09d
--- /dev/null
+++ b/tools/static-assets/skel-vue-2/tests/main.js
@@ -0,0 +1,20 @@
+import assert from "assert";
+
+describe("skel", function () {
+ it("package.json has correct name", async function () {
+ const { name } = await import("../package.json");
+ assert.strictEqual(name, "skel");
+ });
+
+ if (Meteor.isClient) {
+ it("client is not server", function () {
+ assert.strictEqual(Meteor.isServer, false);
+ });
+ }
+
+ if (Meteor.isServer) {
+ it("server is not client", function () {
+ assert.strictEqual(Meteor.isClient, false);
+ });
+ }
+});
diff --git a/tools/static-assets/skel-vue/.meteor/.finished-upgraders b/tools/static-assets/skel-vue/.meteor/.finished-upgraders
new file mode 100644
index 0000000000..c07b6ff75a
--- /dev/null
+++ b/tools/static-assets/skel-vue/.meteor/.finished-upgraders
@@ -0,0 +1,19 @@
+# This file contains information which helps Meteor properly upgrade your
+# app when you run 'meteor update'. You should check it into version control
+# with your project.
+
+notices-for-0.9.0
+notices-for-0.9.1
+0.9.4-platform-file
+notices-for-facebook-graph-api-2
+1.2.0-standard-minifiers-package
+1.2.0-meteor-platform-split
+1.2.0-cordova-changes
+1.2.0-breaking-changes
+1.3.0-split-minifiers-package
+1.4.0-remove-old-dev-bundle-link
+1.4.1-add-shell-server-package
+1.4.3-split-account-service-packages
+1.5-add-dynamic-import-package
+1.7-split-underscore-from-meteor-base
+1.8.3-split-jquery-from-blaze
diff --git a/tools/static-assets/skel-vue/.meteor/.id b/tools/static-assets/skel-vue/.meteor/.id
new file mode 100644
index 0000000000..dd363b2513
--- /dev/null
+++ b/tools/static-assets/skel-vue/.meteor/.id
@@ -0,0 +1,7 @@
+# This file contains a token that is unique to your project.
+# Check it into your repository along with the rest of this directory.
+# It can be used for purposes such as:
+# - ensuring you don't accidentally deploy one app on top of another
+# - providing package authors with aggregated statistics
+
+kdvkjcf9nja.gpp7f6ll7w7a
diff --git a/tools/static-assets/skel-vue/.meteor/packages b/tools/static-assets/skel-vue/.meteor/packages
index 83be6b3a62..2565a5fe32 100644
--- a/tools/static-assets/skel-vue/.meteor/packages
+++ b/tools/static-assets/skel-vue/.meteor/packages
@@ -4,21 +4,18 @@
# 'meteor add' and 'meteor remove' will edit this file for you,
# but you can also edit it by hand.
-meteor-base # Packages every Meteor app needs to have
-mobile-experience # Packages for a great mobile UX
-mongo # The database Meteor supports right now
-reactive-var # Reactive variable for tracker
+meteor-base@1.5.1 # Packages every Meteor app needs to have
+mobile-experience@1.1.0 # Packages for a great mobile UX
+mongo@1.16.0 # The database Meteor supports right now
+reactive-var@1.0.11 # Reactive variable for tracker
-standard-minifier-css # CSS minifier run for production mode
-standard-minifier-js # JS minifier run for production mode
-es5-shim # ECMAScript 5 compatibility for older browsers
-ecmascript # Enable ECMAScript2015+ syntax in app code
-typescript # Enable TypeScript syntax in .ts and .tsx modules
-shell-server # Server-side component of the `meteor shell` command
+standard-minifier-css@1.8.2 # CSS minifier run for production mode
+standard-minifier-js@2.8.1 # JS minifier run for production mode
+es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers
+ecmascript@0.16.2 # Enable ECMAScript2015+ syntax in app code
+typescript@4.5.4 # Enable TypeScript syntax in .ts and .tsx modules
+shell-server@0.5.0 # Server-side component of the `meteor shell` command
+hot-module-replacement@0.5.1 # Update client in development without reloading the page
-tracker # Dependency tracker to allow reactive callbacks
-static-html # Define static page content in .html files
-akryum:vue-component # Vue-CLI template to publish components
-
-meteortesting:mocha # A package for writing and running your meteor app and package tests with mocha
-johanbrook:publication-collector # Test a Meteor publication by collecting its output
+static-html@1.3.2 # Define static page content in .html files
+vite:bundler
diff --git a/tools/static-assets/skel-vue/.meteor/release b/tools/static-assets/skel-vue/.meteor/release
new file mode 100644
index 0000000000..1d2a6d0f79
--- /dev/null
+++ b/tools/static-assets/skel-vue/.meteor/release
@@ -0,0 +1 @@
+METEOR@2.8.0
diff --git a/tools/static-assets/skel-vue/.meteor/versions b/tools/static-assets/skel-vue/.meteor/versions
new file mode 100644
index 0000000000..3b89f7359b
--- /dev/null
+++ b/tools/static-assets/skel-vue/.meteor/versions
@@ -0,0 +1,71 @@
+allow-deny@1.1.1
+autoupdate@1.8.0
+babel-compiler@7.9.2
+babel-runtime@1.5.1
+base64@1.0.12
+binary-heap@1.0.11
+blaze-tools@1.1.3
+boilerplate-generator@1.7.1
+caching-compiler@1.2.2
+caching-html-compiler@1.2.1
+callback-hook@1.4.0
+check@1.3.1
+ddp@1.4.0
+ddp-client@2.6.0
+ddp-common@1.4.0
+ddp-server@2.6.0
+diff-sequence@1.1.1
+dynamic-import@0.7.2
+ecmascript@0.16.2
+ecmascript-runtime@0.8.0
+ecmascript-runtime-client@0.12.1
+ecmascript-runtime-server@0.11.0
+ejson@1.1.2
+es5-shim@4.8.0
+fetch@0.1.1
+geojson-utils@1.0.10
+hot-code-push@1.0.4
+hot-module-replacement@0.5.1
+html-tools@1.1.3
+htmljs@1.1.1
+id-map@1.1.1
+inter-process-messaging@0.1.1
+launch-screen@1.3.0
+logging@1.3.1
+meteor@1.10.1
+meteor-base@1.5.1
+minifier-css@1.6.1
+minifier-js@2.7.5
+minimongo@1.9.0
+mobile-experience@1.1.0
+mobile-status-bar@1.1.0
+modern-browsers@0.1.8
+modules@0.19.0
+modules-runtime@0.13.0
+modules-runtime-hot@0.14.0
+mongo@1.16.0
+mongo-decimal@0.1.3
+mongo-dev-server@1.1.0
+mongo-id@1.0.8
+npm-mongo@4.9.0
+ordered-dict@1.1.0
+promise@0.12.0
+random@1.2.0
+react-fast-refresh@0.2.3
+reactive-var@1.0.11
+reload@1.3.1
+retry@1.1.0
+routepolicy@1.1.1
+shell-server@0.5.0
+socket-stream-client@0.5.0
+spacebars-compiler@1.3.1
+standard-minifier-css@1.8.2
+standard-minifier-js@2.8.1
+static-html@1.3.2
+templating-tools@1.2.2
+tracker@1.2.0
+typescript@4.5.4
+underscore@1.0.10
+vite:bundler@0.1.9
+webapp@1.13.1
+webapp-hashing@1.1.0
diff --git a/tools/static-assets/skel-vue/README.md b/tools/static-assets/skel-vue/README.md
new file mode 100644
index 0000000000..7ba6226cb0
--- /dev/null
+++ b/tools/static-assets/skel-vue/README.md
@@ -0,0 +1,19 @@
+# Meteor + Vue3 + Vite
+
+This is a simple example of how to use Vue3 with Meteor.
+
+## How to use
+
+1. Clone this repo
+2. Run `meteor npm install`
+3. Run `meteor`
+4. Open `http://localhost:3000` in your browser
+
+## Libraries used
+
+- [Vue3](https://v3.vuejs.org/)
+- [Vite](https://vitejs.dev/)
+- [Vue Router](https://next.router.vuejs.org/)
+- [Meteor](https://www.meteor.com/)
+- [Vue Meteor Tracker](https://github.com/meteor-vue/vue-meteor-tracker)
+- [Tailwind CSS](https://tailwindcss.com/)
diff --git a/tools/static-assets/skel-vue/client/main.css b/tools/static-assets/skel-vue/client/main.css
new file mode 100644
index 0000000000..b5c61c9567
--- /dev/null
+++ b/tools/static-assets/skel-vue/client/main.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/tools/static-assets/skel-vue/client/main.html b/tools/static-assets/skel-vue/client/main.html
index 99c3dfb74c..9e2393399c 100644
--- a/tools/static-assets/skel-vue/client/main.html
+++ b/tools/static-assets/skel-vue/client/main.html
@@ -1,7 +1,16 @@
~name~
+
+
+
+
+
+ You need to enable JavaScript to run this app.
diff --git a/tools/static-assets/skel-vue/client/main.js b/tools/static-assets/skel-vue/client/main.js
index 665c6aa1b1..97d382a9bd 100644
--- a/tools/static-assets/skel-vue/client/main.js
+++ b/tools/static-assets/skel-vue/client/main.js
@@ -1,12 +1 @@
-import Vue from 'vue'
-
-import '../imports/ui/plugins'
-
-import App from '../imports/ui/App.vue'
-
-Meteor.startup(() => {
- new Vue({
- el: '#app',
- ...App,
- })
-})
+// main entry point is in imports/ui/main.jsx
diff --git a/tools/static-assets/skel-vue/imports/api/links.js b/tools/static-assets/skel-vue/imports/api/links.js
new file mode 100644
index 0000000000..4e98fcca62
--- /dev/null
+++ b/tools/static-assets/skel-vue/imports/api/links.js
@@ -0,0 +1,10 @@
+import { Meteor } from 'meteor/meteor'
+import { Mongo } from 'meteor/mongo'
+
+export const LinksCollection = new Mongo.Collection('links')
+
+if (Meteor.isServer) {
+ Meteor.publish('links', function () {
+ return LinksCollection.find({})
+ })
+}
diff --git a/tools/static-assets/skel-vue/imports/ui/About.vue b/tools/static-assets/skel-vue/imports/ui/About.vue
new file mode 100644
index 0000000000..d1ba384f1b
--- /dev/null
+++ b/tools/static-assets/skel-vue/imports/ui/About.vue
@@ -0,0 +1,5 @@
+
+ About Page
+
+ This is the about page.
+
diff --git a/tools/static-assets/skel-vue/imports/ui/App.vue b/tools/static-assets/skel-vue/imports/ui/App.vue
index e126098ccb..7a775391cb 100644
--- a/tools/static-assets/skel-vue/imports/ui/App.vue
+++ b/tools/static-assets/skel-vue/imports/ui/App.vue
@@ -1,26 +1,10 @@
-
-
-
Welcome to Meteor!
-
-
-
-
-
-
-
+
+
+
diff --git a/tools/static-assets/skel-vue/imports/ui/AppMenu.vue b/tools/static-assets/skel-vue/imports/ui/AppMenu.vue
new file mode 100644
index 0000000000..5b1997efec
--- /dev/null
+++ b/tools/static-assets/skel-vue/imports/ui/AppMenu.vue
@@ -0,0 +1,6 @@
+
+
+ Home
+ About
+
+
diff --git a/tools/static-assets/skel-vue/imports/ui/Hello.vue b/tools/static-assets/skel-vue/imports/ui/Hello.vue
new file mode 100644
index 0000000000..ebe691f4d2
--- /dev/null
+++ b/tools/static-assets/skel-vue/imports/ui/Hello.vue
@@ -0,0 +1,16 @@
+
+
+
+ Click Me
+
+ You've pressed the button {{ count }} times.
+
+
diff --git a/tools/static-assets/skel-vue/imports/ui/Home.vue b/tools/static-assets/skel-vue/imports/ui/Home.vue
new file mode 100644
index 0000000000..0473845661
--- /dev/null
+++ b/tools/static-assets/skel-vue/imports/ui/Home.vue
@@ -0,0 +1,10 @@
+
+
+
+ Welcome to Meteor!
+
+
+
diff --git a/tools/static-assets/skel-vue/imports/ui/Info.vue b/tools/static-assets/skel-vue/imports/ui/Info.vue
new file mode 100644
index 0000000000..5a17339c53
--- /dev/null
+++ b/tools/static-assets/skel-vue/imports/ui/Info.vue
@@ -0,0 +1,16 @@
+
+
+
+ Learn Meteor!
+
+
diff --git a/tools/static-assets/skel-vue/imports/ui/main.js b/tools/static-assets/skel-vue/imports/ui/main.js
new file mode 100644
index 0000000000..e3500841ea
--- /dev/null
+++ b/tools/static-assets/skel-vue/imports/ui/main.js
@@ -0,0 +1,13 @@
+import { Meteor } from 'meteor/meteor'
+import { createApp } from 'vue'
+import { VueMeteor } from 'vue-meteor-tracker'
+
+import App from './App.vue'
+import { router } from './router'
+
+Meteor.startup(() => {
+ const app = createApp(App)
+ app.use(router)
+ app.use(VueMeteor)
+ app.mount('#app')
+})
diff --git a/tools/static-assets/skel-vue/imports/ui/router.js b/tools/static-assets/skel-vue/imports/ui/router.js
new file mode 100644
index 0000000000..7768ef4894
--- /dev/null
+++ b/tools/static-assets/skel-vue/imports/ui/router.js
@@ -0,0 +1,18 @@
+import { createRouter, createWebHistory } from 'vue-router'
+import Home from './Home.vue'
+
+export const router = createRouter({
+ history: createWebHistory(),
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: Home,
+ },
+ {
+ path: '/about',
+ name: 'about',
+ component: () => import('./About.vue'),
+ },
+ ],
+})
diff --git a/tools/static-assets/skel-vue/package.json b/tools/static-assets/skel-vue/package.json
index e8cfe3ee72..f8dc1cace8 100644
--- a/tools/static-assets/skel-vue/package.json
+++ b/tools/static-assets/skel-vue/package.json
@@ -3,6 +3,7 @@
"private": true,
"scripts": {
"start": "meteor run",
+ "build": "meteor build ../output/vue --directory",
"test": "meteor test --once --driver-package meteortesting:mocha",
"test-app": "TEST_WATCH=1 meteor test --full-app --driver-package meteortesting:mocha",
"visualize": "meteor --production --extra-packages bundle-visualizer"
@@ -10,8 +11,9 @@
"dependencies": {
"@babel/runtime": "^7.17.9",
"meteor-node-stubs": "^1.2.1",
- "vue": "^2.6.14",
- "vue-meteor-tracker": "^2.0.0-beta.5"
+ "vue": "^3.2.45",
+ "vue-meteor-tracker": "^3.0.0-beta.7",
+ "vue-router": "^4.1.6"
},
"meteor": {
"mainModule": {
@@ -19,5 +21,13 @@
"server": "server/main.js"
},
"testModule": "tests/main.js"
+ },
+ "devDependencies": {
+ "@types/meteor": "^2.8.1",
+ "@vitejs/plugin-vue": "^3.2.0",
+ "autoprefixer": "^10.4.13",
+ "postcss": "^8.4.19",
+ "tailwindcss": "^3.2.4",
+ "vite": "^3.2.3"
}
}
diff --git a/tools/static-assets/skel-vue/postcss.config.js b/tools/static-assets/skel-vue/postcss.config.js
new file mode 100644
index 0000000000..33ad091d26
--- /dev/null
+++ b/tools/static-assets/skel-vue/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/tools/static-assets/skel-vue/server/main.js b/tools/static-assets/skel-vue/server/main.js
index 42950618b6..44f7bc045b 100644
--- a/tools/static-assets/skel-vue/server/main.js
+++ b/tools/static-assets/skel-vue/server/main.js
@@ -1,3 +1,31 @@
-import '../imports/api/fixtures'
-import '../imports/api/methods'
-import '../imports/api/publications'
+import { Meteor } from 'meteor/meteor'
+import { LinksCollection } from '/imports/api/links'
+
+async function insertLink({ title, url }) {
+ await LinksCollection.insertAsync({ title, url, createdAt: new Date() })
+}
+
+Meteor.startup(async () => {
+ // If the Links collection is empty, add some data.
+ if ((await LinksCollection.find().countAsync()) === 0) {
+ await insertLink({
+ title: 'Do the Tutorial',
+ url: 'https://www.solidjs.com/tutorial/introduction_basics',
+ })
+
+ await insertLink({
+ title: 'Follow the Guide',
+ url: 'https://guide.meteor.com',
+ })
+
+ await insertLink({
+ title: 'Read the Docs',
+ url: 'https://docs.meteor.com',
+ })
+
+ await insertLink({
+ title: 'Discussions',
+ url: 'https://forums.meteor.com',
+ })
+ }
+})
diff --git a/tools/static-assets/skel-vue/tailwind.config.js b/tools/static-assets/skel-vue/tailwind.config.js
new file mode 100644
index 0000000000..72c950fc84
--- /dev/null
+++ b/tools/static-assets/skel-vue/tailwind.config.js
@@ -0,0 +1,8 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: ['./imports/ui/**/*.{vue,js,ts,jsx,tsx}', './client/*.html'],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+}
diff --git a/tools/static-assets/skel-vue/tests/main.js b/tools/static-assets/skel-vue/tests/main.js
index 6d2a32e09d..086819d896 100644
--- a/tools/static-assets/skel-vue/tests/main.js
+++ b/tools/static-assets/skel-vue/tests/main.js
@@ -1,20 +1,20 @@
-import assert from "assert";
+import assert from 'assert'
-describe("skel", function () {
- it("package.json has correct name", async function () {
- const { name } = await import("../package.json");
- assert.strictEqual(name, "skel");
- });
+describe('vue-skeleton', function () {
+ it('package.json has correct name', async function () {
+ const { name } = await import('../package.json')
+ assert.strictEqual(name, 'vue-skeleton')
+ })
if (Meteor.isClient) {
- it("client is not server", function () {
- assert.strictEqual(Meteor.isServer, false);
- });
+ it('client is not server', function () {
+ assert.strictEqual(Meteor.isServer, false)
+ })
}
if (Meteor.isServer) {
- it("server is not client", function () {
- assert.strictEqual(Meteor.isClient, false);
- });
+ it('server is not client', function () {
+ assert.strictEqual(Meteor.isClient, false)
+ })
}
-});
+})
diff --git a/tools/static-assets/skel-vue/vite.config.js b/tools/static-assets/skel-vue/vite.config.js
new file mode 100644
index 0000000000..d3aeaa9aba
--- /dev/null
+++ b/tools/static-assets/skel-vue/vite.config.js
@@ -0,0 +1,12 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+
+export default defineConfig({
+ plugins: [vue()],
+ meteor: {
+ clientEntry: 'imports/ui/main.js',
+ },
+ optimizeDeps: {
+ exclude: ['vue-meteor-tracker'],
+ },
+})
diff --git a/tools/tsconfig.json b/tools/tsconfig.json
index 234b36f9bc..88e1ef394b 100644
--- a/tools/tsconfig.json
+++ b/tools/tsconfig.json
@@ -29,6 +29,7 @@
"exclude": [
"./tests/apps/**",
"./tests/packages/**",
- "./static-assets/skel*/**"
+ "./static-assets/skel*/**",
+ "./static-assets/scaffolds*/**",
]
}
diff --git a/tools/utils/buildmessage.js b/tools/utils/buildmessage.js
index 0d468624c1..48cbec19c4 100644
--- a/tools/utils/buildmessage.js
+++ b/tools/utils/buildmessage.js
@@ -75,7 +75,7 @@ Object.assign(Job.prototype, {
}
line += ": ";
} else {
- // not sure how to display messages without a filenanme.. try this?
+ // not sure how to display messages without a file name.. try this?
line += "error: ";
}
// XXX line wrapping would be nice..