diff --git a/.circleci/config.yml b/.circleci/config.yml index 646dbbd5083..61390230e97 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -79,7 +79,7 @@ run_save_node_bin: &run_save_node_bin build_machine_environment: &build_machine_environment # Specify that we want an actual machine (ala Circle 1.0), not a Docker image. docker: - - image: meteor/circleci:android-30-node-18 + - image: meteor/circleci:2023.12.1-android-34-node-18 resource_class: large environment: # This multiplier scales the waitSecs for selftests. @@ -178,7 +178,7 @@ jobs: command: | eval $PRE_TEST_COMMANDS; cd dev_bundle/lib - ../../meteor npm install @types/node@18.11.9 --save-dev + ../../meteor npm install @types/node@20.10.5 --save-dev # Ensure that meteor/tools has no TypeScript errors. ../../meteor npm install -g typescript cd ../../ @@ -390,7 +390,7 @@ jobs: ./meteor self-test \ "$TEST_GROUP" \ --retries ${METEOR_SELF_TEST_RETRIES} \ - --exclude "${SELF_TEST_EXCLUDE}|--svelte|--vue|--typescript|--apollo|--solid|--full" \ + --exclude "${SELF_TEST_EXCLUDE}" \ --headless \ --junit ./tmp/results/junit/3.xml \ --without-tag "custom-warehouse" @@ -474,7 +474,7 @@ jobs: ./meteor self-test \ "$TEST_GROUP" \ --retries ${METEOR_SELF_TEST_RETRIES} \ - --exclude "${SELF_TEST_EXCLUDE}|modules - test app" \ + --exclude "${SELF_TEST_EXCLUDE}" \ --headless \ --junit ./tmp/results/junit/5.xml \ --without-tag "custom-warehouse" @@ -750,7 +750,7 @@ jobs: Docs: docker: # This Node version should match that in the meteor/docs CircleCI config. - - image: meteor/circleci:android-28-node-12 + - image: meteor/circleci:2023.12.1-android-34-node-20 resource_class: large environment: CHECKOUT_METEOR_DOCS: /home/circleci/test_docs diff --git a/.envrc b/.envrc new file mode 100644 index 00000000000..53f0a135439 --- /dev/null +++ b/.envrc @@ -0,0 +1,32 @@ +#!/bin/env zsh + +# +# Commands and shortcuts for Meteor core development, you can load these in your terminal by running `source .envrc`. +# Or by adding `[[ -s .envrc ]] && source .envrc` to your `.zshrc` or `.bashrc`. +# + +export ROOT_DIR=$(git rev-parse --show-toplevel) + +function @meteor { + "$ROOT_DIR/meteor" "$@" +} + +function @test-package { + @meteor test-packages "$@" --exclude-archs=web.browser.legacy,web.cordova +} + +function @test-packages { + TINYTEST_FILTER="$1" @meteor test-packages --exclude-archs=web.browser.legacy,web.cordova +} + +function @test-self { + @meteor self-test "$@" +} + +function @check-syntax { + node "$ROOT_DIR/scripts/admin/check-legacy-syntax/check-syntax.js" +} + +function @generate-dev-bundle { + "$ROOT_DIR/scripts/generate-dev-bundle.sh" +} \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000000..b1cb7a75afe --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +@henriquealbert @denihs @fredmaiaarantes @nachocodoner diff --git a/.github/workflows/check-code-style.yml b/.github/workflows/check-code-style.yml index 0a136db59a6..5b7dbbac4c2 100644 --- a/.github/workflows/check-code-style.yml +++ b/.github/workflows/check-code-style.yml @@ -11,9 +11,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: - node-version: 14.x + node-version: 20.x - run: npm ci - name: Run ESLint@8 run: npx eslint@8 "./npm-packages/meteor-installer/**/*.js" diff --git a/.github/workflows/check-syntax.yml b/.github/workflows/check-syntax.yml index 91051b27893..1f9f151c942 100644 --- a/.github/workflows/check-syntax.yml +++ b/.github/workflows/check-syntax.yml @@ -7,9 +7,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: 20.x - run: cd scripts/admin/check-legacy-syntax && npm ci - name: Check syntax - run: cd scripts/admin/check-legacy-syntax && node check-syntax.js + run: cd scripts/admin/check-legacy-syntax && node check-syntax.js diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 3c7f7d5ec93..dc85db922f3 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -11,13 +11,13 @@ jobs: working-directory: docs/ steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 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.4 + uses: nwtgck/actions-netlify@v2.1.0 with: publish-dir: './docs/public/' production-branch: devel diff --git a/.github/workflows/guide.yml b/.github/workflows/guide.yml index bbc5bbd0239..f485145f188 100644 --- a/.github/workflows/guide.yml +++ b/.github/workflows/guide.yml @@ -11,13 +11,13 @@ jobs: working-directory: guide/ steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 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.4 + uses: nwtgck/actions-netlify@v2.1.0 with: publish-dir: './guide/public' production-branch: devel diff --git a/.github/workflows/meteor-selftest-windows.yml b/.github/workflows/meteor-selftest-windows.yml new file mode 100644 index 00000000000..eed1b2b1b8a --- /dev/null +++ b/.github/workflows/meteor-selftest-windows.yml @@ -0,0 +1,55 @@ +name: Meteor Selftest Windows + +on: + pull_request: + types: + - opened + - reopened + - synchronize + branches: + - release-3.0 + push: + branches: + - release-3.0 + +env: + METEOR_PRETTY_OUTPUT: 0 + SELF_TEST_TOOL_NODE_FLAGS: ' ' + TOOL_NODE_FLAGS: --expose-gc + TIMEOUT_SCALE_FACTOR: 20 + METEOR_HEADLESS: true + SELF_TEST_EXCLUDE: '^NULL-LEAVE-THIS-HERE-NULL$' + +jobs: + test: + runs-on: windows-2019-meteor + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: 20.x + + - name: Install dependencies + shell: pwsh + run: | + $env:PATH = "C:\Program Files\7-Zip;$env:PATH" + .\scripts\windows\ci\install.ps1 + + - name: Run tests + shell: pwsh + run: | + $env:PATH = "C:\Program Files\7-Zip;$env:PATH" + .\scripts\windows\ci\test.ps1 + + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: | + .\dev_bundle + .\.babel-cache + .\.meteor + key: ${{ runner.os }}-meteor-${{ hashFiles('**/package-lock.json') }} diff --git a/.github/workflows/npm-eslint-plugin-meteor.yml b/.github/workflows/npm-eslint-plugin-meteor.yml index 4361b5a7882..29a72f00054 100644 --- a/.github/workflows/npm-eslint-plugin-meteor.yml +++ b/.github/workflows/npm-eslint-plugin-meteor.yml @@ -16,15 +16,12 @@ jobs: defaults: run: working-directory: npm-packages/eslint-plugin-meteor - strategy: - matrix: - node-version: [16.x, 18.x] steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: 20.x cache: npm - run: npm ci - run: npm test diff --git a/.github/workflows/npm-meteor-babel.yml b/.github/workflows/npm-meteor-babel.yml index f9dc6f3a5fb..61bb203ccb6 100644 --- a/.github/workflows/npm-meteor-babel.yml +++ b/.github/workflows/npm-meteor-babel.yml @@ -16,15 +16,12 @@ jobs: defaults: run: working-directory: npm-packages/meteor-babel - strategy: - matrix: - node-version: [16.x, 18.x] steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: 14.x cache: npm - run: npm ci - run: npm run test diff --git a/.github/workflows/npm-meteor-promise.yml b/.github/workflows/npm-meteor-promise.yml index 4ad4f6df7c1..4eb16400a13 100644 --- a/.github/workflows/npm-meteor-promise.yml +++ b/.github/workflows/npm-meteor-promise.yml @@ -18,11 +18,11 @@ jobs: working-directory: npm-packages/meteor-promise strategy: matrix: - node-version: [12.x, 14.x] + node-version: [14.x] steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: npm diff --git a/.gitmodules b/.gitmodules index 17644a42a4a..59b70023f1d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,7 @@ [submodule "packages/non-core/blaze"] path = packages/non-core/blaze - url = https://github.com/meteor/blaze.git \ No newline at end of file + url = https://github.com/meteor/blaze.git +[submodule "npm-packages/cordova-plugin-meteor-webapp/src/ios/GCDWebServer"] + path = npm-packages/cordova-plugin-meteor-webapp/src/ios/GCDWebServer + url = https://github.com/meteor/GCDWebServer.git + branch = master diff --git a/.travis.yml b/.travis.yml index 860714f5170..339caa097b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ dist: jammy sudo: required services: xvfb node_js: - - "18.16.0" + - "20.10.0" cache: directories: - ".meteor" diff --git a/README.md b/README.md index 16f6d2fc291..ac907ba92b9 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,9 @@ [![Travis CI Status](https://api.travis-ci.com/meteor/meteor.svg?branch=devel)](https://app.travis-ci.com/github/meteor/meteor) [![CircleCI Status](https://circleci.com/gh/meteor/meteor.svg?style=svg)](https://app.circleci.com/pipelines/github/meteor/meteor?branch=devel) -[![built with Meteor](https://img.shields.io/badge/Meteor-2.13.3-green?logo=meteor&logoColor=white)](https://meteor.com) +[![built with Meteor](https://img.shields.io/badge/Meteor-2.15-green?logo=meteor&logoColor=white)](https://meteor.com) +[![built with Meteor](https://img.shields.io/badge/Meteor-3.0_RC-yellow?logo=meteor&logoColor=white)](https://guide.meteor.com/3.0-migration) + @@ -46,7 +48,7 @@ Use the same code whether you’re developing for web, iOS, Android, or desktop # πŸ”₯ Getting Started -How about trying a getting started tutorial in your favorite technology? +How about trying a tutorial to get started with your favorite technology? | [ React](https://react-tutorial.meteor.com/) | | - | @@ -82,7 +84,7 @@ meteor **Building an application with Meteor?** * Deploy on [Meteor Cloud](https://www.meteor.com/cloud) -* Discussion [Forums](https://forums.meteor.com/) +* Discuss on [Forums](https://forums.meteor.com/) * Join the Meteor community Slack by clicking this [invite link](https://join.slack.com/t/meteor-community/shared_invite/enQtODA0NTU2Nzk5MTA3LWY5NGMxMWRjZDgzYWMyMTEyYTQ3MTcwZmU2YjM5MTY3MjJkZjQ0NWRjOGZlYmIxZjFlYTA5Mjg4OTk3ODRiOTc). * Announcement list. Subscribe in the [footer](https://www.meteor.com/). @@ -94,4 +96,14 @@ Interested in helping or contributing to Meteor? These resources will help: * [Feature requests](https://github.com/meteor/meteor/discussions/) * [Issue tracker](https://github.com/meteor/meteor/issues) -To uninstall Meteor [read here](https://docs.meteor.com/install.html#uninstall). +To uninstall Meteor: + - If installed via npm, run: + ```shell + meteor-installer uninstall + ``` + - If installed via curl, run: + ```shell + rm -rf ~/.meteor + sudo rm /usr/local/bin/meteor + ``` +To find more information about installation, [read here](https://docs.meteor.com/install.html#uninstall). diff --git a/SECURITY.md b/SECURITY.md index 3d2a49b4454..278969b992f 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -5,8 +5,7 @@ | Version | Support Status | ------- | -------------- | 2.x.y | βœ… all security issues -| 1.12.x | 🚧 only critical security issues -| <= 1.11.x | ❌ no longer supportted +| <= 1.12.x | ❌ no longer supported ## Reporting a Vulnerability diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index de63e8fd72f..00000000000 --- a/appveyor.yml +++ /dev/null @@ -1,47 +0,0 @@ -version: '{build}' - -branches: - except: - - /^dev-bundle-/ - -skip_branch_with_pr: true - -clone_folder: C:\projects\meteor -image: Visual Studio 2019 - -environment: - METEOR_PRETTY_OUTPUT: 0 - SELF_TEST_TOOL_NODE_FLAGS: " " - TOOL_NODE_FLAGS: --expose-gc - TIMEOUT_SCALE_FACTOR: 8 - METEOR_HEADLESS: true - SELF_TEST_EXCLUDE: "^NULL-LEAVE-THIS-HERE-NULL$" -platform: - - x64 - -matrix: - fast_finish: true - allow_failures: - - platform: x64 - -# We don't need the actual "build", just the tests. -build: off - -install: - - ps: C:\projects\meteor\scripts\windows\appveyor\install.ps1 - -test_script: - - ps: C:\projects\meteor\scripts\windows\appveyor\test.ps1 - -on_failure: - - ps: | - $npmLogsDir = "$($Env:AppData)\npm-cache\_logs" - If (Test-Path "$npmLogsDir") { - Get-ChildItem "${npmLogsDir}\*.log" | - % { Push-AppveyorArtifact $_.FullName -FileName $_.Name } - } - -cache: - - dev_bundle -> meteor - - .babel-cache -> meteor - - .meteor diff --git a/docs/_config.yml b/docs/_config.yml index 3ed0db2c678..0556242aac4 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,6 +1,8 @@ title: Meteor API Docs subtitle: API Docs versions: + - '2.16' + - '2.14' - '2.13' - '2.12' - '2.11' diff --git a/docs/generators/changelog/EXAMPLE.MD b/docs/generators/changelog/EXAMPLE.MD index c2a7ff6989c..dffc0f018cc 100644 --- a/docs/generators/changelog/EXAMPLE.MD +++ b/docs/generators/changelog/EXAMPLE.MD @@ -1,36 +1,50 @@ ## vX.XX.X, 2023-XX-XX -### Highlights - +## Highlights +List the most important changes to catch people's attention. +Are there breaking changes? Mention it here and link them. +Are there exciting new features? Mention it here and link them. +For example: * MongoDB Server 6.x Support * Embedded Mongo now uses MongoDB 6.0.3 -* Some pr [GH someone] [PR #number] // this will become -> [someone](https://github.com/someone) [PR](https://github.com/meteor/meteor/pull/number) -#### Breaking Changes - -N/A -#### Internal API changes -N/A +## Migration Steps +Steps to migrate to this version. If it's a long one, we should have a migration guide page. -#### Migration Steps - -TODO +## New Features +- Feature 1 description. PR Link. +- Feature 2 description. PR Link. +- Some feature. pr [GH someone] [PR #number] // this will become -> [someone](https://github.com/someone) [PR](https://github.com/meteor/meteor/pull/number) +- `Command line`: + - Added feature X +## Patch changes +- Patch Change 1 description. PR Link. +- Patch Change 2 description. PR Link. +- `npm mongo @4.13.0`: // You can use @get-version to get the version of the package + - Updated MongoDB driver to version 4.13.0 -#### Meteor Version Release +## Breaking Changes +- Breaking change 1. +- Breaking change 1. +* `fetch@get-version`: + - X has changed -* `Command line`: - - Corrected typo in XX XX +## Docs +- Docs change 1. +- Docs change 2. -* `npm mongo @4.13.0`: // You can use @get-version to get the version of the package - - Updated MongoDB driver to version 4.13.0 +## Core dependencies +Core dependency change 1. +Core dependency change 2. -#### Special thanks to +## Dependencies +Dependency change 1. +Dependency change 2. +## Contributors +- Contributor 1. - [@XXX](https://github.com/XXXX). - For making this great framework even better! - - diff --git a/docs/generators/changelog/script.js b/docs/generators/changelog/script.js index e0701bae1e3..5050630dc8e 100755 --- a/docs/generators/changelog/script.js +++ b/docs/generators/changelog/script.js @@ -75,7 +75,8 @@ const main = async () => { // already have the contribuitors thanks in the file if ( - file.includes("#### Special thanks to") || + file.includes('## Contributors') || + file.includes("#### Special thanks to") || // this must stay here for legacy reasons file.includes("[//]: # (Do not edit this file by hand.)") ) return file; @@ -85,7 +86,7 @@ const main = async () => { .map((name) => `- [@${name}](https://github.com/${name}).`) .join("\n"); - const doneFile = `${file}\n\n#### Special thanks to\n\n${contribuitorsList}\n\n`; + const doneFile = `${file}\n\n## Contributors\n\n${contribuitorsList}\n\n`; //SIDE EFFECTS // so that this is not ran every time, we will update the last file. diff --git a/docs/generators/changelog/versions/0-before-2.10.md b/docs/generators/changelog/versions/0-before-2.10.md index 9ee0122e336..1774e87739f 100644 --- a/docs/generators/changelog/versions/0-before-2.10.md +++ b/docs/generators/changelog/versions/0-before-2.10.md @@ -441,7 +441,7 @@ N/A * `mongo@1.15.0` - New option `Meteor.settings.packages.mongo.reCreateIndexOnOptionMismatch` for case when an index with the same name, but different options exists it will be re-created. - - If there is an error on index creation Meteor will output a better message naming the collection and index where the error occured. [PR](https://github.com/meteor/meteor/pull/11995). + - If there is an error on index creation Meteor will output a better message naming the collection and index where the error occurred. [PR](https://github.com/meteor/meteor/pull/11995). * `modern-browsers@0.1.8` - New api `getMinimumBrowserVersions` to access the `minimumBrowserVersions`. [PR](https://github.com/meteor/meteor/pull/11998). * `socket-stream-client@0.5.0` @@ -656,7 +656,7 @@ Read our [Migration Guide](https://guide.meteor.com/2.6-migration.html) for this - useUnifiedTopology is not an option anymore, it defaults to true. - native parser is not an option anymore, it defaults to false in the mongo connection. - poolSize not an option anymore, we are using max/minPoolSize for the same behavior on mongo connection. - - fields option is deprecated, we are maintaining a translation layer to "projection" field (now prefered) until the next minor version, where we will start showing alerts. + - fields option is deprecated, we are maintaining a translation layer to "projection" field (now preferred) until the next minor version, where we will start showing alerts. - _ensureIndex is now showing a deprecation message - we are maintaining a translation layer for the new oplog format, so if you read or rely on any behavior of it please read our oplog_v2_converter.js code - update/insert/remove behavior is maintained in the Meteor way, documented in our docs, but we are now using replaceOne/updateOne/updateMany internally. This is subject to changes in the API rewrite of MongoDB without Fibers AND if you are using rawCollection directly you have to review your methods otherwise you will see deprecation messages if you are still using the old mongodb style directly. diff --git a/docs/generators/changelog/versions/2.14.md b/docs/generators/changelog/versions/2.14.md new file mode 100644 index 00000000000..486c8b57d1c --- /dev/null +++ b/docs/generators/changelog/versions/2.14.md @@ -0,0 +1,229 @@ +## v2.14.0, 2023-12-12 + +### Highlights + +Hacktoberfest release! πŸŽ‰ + +* MongoDB driver has been updated to v4.17.2. + +* You can now set `DISABLE_SOCKJS_CORS=1` if you want to prevent SockJS from setting CORS headers. Do not set this option if you will have DDP clients from other origins connecting to the DDP server. [PR #12789] + +* Added guide on [how to prepare for Meteor 3.0 migration](https://guide.meteor.com/prepare-meteor-3.0). + +* New DDP merge strategy `NO_MERGE_MULTI`, which is similar to `NO_MERGE`, but it does track whether a document is used by multiple publications. [PR #12742] + +* Appcache has been further deprecated and moved to the deprecated packages folder. + +* Added `Accounts.createUserAsync` into the client. + +* Many packages had their underscore dependency removed. + +* Cordova has been updated to v12.0.1 for Android and v7.0.1 for iOS, being able to build to SDK 33. + +* `meteor create` command is now interactive! + +* Added `firstRunPromise` property to `Tracker` autorun blocks, that forces autorun blocks to be executed in synchronous-looking order by storing the value autorun promise thus making it awaitable. + +#### Migration Steps + +##### Android splash screen +If you have been using `splash-screen` for Cordova, you need to update your code as Android changed their splash screen API, +the `cordova-plugin-splashscreen` is now on `cordova-android` core, so we have removed the dependency from the `splash-screen` +package. As a result we are dropping the support for dark mode splash screen on Android. + +To create this now you need to create two themes on your `config.xml` file. + +> Note that it's still possible to have it by adding the according themes with App.appendToConfig and App.addResourceFile - but this is not something Meteor will do automatically right now. + +For more information you can check our [Migration Guide](https://guide.meteor.com/2.14-migration.html) + +## Breaking Changes + +* `splash-screen` package has removed the `cordova-plugin-splashscreen` dependency. See migration steps for more info. + +## Docs + +- Added guide on [how to prepare for Meteor 3.0 migration](https://guide.meteor.com/prepare-meteor-3.0). +- Added guide on [performance improvements](https://guide.meteor.com/performance-improvement). +- Added FAQ about [Meteor 3](https://guide.meteor.com/3.0-migration). + +## Internal API changes + +* Tool + - Rename `EACCESS` to `EACCES` to follow the Windows spelling + - Fixed links in skeletons + - Fixed build issue in Vue skeleton + - Updated `source-map-support` + - Fixed bugs in negated β€œin” and β€œinstanceof” expressions + - Updated `semver` to v7.5.4 + - Updated `@meteorjs/babel` to v7.18.4 + - Cordova has been updated to v12.0.1 for Android and v7.0.1 for iOS, being able to build to SDK 33. + - `meteor create` command was re-made to be more interactive + +## Meteor Version Release + +* `accounts-base@get-version` + - Ensure that `onLogin` callback fires properly + - Indexes are now created asynchronously + +* `accounts-oauth@get-version` + - Indexes are now created asynchronously + +* `accounts-password@get-version` + - Add `Accounts.createUserAsync` to the client, a promise-based version of `Accounts.createUser` + - Indexes are now created asynchronously + +* `accounts-passwordless@get-version` + - Fix #12401, ensure that user is found with ID + - Indexes are now created asynchronously + +* `babel-compiler@get-version` + - Updated `@meteorjs/babel` to v7.18.4 + +* `boilerplate-generator@get-version` + - Removed Underscore dependency + +* `browser-policy-content@get-version` + - Removed Underscore dependency + +* `constraint-solver@get-version` + - Removed Underscore dependency + +* `crosswalk@get-version` + - Updated `cordova-plugin-crosswalk-webview` to v2.4.0 + - Deprecated the package + +* `ddp-rate-limiter@get-version` + - Removed Underscore dependency +* `ddp-server@get-version`: + - Allow setting `DISABLE_SOCKJS_CORS` to prevent SockJS from setting CORS headers + - Added new publication strategy `NO_MERGE_MULTI` + +* `ecmascript@get-version`: + - Bumped to get latest version of `@babel/compiler` + +* `facebook-oauth@get-version`: + - Updated default version of Facebook GraphAPI to v17 + +* `launch-screen@get-version` + - Removed `cordova-plugin-splashscreen` dependency + +* `fetch@get-version`: + - Update `node-fetch` to version 1.6.12 + - Update `whatwg-fetch` to version 3.6.17 + +* `logging@get-version`: + - Added TS types + - Updated `chalk` to v4.1.2 + +* `logic-solver@get-version` + - Removed Underscore dependency + +* `meteor@get-version`: + - Improve TS types + +* `mobile-experience@get-version`: + - Bumped to get latests version of `cordova` dependencies + +* `modern-browsers@get-version` + - Added `appleMail` user agent to allow modern bundle on iPads + +* `modules@get-version` + - Updated version of reify to v0.24.1 + +* `mongo@get-version` + - Added deprecation messages into type definitions + - Fix ObjectIDs handling in oplogV2V1Converter + +* `npm-mongo@get-version`: + - Bumped MongoDB driver to version 4.17.2 + +* `oauth@get-version` + - Indexes are now created asynchronously + - `remove` DB calls migrated to `removeAsync` + +* `package-version-parser@get-version` + - Updated `semver` to v7.5.4 + +* `react-fast-refresh@get-version`: + - Updated `semver` to version 7.5.4 + +* `service-configuration@get-version` + - Indexes are now created asynchronously + - Add types for ConfigError + +* `socket-stream-client@get-version` + - Removed Underscore dependency + +* `standard-minifier-css@get-version` + - Updated `@babel/runtime` to v7.23.5 + - Updated `minifier-css` to v1.6.4 + - Updated `logging` package to v1.3.2 + +* `test-server-tests-in-console-once@get-version` + - Removed Underscore dependency + +* `tinytest@get-version` + - Removed Underscore dependency + +* `tracker@get-version` + - Added `firstRunPromise` property, that forces autorun blocks to be executed + in synchronous-looking order by storing the value autorun promise + thus making it awaitable + +* `typescript@get-version`: + - Updated to 4.9.5 + +* `webapp@get-version` + - Updated `cordova-plugin-meteor-webapp` to v2.0.3 + - Updated `cookie-parser` to v1.4.6 + - Updated `send` to v0.18.0 + - Updated `stream-to-string` to v1.2.1 + - Updated `qs` to v6.11.2 + - Updated `@types/connect` to v3.4.38 + + +## Independent releases + +* `google-oauth@1.4.4`: + - Remove logging request/response in google_server + +* NPM `@meteorjs/babel@7.18.4` + - Updated `@meteorjs/reify` to v0.24.1 + +* NPM `@meteorjs/babel-preset-meteor@7.10.1` + - Add Facebook in-app browser + +* NPM `cordova-plugin-meteor-webapp@2.0.2` + - Fixed Android hot code push failing + +* NPM `cordova-plugin-meteor-webapp@2.0.3` + - Fix pull manifest from correct url if parameter are used in baseurl + +* NPM `meteor-node-stubs@1.2.6` + - Update dependencies + - Deep update dependencies that were highlighted by `npm audit` + +## Contributors + +- [@StorytellerCZ](https://github.com/sponsors/StorytellerCZ) +- [@Grubba27](https://github.com/sponsors/Grubba27) +- [@vit0rr](https://github.com/vit0rr) +- [@realyze](https://github.com/realyze) +- [@jamauro](https://github.com/jamauro) +- [@Torgen](https://github.com/Torgen) +- [@brucejo75](https://github.com/brucejo75) +- [@zodern](https://github.com/sponsors/zodern) +- [@alisnic](https://github.com/alisnic) +- [@ebroder](https://github.com/ebroder) +- [@BANSAL-NISHU](https://github.com/BANSAL-NISHU) +- [@salmanhasni](https://github.com/salmanhasni) +- [@jdgjsag67251](https://github.com/jdgjsag67251) +- [@guncebektas](https://github.com/guncebektas) +- [@harryadel](https://github.com/harryadel) +- [@dd137](https://github.com/dd137) +- [@matheusccastroo](https://github.com/matheusccastroo) +- [@mr-loop-1](https://github.com/mr-loop-1) + +For making this great framework even better! + diff --git a/docs/generators/changelog/versions/2.15.0.md b/docs/generators/changelog/versions/2.15.0.md new file mode 100644 index 00000000000..c1eca4ba442 --- /dev/null +++ b/docs/generators/changelog/versions/2.15.0.md @@ -0,0 +1,57 @@ +## v2.15.0, 2024-02-05 + +### Highlights + +* Bumps embedded MongoDB to 7.0.5. + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +In development, if you're using Linux, you might get an error like `version GLIBCXX_3.4.26 not found` or something related to g++. + +This is related to your g++ version. With MongoDB 7, you need to have g++ 11 or higher. So make sure to have this updated. + +This will happen only if you are trying to run your Meteor application with a MongoDB 7 version. If you run your app with a MONGO_URL pointing to a different MongoDB version, you won't have this issue. + +```bash + +meteor update --release 2.15 + +``` + + +#### Meteor Version Release + + +* `Command line`: + - The bundle version was changed to include embedded MongoDB to 7.0.5. + - Fix cordova launch screen warnings on 2.15 [PR #12971] +* `underscore@get-version`: + - A test related to [PR #12798] to see if the tests can manage the first update step. [PR #12912] +* `service-configuration@get-version`: + - added new types* [PR #12922] +* `meteor@get-version`: + - added new types [PR #12922] +* `accounts-base@get-version`: + - Added missing type for createUserVerifyingEmail [PR #12919] + +#### Special thanks to + +- [@Grubba27](https://github.com/Grubba27). +- [@denihs](https://github.com/denihs). +- [@mcorbelli](https://github.com/mcorbelli). +- [@matheusccastroo](https://github.com/matheusccastroo). +- [@StorytellerCZ](https://github.com/StorytellerCZ). +- [@ebroder](https://github.com/ebroder). +- [@nachocodoner](https://github.com/nachocodoner). + +For making this great framework even better! + + diff --git a/docs/generators/changelog/versions/2.16.md b/docs/generators/changelog/versions/2.16.md new file mode 100644 index 00000000000..0d847779df8 --- /dev/null +++ b/docs/generators/changelog/versions/2.16.md @@ -0,0 +1,102 @@ +## v2.16.0, 2024-05-14 + +### Highlights + +- Support observeChangesAsync and observeAsync. [PR](https://github.com/meteor/meteor/pull/13025) +- New mongo package options to optimize Oplog tailing performance to include/exclude certain collections [PR](https://github.com/meteor/meteor/pull/13009) + +#### Migration Steps + +To update from 2.15 to this one, you can run: + +``` +meteor update --release 2.16 +``` + +If you're coming from an older version, please check our [Migration Guides](https://guide.meteor.com/2.14-migration). + +#### Breaking Changes +N/A + +#### Internal API changes + +* Add method name to MethodInvocation in DDP messages + +#### Meteor Version Release + +* Meteor tool + - Updated Svelte skeleton + - Update tsconfig.json for Svelte skeleton + - Updated Solid skeleton NPM dependencies + +* Blaze + - Support of async dynamic attributes [PR](https://github.com/meteor/blaze/pull/460) + - Fix Blaze._expandAttributes returns empty object, if null. [PR](https://github.com/meteor/blaze/pull/458) + +* `accounts-base@get-version` + - Supported session storage to store accounts login token [PR #13046] + - Update config checking + - Added new types [PR #13042] + +* `accounts-oauth@get-version` + - Remove config checking as it is done in `accounts-base` + +* `accounts-ui-unstyled@get-version` + - `Connect with Twitter` is now `Connect with X/Twitter` + +* `check@get-version`: + - Added an optional flag to immediately throw error when all checks failed. [PR #12970] + +* `ddp-common@get-version` + - Add method name to MethodInvocation + +* `ddp-client@get-version` + - Add method name to MethodInvocation + +* `ddp-server@get-version` + - Add method name to MethodInvocation + +* `twitter-config-ui@get-version` + - Update setup instructions + +* `email@get-version` + - Nodemailer update to v6.9.10 + - `@types/nodemailer` updated to v6.4.14 + - Adds the ability to encrypt your emails using PGP [PR #12991] + +* `logging@get-version` + - Type update + +* `minimongo@get-version` + - Support observeChangesAsync and observeAsync [PR #13025] + - Report and extend test cases for the old async behaviors + +* `minifier-js@get-version` + - Update terser to v5.31.0 + +* `mongo@get-version` + - Support a new option to include/exclude certain collections for oplog tailing [PR #13009] + +* `reload-safetybelt@get-version` + - Remove underscore dependency + +* `service-configuration@get-version` + - Type update + +#### Independent releases + +* `mongo@1.16.9`: + - Set `minPoolSize` for oplog + +* `underscore@1.6.1` + - Fix bug in `_.intersection` + +#### Contributors + +- [GH nachocodoner] +- [GH StorytellerCZ] +- [GH jamauro] +- [GH Twisterking] +- [GH harryadel] + +Thanks for making this great framework even better! diff --git a/docs/generators/changelog/versions/3.0.md b/docs/generators/changelog/versions/3.0.md index ae1edaf6ec6..982bfc7f3a4 100644 --- a/docs/generators/changelog/versions/3.0.md +++ b/docs/generators/changelog/versions/3.0.md @@ -109,6 +109,7 @@ - `babel-compiler@8.0.0`: + - Add `Babel.compileForShell` - Removed `Promise.await` default transform. - Added top-level-await to packages. @@ -195,9 +196,10 @@ - `ddp-client@3.0.0`: - - Added `isAsyncCall` method to know if call is being made by a async method. + - Added `isAsyncCall` method to know if call is being made by an async method. - Removed `fibers` from package. - Updated tests to use async methods. + - Now `stubPromise` is returned when calling `callAsync` or `applyAsync`. - `ddp-common@2.0.0`: @@ -240,6 +242,8 @@ - `ecmascript@1.0.0`: + - `ECMAScript.compileForShell` was removed. Use `Babel.compileForShell` from + `babel-compiler` instead. This change makes some build plugins and apps that do not use `babel-compiler` 90mb smaller. - Added dependency to `@babel/runtime`. - Moved runtime tests. @@ -367,7 +371,6 @@ - Async local storage was added to help deal with async methods. - Added `promiseEmmiter` to help with async methods. - Removed `fibers` from package. - - `Meteor.absoluteUrl` in localhost uses `127.0.1` by default. - `minifier-css@2.0.0`: @@ -385,6 +388,7 @@ if the cursor is ready and if the callbacks are have been called. If you only use it in the `Client` or as a `LocalCollection` things have not changed. + - `cursor.observeChangesAsync` and `cursor.observeAsync` are added and resolve as promises, returning results similar to their synchronous counterparts. - `mobile-experience@2.0.0`: @@ -427,6 +431,7 @@ - Updated to unify methods, `update`,`insert`,`remove`, `fetch` are now async, they are the same as their `*Async` counterpart. - `ensureIndex` and `createIndex` are now async. + - `observeChangesAsync` and `observeAsync` are added and resolve as promises, returning results similar to their synchronous counterparts. - `npm-mongo@5.0.0`: @@ -661,6 +666,9 @@ - `Meteor.callAsync()` +- `meteor`: + - Added `Meteor.isDebug` to execute code in debug builds, activated with the --inspect mode. + - `minifier-css`: (2.9+) - `CssTools.minifyCssAsync()` diff --git a/docs/generators/packages-listing/script.js b/docs/generators/packages-listing/script.js index 26b6e30b394..8101ff6166c 100644 --- a/docs/generators/packages-listing/script.js +++ b/docs/generators/packages-listing/script.js @@ -1,4 +1,4 @@ -const fs = require('fs'); +const fs = require('fs').promises; const HEADER_TEMPLATE = ` --- title: Core Package Listing @@ -33,9 +33,9 @@ const IGNORED = [ 'depracated', 'non-core' ]; -const getPackages = () => { +const getPackages = async () => { const packages = - fs.readdirSync('../packages', { withFileTypes: true }) + (await fs.readdir('../packages', { withFileTypes: true })) .filter(dirent => dirent.isDirectory()) .map(dirent => dirent.name) .filter(name => !IGNORED.includes(name)) @@ -55,13 +55,13 @@ const generateMarkdown = (packages) => -function main() { +async function main() { console.log("πŸš‚ Started listing πŸš‚"); - const packages = getPackages(); + const packages = await getPackages(); const markdown = generateMarkdown(packages); const content = HEADER_TEMPLATE + markdown; console.log("πŸ“ Writing to file πŸ“"); - fs.writeFileSync('./source/packages/packages-listing.md', content); + await fs.writeFile('./source/packages/packages-listing.md', content); console.log("πŸš€ Done πŸš€"); } diff --git a/docs/history.md b/docs/history.md index d0e35a86fa5..8d5e13b0a62 100644 --- a/docs/history.md +++ b/docs/history.md @@ -8,8 +8,6 @@ [//]: # (go to meteor/docs/generators/changelog/docs) - - ## v3.0, TBD ### Highlights @@ -417,6 +415,7 @@ - `modules@1.0.0`: - Updated `reify` version. + - All modules are described as strict mode - `mongo-decimal@`: @@ -721,6 +720,399 @@ - [@StorytellerCZ](https://github.com/sponsors/StorytellerCZ/) For making this great framework even better! + + +## v2.16.0, 2024-05-14 + +### Highlights + +- Support observeChangesAsync and observeAsync. [PR](https://github.com/meteor/meteor/pull/13025) +- New mongo package options to optimize Oplog tailing performance to include/exclude certain collections [PR](https://github.com/meteor/meteor/pull/13009) + +#### Migration Steps + +To update from 2.15 to this one, you can run: + +``` +meteor update --release 2.16 +``` + +If you're coming from an older version, please check our [Migration Guides](https://guide.meteor.com/2.14-migration). + +#### Breaking Changes +N/A + +#### Internal API changes + +* Add method name to MethodInvocation in DDP messages + +#### Meteor Version Release + +* Meteor tool + - Updated Svelte skeleton + - Update tsconfig.json for Svelte skeleton + - Updated Solid skeleton NPM dependencies + +* Blaze + - Support of async dynamic attributes [PR](https://github.com/meteor/blaze/pull/460) + - Fix Blaze._expandAttributes returns empty object, if null. [PR](https://github.com/meteor/blaze/pull/458) + +* `accounts-base@2.2.11` + - Supported session storage to store accounts login token [PR](https://github.com/meteor/meteor/pull/13046) + - Update config checking + - Added new types [PR](https://github.com/meteor/meteor/pull/13042) + +* `accounts-oauth@1.4.4` + - Remove config checking as it is done in `accounts-base` + +* `accounts-ui-unstyled@1.7.1` + - `Connect with Twitter` is now `Connect with X/Twitter` + +* `check@1.4.1`: + - Added an optional flag to immediately throw error when all checks failed. [PR](https://github.com/meteor/meteor/pull/12970) + +* `ddp-common@1.4.1` + - Add method name to MethodInvocation + +* `ddp-client@2.6.2` + - Add method name to MethodInvocation + +* `ddp-server@2.7.1` + - Add method name to MethodInvocation + +* `twitter-config-ui@1.0.2` + - Update setup instructions + +* `email@2.2.6` + - Nodemailer update to v6.9.10 + - `@types/nodemailer` updated to v6.4.14 + - Adds the ability to encrypt your emails using PGP [PR](https://github.com/meteor/meteor/pull/12991) + +* `logging@1.3.4` + - Type update + +* `minimongo@1.9.4` + - Support observeChangesAsync and observeAsync [PR](https://github.com/meteor/meteor/pull/13025) + - Report and extend test cases for the old async behaviors + +* `minifier-js@2.8.0` + - Update terser to v5.31.0 + +* `mongo@1.16.10` + - Support a new option to include/exclude certain collections for oplog tailing [PR](https://github.com/meteor/meteor/pull/13009) + +* `reload-safetybelt@1.0.13` + - Remove underscore dependency + +* `service-configuration@1.3.4` + - Type update + +#### Independent releases + +* `mongo@1.16.9`: + - Set `minPoolSize` for oplog + +* `underscore@1.6.1` + - Fix bug in `_.intersection` + +#### Contributors + +- [nachocodoner](https://github.com/nachocodoner) +- [StorytellerCZ](https://github.com/StorytellerCZ) +- [jamauro](https://github.com/jamauro) +- [Twisterking](https://github.com/Twisterking) +- [harryadel](https://github.com/harryadel) + +Thanks for making this great framework even better! + +## v2.15.0, 2024-02-05 + +### Highlights + +* Bumps embedded MongoDB to 7.0.5. + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +In development, if you're using Linux, you might get an error like `version GLIBCXX_3.4.26 not found` or something related to g++. + +This is related to your g++ version. With MongoDB 7, you need to have g++ 11 or higher. So make sure to have this updated. + +This will happen only if you are trying to run your Meteor application with a MongoDB 7 version. If you run your app with a MONGO_URL pointing to a different MongoDB version, you won't have this issue. + +```bash + +meteor update --release 2.15 + +``` + + +#### Meteor Version Release + + +* `Command line`: + - The bundle version was changed to include embedded MongoDB to 7.0.5. + - Fix cordova launch screen warnings on 2.15 [PR](https://github.com/meteor/meteor/pull/12971) +* `underscore@1.6.0`: + - A test related to [PR](https://github.com/meteor/meteor/pull/12798) to see if the tests can manage the first update step. [PR](https://github.com/meteor/meteor/pull/12912) +* `service-configuration@1.3.3`: + - added new types* [PR](https://github.com/meteor/meteor/pull/12922) +* `meteor@1.11.5`: + - added new types [PR](https://github.com/meteor/meteor/pull/12922) +* `accounts-base@2.2.10`: + - Added missing type for createUserVerifyingEmail [PR](https://github.com/meteor/meteor/pull/12919) + +#### Special thanks to + +- [@Grubba27](https://github.com/Grubba27). +- [@denihs](https://github.com/denihs). +- [@mcorbelli](https://github.com/mcorbelli). +- [@matheusccastroo](https://github.com/matheusccastroo). +- [@StorytellerCZ](https://github.com/StorytellerCZ). +- [@ebroder](https://github.com/ebroder). +- [@nachocodoner](https://github.com/nachocodoner). + +For making this great framework even better! + + +## v2.14.0, 2023-12-12 + + +### Highlights + +Hacktoberfest release! πŸŽ‰ + +* MongoDB driver has been updated to v4.17.2. + +* You can now set `DISABLE_SOCKJS_CORS=1` if you want to prevent SockJS from setting CORS headers. Do not set this option if you will have DDP clients from other origins connecting to the DDP server. [PR](https://github.com/meteor/meteor/pull/12789) + +* Added guide on [how to prepare for Meteor 3.0 migration](https://guide.meteor.com/prepare-meteor-3.0). + +* New DDP merge strategy `NO_MERGE_MULTI`, which is similar to `NO_MERGE`, but it does track whether a document is used by multiple publications. [PR](https://github.com/meteor/meteor/pull/12742) + +* Appcache has been further deprecated and moved to the deprecated packages folder. + +* Added `Accounts.createUserAsync` into the client. + +* Many packages had their underscore dependency removed. + +* Cordova has been updated to v12.0.1 for Android and v7.0.1 for iOS, being able to build to SDK 33. + +* `meteor create` command is now interactive! + +* Added `firstRunPromise` property to `Tracker` autorun blocks, that forces autorun blocks to be executed in synchronous-looking order by storing the value autorun promise thus making it awaitable. + +#### Migration Steps + +##### Android splash screen +If you have been using `splash-screen` for Cordova, you need to update your code as Android changed their splash screen API, +the `cordova-plugin-splashscreen` is now on `cordova-android` core, so we have removed the dependency from the `splash-screen` +package. As a result we are dropping the support for dark mode splash screen on Android. + +To create this now you need to create two themes on your `config.xml` file. + +> Note that it's still possible to have it by adding the according themes with App.appendToConfig and App.addResourceFile - but this is not something Meteor will do automatically right now. + +For more information you can check our [Migration Guide](https://guide.meteor.com/2.14-migration.html) + +## Breaking Changes + +* `splash-screen` package has removed the `cordova-plugin-splashscreen` dependency. See migration steps for more info. + +## Docs + +- Added guide on [how to prepare for Meteor 3.0 migration](https://guide.meteor.com/prepare-meteor-3.0). +- Added guide on [performance improvements](https://guide.meteor.com/performance-improvement). +- Added FAQ about [Meteor 3](https://guide.meteor.com/3.0-migration). + +## Internal API changes + +* Tool + - Rename `EACCESS` to `EACCES` to follow the Windows spelling + - Fixed links in skeletons + - Fixed build issue in Vue skeleton + - Updated `source-map-support` + - Fixed bugs in negated β€œin” and β€œinstanceof” expressions + - Updated `semver` to v7.5.4 + - Updated `@meteorjs/babel` to v7.18.4 + - Cordova has been updated to v12.0.1 for Android and v7.0.1 for iOS, being able to build to SDK 33. + - `meteor create` command was re-made to be more interactive + +## Meteor Version Release + +* `accounts-base@2.2.10` + - Ensure that `onLogin` callback fires properly + - Indexes are now created asynchronously + +* `accounts-oauth@1.4.3` + - Indexes are now created asynchronously + +* `accounts-password@2.4.0` + - Add `Accounts.createUserAsync` to the client, a promise-based version of `Accounts.createUser` + - Indexes are now created asynchronously + +* `accounts-passwordless@2.1.4` + - Fix #12401, ensure that user is found with ID + - Indexes are now created asynchronously + +* `babel-compiler@7.10.5` + - Updated `@meteorjs/babel` to v7.18.4 + +* `boilerplate-generator@1.7.2` + - Removed Underscore dependency + +* `browser-policy-content@1.1.3` + - Removed Underscore dependency + +* `constraint-solver@1.2.1` + - Removed Underscore dependency + +* `crosswalk@1.7.2` + - Updated `cordova-plugin-crosswalk-webview` to v2.4.0 + - Deprecated the package + +* `ddp-rate-limiter@1.2.1` + - Removed Underscore dependency +* `ddp-server@2.7.0`: + - Allow setting `DISABLE_SOCKJS_CORS` to prevent SockJS from setting CORS headers + - Added new publication strategy `NO_MERGE_MULTI` + +* `ecmascript@0.16.8`: + - Bumped to get latest version of `@babel/compiler` + +* `facebook-oauth@1.11.3`: + - Updated default version of Facebook GraphAPI to v17 + +* `launch-screen@2.0.0` + - Removed `cordova-plugin-splashscreen` dependency + +* `fetch@0.1.4`: + - Update `node-fetch` to version 1.6.12 + - Update `whatwg-fetch` to version 3.6.17 + +* `logging@1.3.3`: + - Added TS types + - Updated `chalk` to v4.1.2 + +* `logic-solver@2.0.9` + - Removed Underscore dependency + +* `meteor@1.11.5`: + - Improve TS types + +* `mobile-experience@1.1.1`: + - Bumped to get latests version of `cordova` dependencies + +* `modern-browsers@0.1.10` + - Added `appleMail` user agent to allow modern bundle on iPads + +* `modules@0.20.0` + - Updated version of reify to v0.24.1 + +* `mongo@1.16.8` + - Added deprecation messages into type definitions + - Fix ObjectIDs handling in oplogV2V1Converter + +* `npm-mongo@4.17.2`: + - Bumped MongoDB driver to version 4.17.2 + +* `oauth@2.2.1` + - Indexes are now created asynchronously + - `remove` DB calls migrated to `removeAsync` + +* `package-version-parser@3.2.2` + - Updated `semver` to v7.5.4 + +* `react-fast-refresh@0.2.8`: + - Updated `semver` to version 7.5.4 + +* `service-configuration@1.3.3` + - Indexes are now created asynchronously + - Add types for ConfigError + +* `socket-stream-client@0.5.2` + - Removed Underscore dependency + +* `standard-minifier-css@1.9.2` + - Updated `@babel/runtime` to v7.23.5 + - Updated `minifier-css` to v1.6.4 + - Updated `logging` package to v1.3.2 + +* `test-server-tests-in-console-once@1.0.12` + - Removed Underscore dependency + +* `tinytest@1.2.3` + - Removed Underscore dependency + +* `tracker@1.3.3` + - Added `firstRunPromise` property, that forces autorun blocks to be executed + in synchronous-looking order by storing the value autorun promise + thus making it awaitable + +* `typescript@4.9.5`: + - Updated to 4.9.5 + +* `webapp@1.13.8` + - Updated `cordova-plugin-meteor-webapp` to v2.0.3 + - Updated `cookie-parser` to v1.4.6 + - Updated `send` to v0.18.0 + - Updated `stream-to-string` to v1.2.1 + - Updated `qs` to v6.11.2 + - Updated `@types/connect` to v3.4.38 + + +## Independent releases + +* `google-oauth@1.4.4`: + - Remove logging request/response in google_server + +* NPM `@meteorjs/babel@7.18.4` + - Updated `@meteorjs/reify` to v0.24.1 + +* NPM `@meteorjs/babel-preset-meteor@7.10.1` + - Add Facebook in-app browser + +* NPM `cordova-plugin-meteor-webapp@2.0.2` + - Fixed Android hot code push failing + +* NPM `cordova-plugin-meteor-webapp@2.0.3` + - Fix pull manifest from correct url if parameter are used in baseurl + +* NPM `meteor-node-stubs@1.2.6` + - Update dependencies + - Deep update dependencies that were highlighted by `npm audit` + +## Contributors + +- [@StorytellerCZ](https://github.com/sponsors/StorytellerCZ) +- [@Grubba27](https://github.com/sponsors/Grubba27) +- [@vit0rr](https://github.com/vit0rr) +- [@realyze](https://github.com/realyze) +- [@jamauro](https://github.com/jamauro) +- [@Torgen](https://github.com/Torgen) +- [@brucejo75](https://github.com/brucejo75) +- [@zodern](https://github.com/sponsors/zodern) +- [@alisnic](https://github.com/alisnic) +- [@ebroder](https://github.com/ebroder) +- [@BANSAL-NISHU](https://github.com/BANSAL-NISHU) +- [@salmanhasni](https://github.com/salmanhasni) +- [@jdgjsag67251](https://github.com/jdgjsag67251) +- [@guncebektas](https://github.com/guncebektas) +- [@harryadel](https://github.com/harryadel) +- [@dd137](https://github.com/dd137) +- [@matheusccastroo](https://github.com/matheusccastroo) +- [@mr-loop-1](https://github.com/mr-loop-1) + +For making this great framework even better! + + ## v2.13.3, 2023-09-08 ### Highlights @@ -1691,7 +2083,7 @@ N/A * `mongo@1.15.0` - New option `Meteor.settings.packages.mongo.reCreateIndexOnOptionMismatch` for case when an index with the same name, but different options exists it will be re-created. - - If there is an error on index creation Meteor will output a better message naming the collection and index where the error occured. [PR](https://github.com/meteor/meteor/pull/11995). + - If there is an error on index creation Meteor will output a better message naming the collection and index where the error occurred. [PR](https://github.com/meteor/meteor/pull/11995). * `modern-browsers@0.1.8` - New api `getMinimumBrowserVersions` to access the `minimumBrowserVersions`. [PR](https://github.com/meteor/meteor/pull/11998). * `socket-stream-client@0.5.0` @@ -1906,7 +2298,7 @@ Read our [Migration Guide](https://guide.meteor.com/2.6-migration.html) for this - useUnifiedTopology is not an option anymore, it defaults to true. - native parser is not an option anymore, it defaults to false in the mongo connection. - poolSize not an option anymore, we are using max/minPoolSize for the same behavior on mongo connection. - - fields option is deprecated, we are maintaining a translation layer to "projection" field (now prefered) until the next minor version, where we will start showing alerts. + - fields option is deprecated, we are maintaining a translation layer to "projection" field (now preferred) until the next minor version, where we will start showing alerts. - _ensureIndex is now showing a deprecation message - we are maintaining a translation layer for the new oplog format, so if you read or rely on any behavior of it please read our oplog_v2_converter.js code - update/insert/remove behavior is maintained in the Meteor way, documented in our docs, but we are now using replaceOne/updateOne/updateMany internally. This is subject to changes in the API rewrite of MongoDB without Fibers AND if you are using rawCollection directly you have to review your methods otherwise you will see deprecation messages if you are still using the old mongodb style directly. diff --git a/docs/long-form/oplog-observe-driver.md b/docs/long-form/oplog-observe-driver.md index a1ba8a1a38d..25ded4c09e4 100644 --- a/docs/long-form/oplog-observe-driver.md +++ b/docs/long-form/oplog-observe-driver.md @@ -8,7 +8,7 @@ Most users don't use `observeChanges` directly, but whenever you return a cursor Previous versions of Meteor only had one strategy for implementing `observeChanges`: the "poll-and-diff" algorithm, implemented by the `PollingObserveDriver` class. This approach re-runs the query frequently and calculates the difference between each set of results. This code is simple and has historically contained very few bugs. But the cost of the `PollingObserveDriver` is proportional to the poll frequency and to the size of each query result, and the time from database change to callback invocation depends on whether the write originated in the same Meteor server process (very fast) or in another process (up to 10 seconds). -Starting with Meteor 0.7.0, Meteor can use an additional strategy to implemnt `observeChanges`: **oplog tailing**, implemented by the `OplogObserveDriver` class. +Starting with Meteor 0.7.0, Meteor can use an additional strategy to implement `observeChanges`: **oplog tailing**, implemented by the `OplogObserveDriver` class. Meteor now knows how to read the MongoDB "operations log" --- a special collection that records all the write operations as they are applied to your database. This means changes to the database can be instantly noticed and reflected in Meteor, whether they originated from Meteor or from an external database client. Oplog tailing has different performance characteristics than "poll-and-diff" which are superior in many cases. `OplogObserveDriver` needs to understand the meaning of MongoDB [selectors](http://docs.meteor.com/#selectors), [field specifiers](http://docs.meteor.com/#fieldspecifiers), [modifiers](http://docs.meteor.com/#modifiers), and [sort specifiers](http://docs.meteor.com/#sortspecifiers) at a much deeper level than `PollingObserveDriver`. This is because it actually needs to understand how write operations that it sees in the oplog interact with queries, instead of just relying on the MongoDB server to repeatedly execute the query. To deal with these structures, `OplogObserveDriver` uses Meteor's implementation of the MongoDB query engine, [Minimongo](https://github.com/meteor/meteor/tree/master/packages/minimongo), which Meteor also uses as its client-side local database cache. diff --git a/docs/package-lock.json b/docs/package-lock.json index f4bc5bb0908..7965d6e9ba3 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -76,36 +76,19 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "dependencies": { - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - } + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, "ajv": { @@ -201,9 +184,9 @@ "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "optional": true, "requires": { @@ -230,9 +213,9 @@ "dev": true }, "async-each": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.2.tgz", - "integrity": "sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", "dev": true }, "asynckit": { @@ -256,9 +239,9 @@ "optional": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true, "optional": true }, @@ -311,9 +294,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", - "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", "dev": true }, "regenerator-runtime": { @@ -335,9 +318,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", - "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", "dev": true } } @@ -391,9 +374,9 @@ "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base": { @@ -420,33 +403,14 @@ "is-descriptor": "^1.0.0" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "isobject": { @@ -454,12 +418,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -499,9 +457,9 @@ } }, "bluebird": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", - "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "boolbase": { @@ -578,6 +536,20 @@ } } }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "optional": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -589,9 +561,9 @@ } }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", "dev": true }, "canonical-json": { @@ -741,14 +713,22 @@ } }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "dev": true + } } }, "co": { @@ -758,12 +738,6 @@ "dev": true, "optional": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -790,9 +764,9 @@ "dev": true }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "optional": true, "requires": { @@ -800,32 +774,30 @@ } }, "command-exists": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", - "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true }, "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "requires": { - "mime-db": ">= 1.40.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.41.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.41.0.tgz", - "integrity": "sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw==", - "dev": true - } + "mime-db": ">= 1.43.0 < 2" } }, "compression": { @@ -880,9 +852,9 @@ "dev": true }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "cross-spawn": { @@ -969,11 +941,23 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "optional": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -984,33 +968,14 @@ "isobject": "^3.0.1" }, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "isobject": { @@ -1018,12 +983,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -1035,15 +994,15 @@ "optional": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "dom-serializer": { @@ -1099,9 +1058,9 @@ "dev": true }, "ejs": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", - "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", "dev": true }, "emoji-regex": { @@ -1123,15 +1082,32 @@ "dev": true }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "optional": true, "requires": { "prr": "~1.0.1" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "optional": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "optional": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1151,9 +1127,9 @@ "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "etag": { @@ -1334,12 +1310,32 @@ "nan": "^2.12.1" } }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "optional": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -1404,10 +1400,20 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "optional": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "handlebars": { @@ -1423,23 +1429,11 @@ "wordwrap": "^1.0.0" }, "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true } } }, @@ -1476,6 +1470,30 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "optional": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "optional": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "optional": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -1536,6 +1554,15 @@ } } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", @@ -1585,9 +1612,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "ansi-styles": { @@ -1673,9 +1700,9 @@ } }, "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -1725,62 +1752,15 @@ "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, @@ -1895,33 +1875,14 @@ "graceful-fs": "^4.1.11" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "is-extglob": { @@ -1931,9 +1892,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -1966,9 +1927,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "micromatch": { @@ -2157,9 +2118,9 @@ } }, "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -2209,62 +2170,15 @@ "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, @@ -2360,33 +2274,14 @@ "graceful-fs": "^4.1.11" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "is-extglob": { @@ -2396,9 +2291,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -2431,9 +2326,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "micromatch": { @@ -2537,9 +2432,9 @@ } }, "striptags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", - "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", + "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==", "dev": true } } @@ -2569,12 +2464,6 @@ "color-convert": "^1.9.0" } }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2587,9 +2476,9 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "supports-color": { @@ -2640,9 +2529,9 @@ "optional": true }, "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true }, "htmlparser2": { @@ -2660,9 +2549,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -2673,22 +2562,22 @@ } }, "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -2724,9 +2613,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "invariant": { @@ -2738,19 +2627,13 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "hasown": "^2.0.0" } }, "is-binary-path": { @@ -2768,32 +2651,32 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "hasown": "^2.0.0" } }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "is-dotfile": { @@ -2824,13 +2707,10 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true }, "is-glob": { "version": "2.0.1", @@ -2933,9 +2813,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -2993,6 +2873,12 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -3008,20 +2894,32 @@ } }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true, "optional": true }, "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", "dev": true, "optional": true, "requires": { - "jsonify": "~0.0.0" + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "optional": true + } } }, "json-stringify-safe": { @@ -3032,9 +2930,9 @@ "optional": true }, "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true, "optional": true }, @@ -3045,22 +2943,22 @@ "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "optional": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" }, "dependencies": { "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "optional": true } @@ -3090,15 +2988,6 @@ "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", "dev": true }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, "less": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", @@ -3183,9 +3072,9 @@ "dev": true }, "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "lodash.pick": { @@ -3300,12 +3189,6 @@ "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "dev": true }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true - }, "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", @@ -3346,41 +3229,39 @@ "dev": true }, "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true, - "optional": true + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true }, "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "optional": true, "requires": { - "mime-db": "~1.38.0" + "mime-db": "1.52.0" } }, "min-indent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", - "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "mixin-deep": { @@ -3405,50 +3286,41 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "optional": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - } + "minimist": "^1.2.6" } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true }, "moment-timezone": { - "version": "0.5.25", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.25.tgz", - "integrity": "sha512-DgEaTyN/z0HFaVcVbSyVCUU6HeFdnNC3vE4c9cgu2dgMTvjBUBdBzWfasTBmAW45u5OIMeCJtU8yNjM22DHucw==", + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", "dev": true, "requires": { - "moment": ">= 2.9.0" + "moment": "^2.29.4" } }, "morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "dev": true, "requires": { - "basic-auth": "~2.0.0", + "basic-auth": "~2.0.1", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "~2.0.0", "on-finished": "~2.3.0", - "on-headers": "~1.0.1" + "on-headers": "~1.0.2" } }, "ms": { @@ -3470,9 +3342,9 @@ } }, "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", "dev": true, "optional": true }, @@ -3508,9 +3380,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true } } @@ -3523,9 +3395,9 @@ "optional": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { @@ -3582,415 +3454,15 @@ "boolbase": "~1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nunjucks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.0.tgz", - "integrity": "sha512-YS/qEQ6N7qCnUdm6EoYRBfJUdWNT0PpKbbRnogV2XyXbBm2STIP1O6yrdZHgwMVK7fIYUx7i8+yatEixnXSB1w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", "dev": true, "requires": { "a-sync-waterfall": "^1.0.0", "asap": "^2.0.3", - "chokidar": "^2.0.0", - "yargs": "^3.32.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "optional": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "optional": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - } + "commander": "^5.1.0" } }, "oauth-sign": { @@ -4028,6 +3500,13 @@ } } }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "optional": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -4121,6 +3600,12 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "dev": true } } }, @@ -4130,15 +3615,6 @@ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -4243,9 +3719,9 @@ "dev": true }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "promise": { @@ -4279,9 +3755,9 @@ "optional": true }, "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.1.tgz", + "integrity": "sha512-LQy1Q1fcva/UsnP/6Iaa4lVeM49WiOitu2T4hZCyA/elLKu37L99qcBJk4VCCk+rdLvnMzfKyiN3SZTqdAZGSQ==", "dev": true, "optional": true }, @@ -4303,9 +3779,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true } } @@ -4317,9 +3793,9 @@ "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4416,62 +3892,15 @@ "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, @@ -4534,33 +3963,14 @@ } } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "is-number": { @@ -4590,9 +4000,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "micromatch": { @@ -4650,9 +4060,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true }, "repeat-string": { @@ -4714,12 +4124,14 @@ } }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-url": { @@ -4783,50 +4195,65 @@ "optional": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "set-blocking": { @@ -4835,10 +4262,25 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "optional": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -4850,7 +4292,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -4859,9 +4301,9 @@ } }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "shebang-command": { @@ -4889,20 +4331,11 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -4914,23 +4347,6 @@ "wrap-ansi": "^5.1.0" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -4940,23 +4356,6 @@ "ansi-regex": "^4.1.0" } }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "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 - }, "yargs": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", @@ -5034,33 +4433,14 @@ "is-descriptor": "^1.0.0" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "isobject": { @@ -5068,12 +4448,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -5103,12 +4477,12 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -5116,9 +4490,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "split-string": { @@ -5137,9 +4511,9 @@ "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "optional": true, "requires": { @@ -5157,7 +4531,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "optional": true } @@ -5191,14 +4565,31 @@ "dev": true }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "string_decoder": { @@ -5250,6 +4641,12 @@ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true }, + "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==", + "dev": true + }, "swig-extras": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/swig-extras/-/swig-extras-0.0.1.tgz", @@ -5269,23 +4666,6 @@ "uglify-js": "2.6.0" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "uglify-js": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.0.tgz", @@ -5297,30 +4677,6 @@ "uglify-to-browserify": "~1.0.0", "yargs": "~3.10.0" } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } } } }, @@ -5400,9 +4756,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, "tough-cookie": { @@ -5439,9 +4795,9 @@ "dev": true }, "uglify-js": { - "version": "3.13.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", - "integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true }, @@ -5458,38 +4814,15 @@ "dev": true }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unpipe": { @@ -5545,9 +4878,9 @@ } }, "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, "upper-case": { @@ -5563,9 +4896,9 @@ "dev": true }, "url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, "use": { @@ -5587,9 +4920,9 @@ "dev": true }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true, "optional": true }, @@ -5617,6 +4950,13 @@ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true } } }, @@ -5644,31 +4984,58 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", "dev": true }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "wrappy": { @@ -5685,9 +5052,9 @@ "dev": true }, "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { @@ -5697,24 +5064,21 @@ "dev": true }, "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", "dev": true, "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" } }, "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/docs/source/api/accounts-multi.md b/docs/source/api/accounts-multi.md index f4c92218f4d..5dbc358c666 100644 --- a/docs/source/api/accounts-multi.md +++ b/docs/source/api/accounts-multi.md @@ -297,7 +297,7 @@ The function will be called with a single argument, the info object: {% enddtdd %} {% dtdd name:"options" type:"Exception" %} - An optional arugment passed down from the oauth service that may contain + An optional argument passed down from the oauth service that may contain additional user profile information. As the data in `options` comes from an external source, make sure you validate any values you read from it. {% enddtdd %} diff --git a/docs/source/api/accounts.md b/docs/source/api/accounts.md index cf0cb7205ad..f9429426e7d 100644 --- a/docs/source/api/accounts.md +++ b/docs/source/api/accounts.md @@ -19,6 +19,24 @@ login provider packages: `accounts-password`, `accounts-facebook`, Read more about customizing user accounts in the [Accounts](http://guide.meteor.com/accounts.html) article in the Meteor Guide. +

Accounts with Session Storage

+ +By default, Meteor uses Local Storage to store, among other things, login tokens in your browser session. But, for some applications, it makes sense to use Session Storage instead. You can achieve this by adding this to your settings: + +```json +{ + // ... all other settings, + "public": { + // ... all your public settings + "packages": { + "accounts": { + "clientStorage": "session" + } + } + } +} +``` + {% apibox "Meteor.user" %} Retrieves the user record for the current user from @@ -338,3 +356,41 @@ Accounts.ui.config({ Since Meteor 2.7 you can configure these in your Meteor settings under `Meteor.settings.public.packages.accounts-ui-unstyled`. + +

Initialize with custom settings

+ +This feature allows users to specify custom configuration parameters for both client-side and server-side initialization. + +* Client + +{% apibox "AccountsClient" %} + +On the client-side, AccountsClient can be initialized with custom parameters provided through Meteor settings configuration. Below is an example of how to use this functionality: + +```json +{ + "public": { + "packages": { + "accounts": { + ...configParams + } + } + } +} +``` + +* Server + +{% apibox "AccountsServer" %} + +On the server-side, AccountsServer can also be initialized with custom parameters. Server-specific configuration may differ from the client and can also be specified through Meteor settings. Below is an example of how to do it: + +```json +{ + "packages": { + "accounts": { + ...configParams + } + } +} +``` diff --git a/docs/source/api/assets.md b/docs/source/api/assets.md index e748b5b49d4..af4cd86124b 100644 --- a/docs/source/api/assets.md +++ b/docs/source/api/assets.md @@ -10,8 +10,8 @@ assets, which are located in the `private` subdirectory of an application's tree. Assets are not processed as source files and are copied directly into your application's bundle. -{% apibox "Assets.getText" %} -{% apibox "Assets.getBinary" %} +{% apibox "Assets.getTextAsync" %} +{% apibox "Assets.getBinaryAsync" %} {% apibox "Assets.absoluteFilePath" %} Static server assets are included by placing them in the application's `private` @@ -20,7 +20,7 @@ directory called `nested` with a file called `data.txt` inside it, then server code can read `data.txt` by running: ```js -const data = Assets.getText('nested/data.txt'); +const data = await Assets.getTextAsync('nested/data.txt'); ``` Note: Packages can only access their own assets. If you need to read the assets of a different package, or of the enclosing app, you need to get a reference to that package's `Assets` object. diff --git a/docs/source/api/check.md b/docs/source/api/check.md index 7ecdcae7d8a..107c3c865de 100644 --- a/docs/source/api/check.md +++ b/docs/source/api/check.md @@ -1,6 +1,6 @@ --- title: Check -desription: Documentation on how to use check, Meteor's type checking library. +description: Documentation on how to use check, Meteor's type checking library. --- The `check` package includes pattern checking functions useful for checking the types and structure @@ -46,6 +46,11 @@ this error gets sent over the wire to the client, it will appear only as `Meteor.Error(400, 'Match Failed')`. The failure details will be written to the server logs but not revealed to the client. +By default, `check` will throw immediately at the first error encountered. Pass in `{ throwAllErrors: true }` to throw an array of all errors. For example: +```js +check(message, {/* ... */}, {throwAllErrors: true}) +``` + {% apibox "Match.test" %} `Match.test` can be used to identify if a variable has a certain structure. diff --git a/docs/source/api/collections.md b/docs/source/api/collections.md index dfd14b8d185..7a7c0551d67 100644 --- a/docs/source/api/collections.md +++ b/docs/source/api/collections.md @@ -1082,6 +1082,38 @@ option: You can pass any MongoDB valid option, these are just examples using certificates configurations. +

Mongo Oplog Options

+ +> Oplog options were introduced in Meteor 2.15.1 + +If you set the [`MONGO_OPLOG_URL`](https://docs.meteor.com/environment-variables.html#MONGO-OPLOG-URL) env var, Meteor will use MongoDB's Oplog to show efficient, real time updates to your users via your subscriptions. + +Due to how Meteor's Oplog implementation is built behind the scenes, if you have certain collections where you expect **big amounts of write operations**, this might lead to **big CPU spikes on your meteor app server, even if you have no publications/subscriptions on any data/documents of these collections**. For more information on this, please have a look into [this blog post from 2016](https://blog.meteor.com/tuning-meteor-mongo-livedata-for-scalability-13fe9deb8908), [this github discussion from 2022](https://github.com/meteor/meteor/discussions/11842) or [this meteor forums post from 2023](https://forums.meteor.com/t/cpu-spikes-due-to-oplog-updates-without-subscriptions/60028). + +To solve this, **2 Oplog settings** have been introduced **to tweak, which collections are *watched* or *ignored* in the oplog**. + +**Exclusion**: To *exclude* for example all updates/inserts of documents in the 2 collections called `products` and `prices`, you would need to set the following setting in your Meteor settings file: + +```json + "packages": { + "mongo": { + "oplogExcludeCollections": ["products", "prices"] + } + } +``` + +**Inclusion**: vice versa, if you only want to watch/*include* the oplog for changes on documents in the 2 collections `chats` and `messages`, you would use: + +```json + "packages": { + "mongo": { + "oplogIncludeCollections": ["chats", "messages"] + } + } +``` + +For obvious reasons, using both `oplogExcludeCollections` and `oplogIncludeCollections` at the same time is not possible and will result in an error. +

Mongo.setConnectionOptions

You can also call `Mongo.setConnectionOptions` to set the connection options but diff --git a/docs/source/api/mobile-config.md b/docs/source/api/mobile-config.md index c32b33791a7..c5202b57d76 100644 --- a/docs/source/api/mobile-config.md +++ b/docs/source/api/mobile-config.md @@ -54,16 +54,7 @@ App.launchScreens({ 'Default@2x~ipad~comany': 'Default@2xipadcomany.png', // (1278x2732) - iPad Pro 12.9"/11"/10.5"/9.7"/7.9" - portrait mode // Android - 'android_mdpi_portrait': 'splash/android_mdpi_portrait.png', // (320x480) - 'android_mdpi_landscape': { src: 'splash/android_mdpi_landscape.png', srcDarkMode: 'splash/android_mdpi_landscape-night.png' }, // (480x320) - 'android_hdpi_portrait': 'splash/android_hdpi_portrait.png', // (480x800) - 'android_hdpi_landscape': 'splash/android_hdpi_landscape.png', // (800x480) - 'android_xhdpi_portrait': 'splash/android_xhdpi_portrait.png', // (720x1280) - 'android_xhdpi_landscape': 'splash/android_xhdpi_landscape.png', // (1280x720) - 'android_xxhdpi_portrait': { src: 'splash/android_xxhdpi_portrait.png', srcDarkMode: 'splash/android_xxhdpi_portrait-night.png'}, // (960x1600) - 'android_xxhdpi_landscape': 'splash/android_xxhdpi_landscape.png', // (1600x960) - 'android_xxxhdpi_portrait': 'splash/android_xxxhdpi_portrait.png', // (1280x1920) - 'android_xxxhdpi_landscape': 'splash/android_xxxhdpi_landscape.png', // (1920x1280) + 'android_universal': 'splash/android_universal.png', // (320x480) }); // Set PhoneGap/Cordova preferences. diff --git a/docs/source/api/packagejs.md b/docs/source/api/packagejs.md index 7cc521073ff..9feb02877f7 100644 --- a/docs/source/api/packagejs.md +++ b/docs/source/api/packagejs.md @@ -80,7 +80,7 @@ package) so that Meteor will pick up the local dependency. > In a lifecycle of a package there might come time to end the development for various reasons, or it gets superseded. In either case Meteor allows you to easily notify the users of the package by setting the deprecated flag to true: `deprecated: true` in the package description. In addition, you -replace it with a string that tells the users where to find replacement or what to do. +replace it with a string that tells the users where to find replacement or what to do. Provide basic package information with `Package.describe(options)`. To publish a package, you must define `summary` and `version`. @@ -97,7 +97,7 @@ package is exported to. {% apibox "PackageAPI#versionsFrom" %} > Choose Meteor versions carefully. First determine the minimum version of Meteor you need for the API you use in your package. - This should be based on specific needs of your package like needed the *Async calls, which would require minimum version to be + This should be based on specific needs of your package like needed the *Async calls, which would require minimum version to be at least 2.8. Another example are where packages had a major version bump, for example this has happened with the accounts packages in Meteor 2.3. If you want to be backward and forward compatible it is good to include Meteor version before 2.3 and then 2.3.6 in the array. A general recommendation for most compatibility for accounts packages (unless you need API that was affected in Meteor 2.3) is to have the following @@ -315,7 +315,7 @@ methods are available: - `addAsset` - Add a file to serve as-is to the browser or to include on the browser, depending on the target. On the web, it will be served at the exact path requested. For server targets, it can be retrieved using - `Assets.getText` or `Assets.getBinary`. + `Assets.getTextAsync` or `Assets.getBinaryAsync`. - `addHtml` - Works in web targets only. Add markup to the `head` or `body` section of the document. - `hmrAvailable` - Returns true if the file can be updated with HMR. Among other things, diff --git a/docs/source/api/passwords.md b/docs/source/api/passwords.md index a1967e174ee..107b38d45ab 100644 --- a/docs/source/api/passwords.md +++ b/docs/source/api/passwords.md @@ -27,13 +27,17 @@ include a turn-key user interface for password-based sign-in. {% apibox "Accounts.createUser" %} +Or a promise based version of `Accounts.createUser`: + +{% apibox "Accounts.createUserAsync" %} + On the client, this function logs in as the newly created user on successful completion. On the server, it returns the newly created user id. On the client, you must pass `password` and at least one of `username` or `email` — enough information for the user to be able to log in again later. If there are existing users with a username or email only differing in case, `createUser` will fail. The callback's `error.reason` will be `'Username already exists.'` or `'Email already exists.'` In the latter case, the user can then either [login](accounts.html#Meteor-loginWithPassword) or [reset their password](#Accounts-resetPassword). -On the server, you do not need to specify `password`, but the user will not be able to log in until it has a password (eg, set with [`Accounts.setPassword`](#accounts_setpassword)). To create an account without a password on the server and still let the user pick their own password, call `createUser` with the `email` option and then call [`Accounts.sendEnrollmentEmail`](#accounts_sendenrollmentemail). This will send the user an email with a link to set their initial password. +On the server, you do not need to specify `password`, but the user will not be able to log in until it has a password (eg, set with [`Accounts.setPasswordAsync`](#accounts_setpasswordasync)). To create an account without a password on the server and still let the user pick their own password, call `createUser` with the `email` option and then call [`Accounts.sendEnrollmentEmail`](#accounts_sendenrollmentemail). This will send the user an email with a link to set their initial password. By default the `profile` option is added directly to the new user document. To override this behavior, use [`Accounts.onCreateUser`](#accounts_oncreateuser). @@ -60,7 +64,7 @@ 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. +* "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 @@ -96,7 +100,7 @@ This function accepts tokens passed into the callbacks registered with 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.setPasswordAsync" %} {% apibox "Accounts.sendResetPasswordEmail" %} diff --git a/docs/source/api/pubsub.md b/docs/source/api/pubsub.md index 76f1343952c..64204557235 100644 --- a/docs/source/api/pubsub.md +++ b/docs/source/api/pubsub.md @@ -268,7 +268,7 @@ stay subscribed to your private messages. > The following features are available from Meteor 2.4 or `ddp-server@2.5.0` Once you start scaling your application you might want to have more control on how the data from publications is being handled on the client. -There are three publications strategies: +There are four publications strategies: #### SERVER_MERGE `SERVER_MERGE` is the default strategy. When using this strategy, the server maintains a copy of all data a connection is subscribed to. @@ -291,12 +291,17 @@ Specifically: * When we receive a change message for a document that is not in the client's collection, it will be added. * When we receive a removed message for a document that is not in the client's collection, nothing will happen. +#### NO_MERGE_MULTI +`NO_MERGE_MULTI` is similar to `NO_MERGE`, but it does track whether a document is used by multiple publications. +This has some memory overhead, but it still does not do diffing so it's faster and slimmer than +`SERVER_MERGE`. + You can import the publication strategies from `DDPServer`. ```js import { DDPServer } from 'meteor/ddp-server' -const { SERVER_MERGE, NO_MERGE_NO_HISTORY, NO_MERGE } = DDPServer.publicationStrategies +const { SERVER_MERGE, NO_MERGE_NO_HISTORY, NO_MERGE, NO_MERGE_MULTI } = DDPServer.publicationStrategies ``` You can use the following methods to set or get the publication strategy for publications: diff --git a/docs/source/api/tracker.md b/docs/source/api/tracker.md index ee1b7daae3d..8701a3d4660 100644 --- a/docs/source/api/tracker.md +++ b/docs/source/api/tracker.md @@ -80,7 +80,7 @@ If the initial run of an autorun throws an exception, the computation is automatically stopped and won't be rerun. ### Tracker.autorun and async callbacks -`Tracker.autorun` can accept an `async` callback function. +`Tracker.autorun` can accept an `async` callback function. To preserve reactivity for the reactive variables inside the async callback function, you must use a `Tracker.withComputation`Β call as described below: {% apibox "Tracker.withComputation" %} @@ -90,13 +90,13 @@ Tracker.autorun(async function example1(computation) { // Code before the first await will stay reactive. reactiveVar1.get(); // This will trigger a rerun. - let links = await LinksCollection.findAsync({}).fetch(); // First async call will stay reactive. + let links = await LinksCollection.find({}).fetchAsync(); // First async call will stay reactive. // Code after the first await looses Tracker.currentComputation: no reactivity. reactiveVar2.get(); // This won't trigger a rerun. - + // You can bring back reactivity with the Tracker.withCompuation wrapper: - let users = await Tracker.withComputation(computation, () => Meteor.users.findAsync({}).fetch()); + let users = await Tracker.withComputation(computation, () => Meteor.users.find({}).fetchAsync()); // Code below will again not be reactive, so you will need another Tracker.withComputation. const value = Tracker.withComputation(computation, () => reactiveVar3.get()); // This will trigger a rerun. @@ -112,7 +112,7 @@ The `react-meteor-data` package uses `Tracker.withComputation` to make the `useT More can be seen [here](https://github.com/meteor/react-packages/tree/master/packages/react-meteor-data#maintaining-the-reactive-context) ### Using async callbacks in versions of Meteor prior to 2.10 -`Tracker.autorun` can accept an `async` callback function. +`Tracker.autorun` can accept an `async` callback function. However, the async call back function will only be dependent on reactive functions called prior to any called functions that return a promise. Example 1 - autorun `example1()` **is not** dependent on reactive changes to the `Meteor.users` collection. Because it is dependent on nothing reactive it will run only once: @@ -302,6 +302,41 @@ recomputed at flush time. This property is a convenience to support the common pattern where a computation has logic specific to the first run. +{% apibox "Tracker.Computation#firstRunPromise" %} + +`Computation.firstRunPromise` will be set to the result of the call of the autorun function after the initial computation has been completed. If the autorun function is an async function, it'll then contain its promise, thus making the completion of the execution await-able. That allows us to manually synchronize autoruns like this: + +```js + +await Tracker.autorun(async () => { + await Meteor.userAsync(); + (...more async code...) +}).firstRunPromise; + +await Tracker.autorun(async () => { + await asyncSomeOrOther(); + (...more async code...) +}).firstRunPromise; + +``` + +For a better developer experience `firstRunPromise` is automatically appended to your async `autorun` calls so you don't have to write them yourself. Meaning this also works: + +```js + +await Tracker.autorun(async () => { + await Meteor.userAsync(); + (...more async code...) +}); + +await Tracker.autorun(async () => { + await asyncSomeOrOther(); + (...more async code...) +}); + +``` + +

Tracker.Dependency

A Dependency represents an atomic unit of reactive data that a diff --git a/docs/source/commandline.md b/docs/source/commandline.md index 10a36a8daf2..11138250d54 100644 --- a/docs/source/commandline.md +++ b/docs/source/commandline.md @@ -33,7 +33,7 @@ required. This is the default command. Simply running `meteor` is the same as `meteor run`. -To pass additional options to Node.js use the `SERVER_NODE_OPTIONS` environment variable. E.g. for Windows PowerShell: +To pass additional options to Node.js use the `SERVER_NODE_OPTIONS` environment variable. E.g. for Windows PowerShell: `$env:SERVER_NODE_OPTIONS = '--inspect' | meteor run`. Or for Linux: `SERVER_NODE_OPTIONS=--inspect-brk meteor run`. To specify a port to listen on (instead of the default 3000), use `--port [PORT]`. @@ -43,6 +43,9 @@ For example: `meteor run --port 4000` will run the development server on `http://localhost:4000` and the development MongoDB instance on `mongodb://localhost:4001`. +To open your default browser you can pass the `--open` flag. +For example: `meteor run --open` + Run `meteor help run` to see the full list of options.

meteor debug

@@ -83,21 +86,24 @@ option to other `meteor` tool commands, such as `meteor run` and `meteor test-pa

meteor create app-name

-The command `meteor create app-name` is the default command for creating a new Meteor project. It creates a subdirectory -named `app-name` and copies a template app into it. You can pass an absolute or relative path. If you pass a relative +The command `meteor create app-name` is the default command for creating a new Meteor project. It creates a subdirectory +named `app-name` and copies a template app into it. You can pass an absolute or relative path. If you pass a relative path, it will be resolved relative to the current working directory. By default, it generates a React project. See the flags below to learn how you can generate different types of apps. +Using only `meteor create` will create a promt to help you choose the type of app you want to create, +giving you the options with the flags below. +

--apollo

-The command `meteor create --apollo app-name` creates a Meteor app with [React](https://react.dev/), -[Apollo](https://www.apollographql.com/) (GraphQL), and [MongoDB](https://www.mongodb.com/). To create a complete app, -including testing and deployment, follow the [React tutorial](https://react-tutorial.meteor.com/). To learn how to use +The command `meteor create --apollo app-name` creates a Meteor app with [React](https://react.dev/), +[Apollo](https://www.apollographql.com/) (GraphQL), and [MongoDB](https://www.mongodb.com/). To create a complete app, +including testing and deployment, follow the [React tutorial](https://react-tutorial.meteor.com/). To learn how to use Apollo, refer to the [GraphQL section](https://react-tutorial.meteor.com/simple-todos-graphql/). -Npm packages included: `@apollo/client`, `@apollo/server`, `@babel/runtime`, `body-parser`, `express`, +Npm packages included: `@apollo/client`, `@apollo/server`, `@babel/runtime`, `body-parser`, `express`, `graphql` `meteor-node-stubs`, `react`, `react-dom`. Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, @@ -107,7 +113,7 @@ Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive

--bare

-The command `meteor create --bare app-name` creates an empty Meteor app with [Blaze](https://blazejs.org) and +The command `meteor create --bare app-name` creates an empty Meteor app with [Blaze](https://blazejs.org) and [MongoDB](https://www.mongodb.com/). To create a complete app, including testing and deployment, follow the [Blaze tutorial](https://blaze-tutorial.meteor.com/). @@ -119,22 +125,22 @@ Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive

--blaze

-The command `meteor create --blaze app-name` creates a Meteor app with [Blaze](https://blazejs.org) and +The command `meteor create --blaze app-name` creates a Meteor app with [Blaze](https://blazejs.org) and [MongoDB](https://www.mongodb.com/). To create a complete app, including testing and deployment, follow the [Blaze tutorial](https://blaze-tutorial.meteor.com/). Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `jquery`. Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `blaze-html-templates`, `jquery`, `reactive-var`, -`tracker`, `standard-minifier-css`, `standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, +`tracker`, `standard-minifier-css`, `standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `blaze-hot`.

--chakra-ui

-The command `meteor create --chakra-ui app-name` creates a Meteor app with [React](https://react.dev/), -[Chakra-UI](https://chakra-ui.com/), and [MongoDB](https://www.mongodb.com/). To create a complete app, including -testing and deployment, follow the [React tutorial](https://react-tutorial.meteor.com/). To learn how to use Chakra-UI, +The command `meteor create --chakra-ui app-name` creates a Meteor app with [React](https://react.dev/), +[Chakra-UI](https://chakra-ui.com/), and [MongoDB](https://www.mongodb.com/). To create a complete app, including +testing and deployment, follow the [React tutorial](https://react-tutorial.meteor.com/). To learn how to use Chakra-UI, refer to the [Simple Tasks](https://github.com/fredmaiaarantes/simpletasks) example. Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `react`, `react-dom`, `@chakra-ui/icons`, `@chakra-ui/react`, `@emotion/react` @@ -147,10 +153,10 @@ Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive

--full

-The command `meteor create --full app-name` creates a Meteor app with [Blaze](https://blazejs.org) and +The command `meteor create --full app-name` creates a Meteor app with [Blaze](https://blazejs.org) and [MongoDB](https://www.mongodb.com/). It creates a more complete, imports-based project that closely matches the -[file structure](https://guide.meteor.com/structure.html#javascript-structure) recommended by the -[Meteor Guide](https://guide.meteor.com/). To create a complete app, including testing and deployment, follow the +[file structure](https://guide.meteor.com/structure.html#javascript-structure) recommended by the +[Meteor Guide](https://guide.meteor.com/). To create a complete app, including testing and deployment, follow the [Blaze tutorial](https://blaze-tutorial.meteor.com/). Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `jquery`, `chai`. @@ -172,7 +178,7 @@ Meteor packages included: `meteor`, `standard-minifier-css`, `standard-minifier-

--package

-The command `meteor create --package package-name` creates a new package. If used in an existing app, it will create a +The command `meteor create --package package-name` creates a new package. If used in an existing app, it will create a package in the `packages` directory. Check the [Meteor Guide](https://guide.meteor.com/writing-atmosphere-packages.html) for more information on how to get started writing packages. @@ -180,7 +186,7 @@ for more information on how to get started writing packages.

--prototype

The command `meteor create --prototype app-name` creates a project with the prototype purpose packages (`autopublish` -and `insecure`). If you use them, you can change your collections quickly and create prototype apps very quickly. +and `insecure`). If you use them, you can change your collections quickly and create prototype apps very quickly. However, these packages are not supposed to be used in production. For more information about security, you can read our [security checklist](https://guide.meteor.com/security.html#checklist). @@ -189,28 +195,28 @@ It can be used with other flags that create apps, such as `--react`, `blaze`, or

--react

-The command `meteor create --react app-name` creates a Meteor app with [React](https://react.dev/) and -[MongoDB](https://www.mongodb.com/). It functions in the same way as if you don't use any flags. To create a complete +The command `meteor create --react app-name` creates a Meteor app with [React](https://react.dev/) and +[MongoDB](https://www.mongodb.com/). It functions in the same way as if you don't use any flags. To create a complete app, including testing and deployment, follow the [React tutorial](https://react-tutorial.meteor.com/). Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `react`, `react-dom`. -Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, `standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `static-html`, `react-meteor-data`.

--release

-The command `meteor create app-name --release {meteor-version}` creates a Meteor app with the release specified in the -command. For instance, you can create a Meteor app with the `2.8` release using `meteor create app-name --release 2.8`. -By default, it generates a React app, but you can use it with other flags that create apps such as `--blaze`, +The command `meteor create app-name --release {meteor-version}` creates a Meteor app with the release specified in the +command. For instance, you can create a Meteor app with the `2.8` release using `meteor create app-name --release 2.8`. +By default, it generates a React app, but you can use it with other flags that create apps such as `--blaze`, `--svelte`, `--vue`, or `--typescript`.

--solid

-The command `meteor create --solid app-name` creates a Meteor app with [Solid](https://www.solidjs.com/), +The command `meteor create --solid app-name` creates a Meteor app with [Solid](https://www.solidjs.com/), [Vite](https://vitejs.dev/), and [MongoDB](https://www.mongodb.com/). You can see an example on the [meteor-solid-app](https://github.com/fredmaiaarantes/meteor-solid-app/releases/tag/milestone-2.0) repository. @@ -223,7 +229,7 @@ Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive

--svelte

-The command `meteor create --svelte app-name` creates a Meteor app with [Svelte](https://svelte.dev/) and +The command `meteor create --svelte app-name` creates a Meteor app with [Svelte](https://svelte.dev/) and [MongoDB](https://www.mongodb.com/). To create a complete app, including testing and deployment, follow the [Svelte tutorial](https://svelte-tutorial.meteor.com/). @@ -239,7 +245,7 @@ You can see an example on the [meteor-vite](https://github.com/JorgenVatle/meteo

--tailwind

-The command `meteor create --tailwind app-name` creates a Meteor app with [React](https://react.dev/), +The command `meteor create --tailwind app-name` creates a Meteor app with [React](https://react.dev/), [Tailwind CSS](https://tailwindcss.com), and [MongoDB](https://www.mongodb.com/). Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `react`, `react-dom`, `autoprefixer`, `postcss`, `postcss-load-config`, `tailwindcss`. @@ -251,9 +257,9 @@ Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive

--typescript

-The command `meteor create --typescript app-name` creates a Meteor app with [React](https://react.dev/), -[TypeScript](https://www.typescriptlang.org/), and [MongoDB](https://www.mongodb.com/). Check the -[Meteor Guide](https://guide.meteor.com/build-tool.html#typescript) for more information about TypeScript and how to +The command `meteor create --typescript app-name` creates a Meteor app with [React](https://react.dev/), +[TypeScript](https://www.typescriptlang.org/), and [MongoDB](https://www.mongodb.com/). Check the +[Meteor Guide](https://guide.meteor.com/build-tool.html#typescript) for more information about TypeScript and how to use it with other UI frameworks. Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `react`, `react-dom`, `@types/mocha`, `@types/node`, `@types/react`, `@types/react-dom`, `typescript`. @@ -265,8 +271,8 @@ Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive

--vue

-The command `meteor create --vue app-name` creates a Meteor app with [Vue 3](https://vuejs.org/), -[Tailwind CSS](https://tailwindcss.com), [Vite](https://vitejs.dev/), and [MongoDB](https://www.mongodb.com/). To +The command `meteor create --vue app-name` creates a Meteor app with [Vue 3](https://vuejs.org/), +[Tailwind CSS](https://tailwindcss.com), [Vite](https://vitejs.dev/), and [MongoDB](https://www.mongodb.com/). To create a complete app, including testing and deployment, follow the [Vue 3 tutorial](https://vue3-tutorial.meteor.com/). Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `vue`, `vue-meteor-tracker`, `vue-router`, `@types/meteor`, `@vitejs/plugin-vue`, `autoprefixer`, `postcss`, `tailwindcss`, `vite`. @@ -276,23 +282,9 @@ Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive `vite:bundler`. You can also use Vue 3 with Vite by using the [jorgenvatle:meteor-vite](https://github.com/JorgenVatle/meteor-vite) -package. You can see an example on the [meteor-vite](https://github.com/JorgenVatle/meteor-vite/tree/release/examples/vue) +package. You can see an example on the [meteor-vite](https://github.com/JorgenVatle/meteor-vite/tree/release/examples/vue) repository. - -

--vue-2

- -The command `meteor create --vue-2 app-name` creates a Meteor app with [Vue 2](https://v2.vuejs.org/) and -[MongoDB](https://www.mongodb.com/). To create a complete app, including testing and deployment, follow the -[Vue 2 tutorial](https://vue-tutorial.meteor.com/). - -Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `vue`, `vue-meteor-tracker`. - -Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, -`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `tracker`, `static-html`, `akryum:vue-component`, -`meteortesting:mocha`, `johanbrook:publication-collector`. - -

meteor generate

``meteor generate`` is a command for generating scaffolds for your current project. When ran without arguments, it will ask @@ -303,7 +295,7 @@ used as a command line only operation as well. > 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 +running ```bash meteor generate customer @@ -511,7 +503,7 @@ It will prompt the following questions. ---- +---

Using your own template

@@ -533,7 +525,7 @@ You can use your own templates for scaffolding your specific workloads. To do th 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 @@ -661,7 +653,7 @@ If you want to connect to your free MongoDB shared cluster using your on setting ``` packages: { mongo: { - options: { + options: { tlsAllowInvalidCertificates: true, }, }, @@ -685,7 +677,7 @@ Your project should be a git repository as the commit hash is going to be used t The `cache-build` option is available since Meteor 1.11. {% endpullquote %} -With the argument `--container-size` you can change your app's container size using the deploy command. The valid arguments are: `tiny`, `compact`, `standard`, `double`, `quad`, `octa`, and `dozen`. One more thing to note here is that the `--container-size` flag can only be used when the `--plan` option is already specified, otherwise using the `--container-size` option will throw an error with the message : `Error deploying application: Internal error`. To see more about the difference and prices of each one you can check [here](https://www.meteor.com/cloud#pricing-section). +With the argument `--container-size` you can change your app's container size using the deploy command. The valid arguments are: `tiny`, `compact`, `standard`, `double`, `quad`, `octa`, and `dozen`. One more thing to note here is that the `--container-size` flag can only be used when the `--plan` option is already specified, otherwise using the `--container-size` option will throw an error with the message : `Error deploying application: Internal error`. To see more about the difference and prices of each one you can check [here](https://www.meteor.com/cloud#pricing-section). {% pullquote warning %} The `--container-size` option is available since Meteor 2.4.1. @@ -912,7 +904,7 @@ upload the build to the architecture that you were using to publish it. You can use `publish-for-arch` to upload a build to a different architecture from a different machine. -If you have already published a package but need to update it's metadata +If you have already published a package but need to update it's metadata (the content of `Package.describe`) or the README you can actually achieve this via `meteor publish --update`. diff --git a/docs/source/environment-variables.md b/docs/source/environment-variables.md index 807851ac474..4c8ebb8bf25 100644 --- a/docs/source/environment-variables.md +++ b/docs/source/environment-variables.md @@ -15,7 +15,7 @@ See also: [`PORT`](#PORT). > In development, this can be accomplished with `meteor run --port a.b.c.d:port`. ## DDP_DEFAULT_CONNECTION_URL -(_develoment, production_) +(_development, production_) There are some situations where it is valuable for the meteor client to use a different DDP server than the `ROOT_URL` server. @@ -33,6 +33,11 @@ In the event that your own deployment platform does not support WebSockets, or y Set `DISABLE_SOCKJS=1` if you want to use the native WebSocket implementation instead of SockJS on the client side, for example, if you want to use a custom WebSocket implementation (e.g. [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js/)) on the server side. +## DISABLE_SOCKJS_CORS +(_development, production_) + +Set `DISABLE_SOCKJS_CORS=1` if you want to prevent SockJS from setting CORS headers. Do not set this option if you will have DDP clients from other origins connecting to the DDP server. + ## HTTP_FORWARDED_COUNT (_production_) @@ -72,7 +77,7 @@ When running your bundled application in production mode, pass a string of JSON ## METEOR_SQLITE_JOURNAL_MODE (_development_) -The Meteor package catalog uses the `WAL` [SQLite Journal Mode](https://www.sqlite.org/pragma.html#pragma_journal_mode) by default. The Journal mode for the package catalog can be modifed by setting `METEOR_SQLITE_JOURNAL_MODE`. +The Meteor package catalog uses the `WAL` [SQLite Journal Mode](https://www.sqlite.org/pragma.html#pragma_journal_mode) by default. The Journal mode for the package catalog can be modified by setting `METEOR_SQLITE_JOURNAL_MODE`. When running multiple concurrent meteor servers on [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/) some meteor developers have seen issues with the package catalog. Setting the environment variable `METEOR_SQLITE_JOURNAL_MODE=TRUNCATE` can overcome the issue. diff --git a/docs/source/index.md b/docs/source/index.md index 6e196d55962..71e5923d242 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -2,7 +2,7 @@ title: Docs --- -> Meteor 2.x runs on a deprecated Node.js version (14). Meteor 3.0 is in progress, and it will run on the latest Node.js version. For more information, please consult our [migration guide](https://guide.meteor.com/3.0-migration.html). +> Meteor 2.x runs on a deprecated Node.js version (14). Meteor 3.0, currently in its Release Candidate version, runs on Node.js v20. For more information, please consult our [migration guide](https://guide.meteor.com/3.0-migration.html).

What is Meteor?

@@ -24,11 +24,11 @@ Meteor is a full-stack JavaScript platform for developing modern web and mobile 1. The place to get started with Meteor is the [tutorials page](https://www.meteor.com/developers/tutorials). 1. [Meteor Examples](https://github.com/meteor/examples) is a list of examples using Meteor. You can also include your example with Meteor. - + 1. Once you are familiar with the basics, the [Meteor Guide](http://guide.meteor.com) covers intermediate material on how to use Meteor in a larger scale app. 1. Visit the [Meteor discussion forums](https://forums.meteor.com) to announce projects, get help, talk about the community, or discuss changes to core. - + 1. [Meteor Slack Community](https://join.slack.com/t/meteor-community/shared_invite/enQtODA0NTU2Nzk5MTA3LWY5NGMxMWRjZDgzYWMyMTEyYTQ3MTcwZmU2YjM5MTY3MjJkZjQ0NWRjOGZlYmIxZjFlYTA5Mjg4OTk3ODRiOTc) is the best place to ask (and answer!) technical questions and also meet Meteor developers. 1. [Atmosphere](https://atmospherejs.com) is the repository of community packages designed especially for Meteor. diff --git a/docs/source/install.md b/docs/source/install.md index 8f26fa65d3f..c136c7e3ea5 100644 --- a/docs/source/install.md +++ b/docs/source/install.md @@ -8,7 +8,7 @@ You need to install the Meteor command line tool to create, run, and manage your

Node.js version

-> Meteor 2.x runs on a deprecated Node.js version (14). Meteor 3.0 is in progress, and it will run on the latest Node.js version. For more information, please consult our [migration guide](https://guide.meteor.com/3.0-migration.html). +> Meteor 2.x runs on a deprecated Node.js version (14). Meteor 3.0, currently in its Release Candidate version, runs on Node.js v20. For more information, please consult our [migration guide](https://guide.meteor.com/3.0-migration.html). - Node.js version >= 10 and <= 14 is required. - We recommend you using [nvm](https://github.com/nvm-sh/nvm) or [Volta](https://volta.sh/) for managing Node.js versions. @@ -30,7 +30,7 @@ You need to install the Meteor command line tool to create, run, and manage your Install the latest official version of Meteor.js from your terminal by running one of the commands below. You can check our [changelog](https://docs.meteor.com/changelog.html) for the release notes. -> Run `node -v` to ensure you are using Node.js 14. Meteor 3.0 is in progress, and it will run on the latest Node.js version. +> Run `node -v` to ensure you are using Node.js 14. Meteor 3.0, currently in its Release Candidate version, runs on Node.js v20. For Windows, Linux and OS X, you can run the following command: @@ -118,5 +118,4 @@ If you installed Meteor using npm, you can remove it by running: If you installed Meteor using curl, you can remove it by running: `rm -rf ~/.meteor` -`sudo rm /usr/local/bin/meteor`Β  - +`sudo rm /usr/local/bin/meteor` diff --git a/docs/source/packages/fetch.md b/docs/source/packages/fetch.md index 4f5176e374c..016c0329f7a 100644 --- a/docs/source/packages/fetch.md +++ b/docs/source/packages/fetch.md @@ -3,7 +3,7 @@ title: fetch description: Isomorphic modern/legacy/Node polyfill for WHATWG fetch(). --- -This package replaces the `http` package for HTTP calls. `fetch` package provides polyfill for the [WHATWG fetch specification](https://fetch.spec.whatwg.org/) for legacy browsers or defaults to the global class which is available in modern browsers and Node. It is recomended that you use this package for compatibility with non-modern browsers. +This package replaces the `http` package for HTTP calls. `fetch` package provides polyfill for the [WHATWG fetch specification](https://fetch.spec.whatwg.org/) for legacy browsers or defaults to the global class which is available in modern browsers and Node. It is recommended that you use this package for compatibility with non-modern browsers. For more information we recommend [reading the MDN articles](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) about it as this article covers only basic usage in Meteor. diff --git a/docs/source/packages/logging.md b/docs/source/packages/logging.md index 6c2013d7a29..8f3fa183385 100644 --- a/docs/source/packages/logging.md +++ b/docs/source/packages/logging.md @@ -3,7 +3,7 @@ title: logging description: Documentation of Meteor's logging utility --- -The `logging` package provides a standartised way for you to log and display in console various message from your application. +The `logging` package provides a standardised way for you to log and display in console various message from your application. The added benefit is that among other data it will show you the location where the log was fired, this is useful during debugging to quickly locate where the message is coming from. diff --git a/docs/source/packages/modules.md b/docs/source/packages/modules.md index 0f01c8ef6cd..adc2b359c98 100644 --- a/docs/source/packages/modules.md +++ b/docs/source/packages/modules.md @@ -323,7 +323,7 @@ import { exportedPackageMethod } from "meteor/"; ``` > Note: Packages with `lazy` main modules cannot use `api.export` to export global -symbols to other packages/apps. Also, prior to Meteor 1.4.4.2 it is neccessary to explicitly name the file containing the module: `import "meteor//client.js"`. +symbols to other packages/apps. Also, prior to Meteor 1.4.4.2 it is necessary to explicitly name the file containing the module: `import "meteor//client.js"`. ## Local `node_modules` diff --git a/docs/source/packages/oauth-encryption.md b/docs/source/packages/oauth-encryption.md index 8b9e651ec41..bc78e63647d 100644 --- a/docs/source/packages/oauth-encryption.md +++ b/docs/source/packages/oauth-encryption.md @@ -31,10 +31,16 @@ the top level of your source file), not called from inside of a `Meteor.startup` block. To avoid storing the secret key in your application's source code, you -can use [`Meteor.settings`](http://docs.meteor.com/#meteor_settings): +can provide the same value under [`Meteor.settings.packages.accounts-base.oauthSecretKey`](http://docs.meteor.com/#meteor_settings): -```js -Accounts.config({ oauthSecretKey: Meteor.settings.oauthSecretKey }); +```json +{ + "packages": { + "accounts-base": { + "oauthSecretKey": "onsqJ+1e4iGFlV0nhZYobg==" + } + } +} ``` diff --git a/docs/source/packages/packages-listing.md b/docs/source/packages/packages-listing.md index 299df263662..dca65fde572 100644 --- a/docs/source/packages/packages-listing.md +++ b/docs/source/packages/packages-listing.md @@ -14,7 +14,6 @@ description: list of all Meteor core packages. # Core Packages -This is a list of all Meteor core packages and their repos. - [blaze](https://github.com/meteor/blaze) - [react-packages](https://github.com/meteor/react-packages) @@ -33,7 +32,6 @@ This is a list of all Meteor core packages and their repos. - [accounts-ui-unstyled](https://github.com/meteor/meteor/tree/devel/packages/accounts-ui-unstyled) - [accounts-weibo](https://github.com/meteor/meteor/tree/devel/packages/accounts-weibo) - [allow-deny](https://github.com/meteor/meteor/tree/devel/packages/allow-deny) -- [appcache](https://github.com/meteor/meteor/tree/devel/packages/appcache) - [audit-argument-checks](https://github.com/meteor/meteor/tree/devel/packages/audit-argument-checks) - [autopublish](https://github.com/meteor/meteor/tree/devel/packages/autopublish) - [autoupdate](https://github.com/meteor/meteor/tree/devel/packages/autoupdate) diff --git a/docs/source/packages/url.md b/docs/source/packages/url.md index a38971db91c..4abeefcf5d5 100644 --- a/docs/source/packages/url.md +++ b/docs/source/packages/url.md @@ -3,7 +3,7 @@ title: url description: Isomorphic modern/legacy/Node polyfill for WHATWG URL/URLSearchParams. --- -`url` package provides polyfill for the [WHATWG url specification](https://url.spec.whatwg.org/) for legacy browsers or defaults to the global class which is available in modern browsers and Node. It is recomended that you use this package for compatibility with non-modern browsers. +`url` package provides polyfill for the [WHATWG url specification](https://url.spec.whatwg.org/) for legacy browsers or defaults to the global class which is available in modern browsers and Node. It is recommended that you use this package for compatibility with non-modern browsers. For more information we recommend [reading the MDN articles](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) about it and looking over the [Node API documentation](https://nodejs.org/api/url.html#url_the_whatwg_url_api) for more details as this article covers only basic usage in Meteor. diff --git a/docs/source/windows.md b/docs/source/windows.md index b576296d8ac..b457cdeb0a6 100644 --- a/docs/source/windows.md +++ b/docs/source/windows.md @@ -16,7 +16,7 @@ Unexpected mongo exit code 3221225781. Restarting. Can't start Mongo server. ``` -You [probably](https://github.com/meteor/meteor/issues/10036#issuecomment-416485306) need to install `Visual C++ Redistributable for Visual Studio`, depending on your Windows and Meteor embbeded version of MongoDB the version of Visual Studio could be different. You can check the version that we are using in our Windows test environment [here](https://github.com/meteor/meteor/blob/devel/appveyor.yml#L10) +You [probably](https://github.com/meteor/meteor/issues/10036#issuecomment-416485306) need to install `Visual C++ Redistributable for Visual Studio`, depending on your Windows and Meteor embedded version of MongoDB the version of Visual Studio could be different. You can check the version that we are using in our Windows test environment [here](https://github.com/meteor/meteor/blob/devel/appveyor.yml#L10) Starting from MongoDB 4.4.4 we started to use Visual Studio 2019. diff --git a/guide/_config.yml b/guide/_config.yml index 93800d42e0b..0bac87bfcc5 100644 --- a/guide/_config.yml +++ b/guide/_config.yml @@ -5,6 +5,9 @@ edit_branch: 'devel' edit_path: 'guide' content_root: 'source' versions: + - '2.16' + - '2.15' + - '2.14' - '2.13' - '2.12' - '2.11' @@ -42,7 +45,7 @@ sidebar_categories: - index - code-style - structure - - 2.13-migration + - 2.14-migration - 3.0-migration - prepare-meteor-3.0 Data: diff --git a/guide/source/2.14-migration.md b/guide/source/2.14-migration.md new file mode 100644 index 00000000000..8dd7cd9848e --- /dev/null +++ b/guide/source/2.14-migration.md @@ -0,0 +1,67 @@ +--- +title: Migrating to Meteor 2.14 +description: How to migrate your application to Meteor 2.14. +--- + +Most of the new features in Meteor 2.14 are either applied directly behind the +scenes (in a backwards compatible manner) or are opt-in. For a complete +breakdown of the changes, please refer to the [changelog](http://docs.meteor.com/changelog.html). + + +

Changes in Meteor 2.14

+ +

Cordova Package

+ +Cordova has been updated to v12.0.1 for Android and v7.0.1 for iOS. This +requires a few changes to your Cordova project: + + - The `splash-screen` package has removed the `cordova-plugin-splashscreen` + is now on `cordova-android` core, so we have removed the dependency from the + `splash-screen` package. + As a result we are dropping the support for dark mode splash screen on Android. + To create this now you need to create two themes on your `config.xml` file. + You can follow in their [docs](https://cordova.apache.org/docs/en/latest/core/features/splashscreen/index.html) how to update your splash screen + + +Your `.mobile-config.js` file should have the following preferences: + +```js + +App.setPreference('android-targetSdkVersion', '33') +App.setPreference('android-minSdkVersion', '28') + +``` + +

Migrating from a version older than 2.13?

+ +If you're migrating from a version of Meteor older than Meteor 2.13, there may +be important considerations not listed in this guide. + Please review the older migration guides for details: + +* [Migrating to Meteor 2.13](2.13-migration.html) (from 2.12) +* [Migrating to Meteor 2.12](2.12-migration.html) (from 2.11) +* [Migrating to Meteor 2.11](2.11-migration.html) (from 2.10) +* [Migrating to Meteor 2.10](2.10-migration.html) (from 2.9) +* [Migrating to Meteor 2.9](2.9-migration.html) (from 2.8) +* [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/guide/source/3.0-migration.md b/guide/source/3.0-migration.md index 3a71ee12afa..8fefd8ae46c 100644 --- a/guide/source/3.0-migration.md +++ b/guide/source/3.0-migration.md @@ -3,19 +3,27 @@ title: Migrating to Meteor 3.0 description: How to migrate your application to Meteor 3.0. --- -> **This guide will be created as we get closer to the Meteor 3.0 beta release.** We are also evaluating new documentation platforms to improve our users' experience. +> This guide will be created as we approach the Meteor 3.0 release. +> We're in the process of moving our documentation to Vitepress, +> and updating the Meteor API docs for version 3.0. For the latest updates, +> visit https://v3-docs.meteor.com/. ## What's the status of version 3.0? -**Latest version:** `3.0-alpha.19`
-**Node.js version:** `20.9.0 LTS` +**Latest version:** `3.0-rc.2`
+**Node.js version:** `20.11.1 LTS`
+**NPM version:** `10.2.4` -Meteor 3.0 is in alpha and not recommended for production. You can check the "[Release 3.0 Pull Request](https://github.com/meteor/meteor/pull/12359)" to see what is being changed. +Meteor 3.0, currently in its Release Candidate version, is approaching a recommendation for production use. You can check the "[Release 3.0 Pull Request](https://github.com/meteor/meteor/pull/12359)" to see what is being changed. ## How to prepare for version 3.0? You can follow the guide "[How to migrate to Meteor Async in Meteor 2.x](/prepare-meteor-3.0.html)" to help you prepare your application for the new version by starting to use async methods. +## How to follow the progress on version 3? + +The best way to follow the progress is by checking the "[What's left until an official Meteor 3.0?](https://github.com/meteor/meteor/discussions/12865)" discussion. We have also been sharing constant updates on [this topic](https://forums.meteor.com/t/fibers-public-roadmap-and-meteor-3-0/59627/84) in our forum. + ## Frequently Asked Questions ### What is Fibers? @@ -112,24 +120,29 @@ findOne is not available on the server. Please use findOneAsync instead. You can create a new Meteor 3.0 project by running the command below: ```bash -meteor create my-new-project --release 3.0-alpha.19 +meteor create my-new-project --release 3.0-rc.2 ``` -### How to update from version 2? +or alternatively, you can use `npx` -You can update your Meteor 2.x project by running the command below inside your project folder: +If you want to test Meteor v3, you can use the following command to install it: ```bash -meteor update --release 3.0-alpha.19 +npx meteor@beta ``` -### How to follow the progress on version 3? +### How to update from version 2? + +You can update your Meteor 2.x project by running the command below inside your project folder: -The best way to follow the progress is by checking the "[What's left until an official Meteor 3.0?](https://github.com/meteor/meteor/discussions/12865)" discussion. We have also been sharing constant updates on [this topic](https://forums.meteor.com/t/fibers-public-roadmap-and-meteor-3-0/59627/84) in our forum. +```bash +meteor update --release 3.0-rc.2 +meteor reset #resets local DB and project to a fresh state +``` ### When will Meteor 3.0 be ready? -We plan to release the beta version by the end of Q4 2023. An official version will depend a lot on user feedback, but we aim to release it by the end of Q1 2024. +The Release Candidate version has been released. The official version's release will heavily depend on user feedback, but our goal is to release it in Q2 2024. ### How do I migrate my package to be compatible with Meteor 3.0? @@ -143,7 +156,7 @@ The migration will look like this: ```js // in you package.js Package.onUse((api) => { - api.versionsFrom(['1.10', '2.3', '3.0-alpha.19']); + api.versionsFrom(['1.10', '2.3', '3.0-rc.2']); // ^^^^^^^ for testing your package with meteor 3.0 api.versionsFrom(['1.10', '2.3', '3.0']); @@ -247,11 +260,7 @@ If you encounter issues with any of them, let us know, please [open an issue](ht This is the [list of all core packages](https://docs.meteor.com/packages/packages-listing.html). -We will bring these three new packages to the core and migrate them to Meteor 3.0: - - `percolate:migrations` - [GitHub](https://github.com/percolatestudio/meteor-migrations); - - `littledata:synced-cron` - [GitHub](https://github.com/percolatestudio/meteor-synced-cron); - - `matb33:collection-hooks` - [GitHub](https://github.com/Meteor-Community-Packages/meteor-collection-hooks); - +Following the official release of Meteor 3.0, we plan to add new packages to the core and migrating them to Meteor 3.0. For those packages that are not in the core but are maintained by the [community](https://github.com/Meteor-Community-Packages), we hope that the community can work on them, but if for some reason that is not possible, diff --git a/guide/source/data-loading.md b/guide/source/data-loading.md index 27ed645cd4b..eac550fd24f 100644 --- a/guide/source/data-loading.md +++ b/guide/source/data-loading.md @@ -589,31 +589,35 @@ A pattern for turning a polled REST endpoint looks something like this: ```js const POLL_INTERVAL = 5000; -Meteor.publish('polled-publication', function() { - const publishedKeys = {}; - - const poll = () => { - // Let's assume the data comes back as an array of JSON documents, with an _id field - const data = HTTP.get(REST_URL, REST_OPTIONS); - - data.forEach((doc) => { - if (publishedKeys[doc._id]) { - this.changed(COLLECTION_NAME, doc._id, doc); - } else { - publishedKeys[doc._id] = true; - this.added(COLLECTION_NAME, doc._id, doc); - } +Meteor.publish('polled-publication', async function() { + const publishedKeys = {}; + + const poll = async () => { + // Let's assume the data comes back as an array of JSON documents, with an _id field + const response = await fetch(REST_URL, REST_OPTIONS); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } else { + data = await response.json(); + data.forEach((doc) => { + if (publishedKeys[doc._id]) { + this.changed(COLLECTION_NAME, doc._id, doc); + } else { + publishedKeys[doc._id] = true; + this.added(COLLECTION_NAME, doc._id, doc); + } + }); + } + }; + + await poll(); + this.ready(); + + const interval = Meteor.setInterval(poll, POLL_INTERVAL); + + this.onStop(() => { + Meteor.clearInterval(interval); }); - }; - - poll(); - this.ready(); - - const interval = Meteor.setInterval(poll, POLL_INTERVAL); - - this.onStop(() => { - Meteor.clearInterval(interval); - }); }); ``` diff --git a/guide/source/index.md b/guide/source/index.md index 9963e638ff6..e452c985215 100644 --- a/guide/source/index.md +++ b/guide/source/index.md @@ -3,7 +3,7 @@ title: Introduction description: This is the guide for using Meteor, a full-stack JavaScript platform for developing modern web and mobile applications. --- -> Meteor 2.x runs on a deprecated Node.js version (14). Meteor 3.0 is in progress, and it will run on the latest Node.js version. For more information, please consult our [migration guide](https://guide.meteor.com/3.0-migration.html). +> Meteor 2.x runs on a deprecated Node.js version (14). Meteor 3.0, currently in its Release Candidate version, runs on Node.js v20. For more information, please consult our [migration guide](https://guide.meteor.com/3.0-migration.html).

What is Meteor?

@@ -44,11 +44,11 @@ meteor 1. The place to get started with Meteor is the [tutorials page](https://www.meteor.com/developers/tutorials). 1. [Meteor Examples](https://github.com/meteor/examples) is a list of examples using Meteor. You can also include your example with Meteor. - + 1. Once you are familiar with the basics, the [Meteor Guide](http://guide.meteor.com) covers intermediate material on how to use Meteor in a larger scale app. 1. Visit the [Meteor discussion forums](https://forums.meteor.com) to announce projects, get help, talk about the community, or discuss changes to core. - + 1. [Meteor Slack Community](https://join.slack.com/t/meteor-community/shared_invite/enQtODA0NTU2Nzk5MTA3LWY5NGMxMWRjZDgzYWMyMTEyYTQ3MTcwZmU2YjM5MTY3MjJkZjQ0NWRjOGZlYmIxZjFlYTA5Mjg4OTk3ODRiOTc) is the best place to ask (and answer!) technical questions and also meet Meteor developers. 1. [Atmosphere](https://atmospherejs.com) is the repository of community packages designed especially for Meteor. diff --git a/guide/source/security.md b/guide/source/security.md index c4806d3f5ef..e50420b98d3 100644 --- a/guide/source/security.md +++ b/guide/source/security.md @@ -470,7 +470,7 @@ Generally speaking, all production HTTP requests should go over HTTPS, and all W It's best to handle the redirection from HTTP to HTTPS on the platform which handles the SSL certificates and termination. * On [Galaxy](deployment.html#galaxy), enable the "Force HTTPS" setting on a specific domain in the "Domains & Encryption" section of the application's "Settings" tab. -* Other deployments *may* have control panel options or may need to be manually configured on the the proxy server (e.g. HAProxy, nginx, etc.). The articles linked above provide some assistance on this. +* Other deployments *may* have control panel options or may need to be manually configured on the proxy server (e.g. HAProxy, nginx, etc.). The articles linked above provide some assistance on this. In the event that a platform does not offer the ability to configure this, the `force-ssl` package can be added to the project and Meteor will attempt to intelligently redirect based on the presence of the `x-forwarded-for` header. diff --git a/guide/source/vue.md b/guide/source/vue.md index 831fb1d6f5e..d28018c0875 100644 --- a/guide/source/vue.md +++ b/guide/source/vue.md @@ -41,6 +41,12 @@ Meteor's build tool and Pub/Sub API (or Apollo) provides Vue with this API that

Integrating Vue With Meteor

+Creating vue3 app + +``` +meteor create --vue +``` + To start a new project: ```sh @@ -424,7 +430,7 @@ VueSSR.createApp = function (context) {

Async data and Hydration

-Hydration is the the word for loading state into components on the serverside and then reusing that data on the clientside. +Hydration is the word for loading state into components on the serverside and then reusing that data on the clientside. This allows components to fully render their markup on the server and prevents a 're-render' on the clientside when the bundle is loaded. [Nuxt](https://nuxtjs.org/) solves this gracefully with a feature called [asyncData](https://nuxtjs.org/guide/async-data). diff --git a/guide/source/writing-atmosphere-packages.md b/guide/source/writing-atmosphere-packages.md index 0449d0690d3..31a3fa8738b 100644 --- a/guide/source/writing-atmosphere-packages.md +++ b/guide/source/writing-atmosphere-packages.md @@ -296,6 +296,14 @@ Package.onTest(function(api) { From within your test entry point, you can import other files as you would in the package proper. +You can also use [`mtest`](https://github.com/zodern/mtest) to test your packages like so: + +```bash +mtest --package ./ --once 2.14 +``` + +Which helps immensely if you'd like to test your package in CI/CD setup. You can see an example [here](https://github.com/monti-apm/monti-apm-agent/blob/master/.github/workflows/test.yml). + You can read more about testing in Meteor in the [Testing article](testing.html).

Publishing your package

diff --git a/meteor b/meteor index 1d2298951cf..05e7428fd1d 100755 --- a/meteor +++ b/meteor @@ -1,6 +1,6 @@ #!/usr/bin/env bash -BUNDLE_VERSION=20.9.0.2 +BUNDLE_VERSION=20.12.2.0 # OS Check. Put here because here is where we download the precompiled @@ -32,9 +32,9 @@ if [ "$UNAME" = "Darwin" ] ; then fi elif [ "$UNAME" = "Linux" ] ; then : "${ARCH:=$(uname -m)}" - if [ "$ARCH" != "x86_64" ] ; then + if [[ "$ARCH" != "x86_64" && "$ARCH" != "aarch64" ]] ; then echo "Unsupported architecture: $ARCH" - echo "Meteor only supports x86_64" + echo "Meteor only supports x86_64 and aarch64" exit 1 fi fi diff --git a/npm-packages/babel-preset-meteor/modern.js b/npm-packages/babel-preset-meteor/modern.js index cb36342a311..a1d56ad1e44 100644 --- a/npm-packages/babel-preset-meteor/modern.js +++ b/npm-packages/babel-preset-meteor/modern.js @@ -26,5 +26,6 @@ exports.minimumVersions = { // https://github.com/Kilian/electron-to-chromium/blob/master/full-versions.js electron: [1, 6], // https://github.com/meteor/babel-preset-meteor/issues/13 - samsungInternet: [6, 2] + samsungInternet: [6, 2], + facebook: 325 }; diff --git a/npm-packages/babel-preset-meteor/package-lock.json b/npm-packages/babel-preset-meteor/package-lock.json index c46e3f76c72..afcb0d555f2 100644 --- a/npm-packages/babel-preset-meteor/package-lock.json +++ b/npm-packages/babel-preset-meteor/package-lock.json @@ -1,28 +1,77 @@ { "name": "babel-preset-meteor", - "version": "7.10.1", - "lockfileVersion": 1, + "version": "7.10.2", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "requires": { - "@babel/highlight": "^7.12.13" + "packages": { + "": { + "name": "babel-preset-meteor", + "version": "7.10.2", + "license": "MIT", + "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" + }, + "devDependencies": { + "@babel/core": "7.14.0" } }, - "@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==" + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.0.tgz", "integrity": "sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==", - "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.14.0", "@babel/helper-compilation-targets": "^7.13.16", @@ -39,1431 +88,1300 @@ "semver": "^6.3.0", "source-map": "^0.5.0" }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dependencies": { - "@babel/generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", - "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", - "dev": true - }, - "@babel/traverse": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", - "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.9", - "@babel/types": "^7.18.9", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - } - } - }, - "@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/generator": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz", - "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==", - "requires": { - "@babel/types": "^7.13.16", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", - "requires": { - "@babel/types": "^7.12.13" + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", - "requires": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", + "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", - "requires": { - "@babel/types": "^7.13.0" + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "requires": { - "@babel/types": "^7.12.13" + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "requires": { - "@babel/types": "^7.13.12" + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "requires": { - "@babel/types": "^7.13.12" + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", - "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-module-imports": { - "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==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", - "dev": true - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/traverse": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", - "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.9", - "@babel/types": "^7.18.9", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "requires": { - "@babel/types": "^7.12.13" + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "requires": { - "@babel/types": "^7.12.1" + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" - }, - "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", - "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", - "dev": true - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/traverse": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", - "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.9", - "@babel/types": "^7.18.9", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz", - "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==" + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", - "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "node_modules/@babel/plugin-proposal-class-properties": { + "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==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "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==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", - "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" + "@babel/plugin-transform-parameters": "^7.20.7" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "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==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", - "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-async-generators": { + "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==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-class-properties": { + "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==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-logical-assignment-operators": { + "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==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { + "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==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-object-rest-spread": { + "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==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-catch-binding": { + "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==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-chaining": { + "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==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" - }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.13.16.tgz", - "integrity": "sha512-ad3PHUxGnfWF4Efd3qFuznEtZKoBp0spS+DgqzVzRPV7urEBvPLue3y2j80w4Jf2YLzZHj8TOv/Lmvdmh3b2xg==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", - "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" - }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", - "requires": { - "regenerator-transform": "^0.14.2" + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - } + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/runtime": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.17.tgz", - "integrity": "sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA==", - "requires": { - "regenerator-runtime": "^0.13.4" + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", + "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz", - "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.16", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.16", - "@babel/types": "^7.13.17", - "debug": "^4.1.0", + "node_modules/@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/types": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz", - "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@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==", - "dev": true, - "requires": { + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/set-array": { + "node_modules/@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==", - "dev": true + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, - "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "ansi-styles": { + "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==", - "requires": { + "dependencies": { "color-convert": "^1.9.0" - } - }, - "browserslist": { - "version": "4.16.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", - "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", - "requires": { - "caniuse-lite": "^1.0.30001214", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.719", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "caniuse-lite": { - "version": "1.0.30001214", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz", - "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "chalk": { + "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==", - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "color-convert": { + "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==", - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "electron-to-chromium": { - "version": "1.3.720", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz", - "integrity": "sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==" + "node_modules/electron-to-chromium": { + "version": "1.4.615", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz", + "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==" }, - "escalade": { + "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } }, - "gensync": { + "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==", - "dev": true + "engines": { + "node": ">=6.9.0" + } }, - "globals": { + "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==" + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } }, - "has-flag": { + "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } }, - "js-tokens": { + "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==" }, - "jsesc": { + "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "ms": { + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, - "regenerate": { + "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==" }, - "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==", - "requires": { - "regenerate": "^1.4.0" + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" } }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "requires": { + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { "@babel/runtime": "^7.8.4" } }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "requires": { - "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" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "requires": { - "jsesc": "~0.5.0" + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "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=" - } + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "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==", - "dev": true + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } }, - "source-map": { + "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } }, - "supports-color": { + "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==", - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "to-fast-properties": { + "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "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==" - }, - "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==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "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==" - }, - "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==" + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } } diff --git a/npm-packages/babel-preset-meteor/package.json b/npm-packages/babel-preset-meteor/package.json index ede8b177efc..fc00d9bed96 100644 --- a/npm-packages/babel-preset-meteor/package.json +++ b/npm-packages/babel-preset-meteor/package.json @@ -1,11 +1,12 @@ { "name": "babel-preset-meteor", - "version": "7.10.1", + "version": "7.10.2", "description": "Babel preset for ES2015+ features supported by Meteor", "author": "Ben Newman ", "license": "MIT", "repository": "https://github.com/meteor/babel-preset-meteor", "main": "index.js", + "type": "commonjs", "scripts": { "update-versions": "bash scripts/update-versions" }, diff --git a/npm-packages/cordova-plugin-meteor-webapp/package-lock.json b/npm-packages/cordova-plugin-meteor-webapp/package-lock.json index 3037eaae669..5408ca820ac 100644 --- a/npm-packages/cordova-plugin-meteor-webapp/package-lock.json +++ b/npm-packages/cordova-plugin-meteor-webapp/package-lock.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-meteor-webapp", - "version": "2.0.0", + "version": "2.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/npm-packages/cordova-plugin-meteor-webapp/package.json b/npm-packages/cordova-plugin-meteor-webapp/package.json index 80b082f4951..71873605c4a 100644 --- a/npm-packages/cordova-plugin-meteor-webapp/package.json +++ b/npm-packages/cordova-plugin-meteor-webapp/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-meteor-webapp", - "version": "2.0.1", + "version": "2.0.4", "description": "Cordova plugin that serves a Meteor web app through a local server and implements hot code push", "cordova": { "id": "cordova-plugin-meteor-webapp", @@ -22,6 +22,7 @@ ], "author": "Meteor Development Group", "license": "MIT", + "type": "commonjs", "scripts": { "pretest": "ios-sim start --devicetypeid=iPhone-11-Pro-Max", "test": "cordova-paramedic --plugin . --platform ios --target 'iPhone-11-Pro-Max' --args=--buildFlag='-UseModernBuildSystem=0' --verbose" diff --git a/npm-packages/cordova-plugin-meteor-webapp/src/android/AssetBundleManager.java b/npm-packages/cordova-plugin-meteor-webapp/src/android/AssetBundleManager.java index fa50d1f56a4..0a95884b038 100644 --- a/npm-packages/cordova-plugin-meteor-webapp/src/android/AssetBundleManager.java +++ b/npm-packages/cordova-plugin-meteor-webapp/src/android/AssetBundleManager.java @@ -86,7 +86,7 @@ synchronized public AssetBundle downloadedAssetBundleWithVersion(String version) } public void checkForUpdates(final HttpUrl baseUrl) { - HttpUrl manifestUrl = baseUrl.resolve("manifest.json"); + HttpUrl manifestUrl = baseUrl.newBuilder().addPathSegment("manifest.json").build(); Request request = new Request.Builder().url(manifestUrl).build(); diff --git a/npm-packages/cordova-plugin-meteor-webapp/src/android/WebAppLocalServer.java b/npm-packages/cordova-plugin-meteor-webapp/src/android/WebAppLocalServer.java index 2d8abac9ff5..c5d06ab1208 100644 --- a/npm-packages/cordova-plugin-meteor-webapp/src/android/WebAppLocalServer.java +++ b/npm-packages/cordova-plugin-meteor-webapp/src/android/WebAppLocalServer.java @@ -270,7 +270,7 @@ public void run() { callbackContext.error("checkForUpdates requires a rootURL to be configured"); return; } - HttpUrl baseUrl = rootUrl.resolve("__cordova/"); + HttpUrl baseUrl = rootUrl.newBuilder().addPathSegment("__cordova").build(); assetBundleManager.checkForUpdates(baseUrl); callbackContext.success(); } diff --git a/npm-packages/cordova-plugin-meteor-webapp/src/ios/GCDWebServer b/npm-packages/cordova-plugin-meteor-webapp/src/ios/GCDWebServer new file mode 160000 index 00000000000..38e9bf08e09 --- /dev/null +++ b/npm-packages/cordova-plugin-meteor-webapp/src/ios/GCDWebServer @@ -0,0 +1 @@ +Subproject commit 38e9bf08e09490561f4e982867cbc2adcee2b886 diff --git a/npm-packages/cordova-plugin-meteor-webapp/tests/fixtures/bundled_www/cordova_plugins.js b/npm-packages/cordova-plugin-meteor-webapp/tests/fixtures/bundled_www/cordova_plugins.js index a9491512f4d..c2fb084f467 100644 --- a/npm-packages/cordova-plugin-meteor-webapp/tests/fixtures/bundled_www/cordova_plugins.js +++ b/npm-packages/cordova-plugin-meteor-webapp/tests/fixtures/bundled_www/cordova_plugins.js @@ -8,14 +8,6 @@ module.exports = [ "window.StatusBar" ] }, - { - "file": "plugins/cordova-plugin-splashscreen/www/splashscreen.js", - "id": "cordova-plugin-splashscreen.SplashScreen", - "pluginId": "cordova-plugin-splashscreen", - "clobbers": [ - "navigator.splashscreen" - ] - }, { "file": "plugins/cordova-plugin-wkwebview-engine/src/www/ios/ios-wkwebview-exec.js", "id": "cordova-plugin-wkwebview-engine.ios-wkwebview-exec", @@ -33,8 +25,8 @@ module.exports = [ ] } ]; -module.exports.metadata = +module.exports.metadata = // TOP OF METADATA {} // BOTTOM OF METADATA -}); \ No newline at end of file +}); diff --git a/npm-packages/eslint-config-meteor/README.md b/npm-packages/eslint-config-meteor/README.md index 046c174268d..1242bbbee68 100644 --- a/npm-packages/eslint-config-meteor/README.md +++ b/npm-packages/eslint-config-meteor/README.md @@ -24,7 +24,7 @@ The peer dependencies can be installed manually by following the `package.json` $ # Install `install-peerdeps` within the current Meteor tool version. $ meteor npm install --global install-peerdeps $ # Run the newly installed `install-peerdeps` to install this package and its dependencies. -$ meteor install-peerdeps --dev @meteorjs/eslint-config-meteor +$ meteor npx install-peerdeps --dev @meteorjs/eslint-config-meteor ``` ## Configure diff --git a/npm-packages/eslint-config-meteor/package.json b/npm-packages/eslint-config-meteor/package.json index 6b1d62defe1..001b65df529 100644 --- a/npm-packages/eslint-config-meteor/package.json +++ b/npm-packages/eslint-config-meteor/package.json @@ -1,6 +1,6 @@ { "name": "@meteorjs/eslint-config-meteor", - "version": "1.0.4", + "version": "1.0.5", "description": "Eslint configuration for Meteor", "main": "index.js", "scripts": { @@ -16,6 +16,7 @@ "url": "https://github.com/meteor/meteor/issues" }, "homepage": "https://github.com/meteor/meteor/tree/devel/npm-packages/eslint-config-meteor#readme", + "type": "commonjs", "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 7845d884a35..8eb64bd0c1b 100644 --- a/npm-packages/eslint-plugin-meteor/package.json +++ b/npm-packages/eslint-plugin-meteor/package.json @@ -1,9 +1,10 @@ { "name": "eslint-plugin-meteor", - "version": "7.4.0", + "version": "7.4.1", "author": "Dominik Ferber ", "description": "Meteor specific linting rules for ESLint", "main": "lib/index.js", + "type": "commonjs", "publishConfig": { "tag": "next" }, diff --git a/npm-packages/eslint-plugin-meteor/scripts/admin/launch-meteor b/npm-packages/eslint-plugin-meteor/scripts/admin/launch-meteor index 1ec76b42802..b749cc20ea9 100755 --- a/npm-packages/eslint-plugin-meteor/scripts/admin/launch-meteor +++ b/npm-packages/eslint-plugin-meteor/scripts/admin/launch-meteor @@ -60,9 +60,11 @@ if [ ! -x "$METEOR_WAREHOUSE_DIR/meteor" ]; then PLATFORM="os.linux.x86_32" elif [ "${LINUX_ARCH}" = "x86_64" ] ; then PLATFORM="os.linux.x86_64" + elif [ "${LINUX_ARCH}" = "aarch64" ] ; then + PLATFORM="os.linux.aarch64" else echo "Unusable architecture: ${LINUX_ARCH}" - echo "Meteor only supports i686 and x86_64 for now." + echo "Meteor only supports i686, x86_64 and aarch64 for now." exit 1 fi fi diff --git a/npm-packages/eslint-plugin-meteor/scripts/admin/publish-meteor-tool-on-all-platforms.sh b/npm-packages/eslint-plugin-meteor/scripts/admin/publish-meteor-tool-on-all-platforms.sh index 2e96214eae7..8d1cd11ba21 100755 --- a/npm-packages/eslint-plugin-meteor/scripts/admin/publish-meteor-tool-on-all-platforms.sh +++ b/npm-packages/eslint-plugin-meteor/scripts/admin/publish-meteor-tool-on-all-platforms.sh @@ -42,7 +42,7 @@ main () { echo # XXX there is no os.windows.x86_64 as we don't build for it at the moment - PLATFORMS=( os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 os.windows.x86_32 ) + PLATFORMS=( os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 os.windows.x86_32 os.linux.aarch64 ) for PLATFORM in ${PLATFORMS[@]}; do COMMAND="`dirname $0`/publish-meteor-tool-on-arch.sh $GITSHA $PLATFORM $SESSION_FILE" echo $COMMAND diff --git a/npm-packages/eslint-plugin-meteor/scripts/admin/publish-meteor-tool-on-arch.sh b/npm-packages/eslint-plugin-meteor/scripts/admin/publish-meteor-tool-on-arch.sh index 9041ac4035c..795f43a1401 100755 --- a/npm-packages/eslint-plugin-meteor/scripts/admin/publish-meteor-tool-on-arch.sh +++ b/npm-packages/eslint-plugin-meteor/scripts/admin/publish-meteor-tool-on-arch.sh @@ -18,7 +18,7 @@ main () { echo "usage: $0 " 1>&2 echo "The passed sha1 is checked out and published from the machines." 1>&2 echo "Options for platform:" 1>&2 - echo " os.osx.x86_64 os.linux.x86_64 os.linux.x86_32" 1>&2 + echo " os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 os.linux.aarch64" 1>&2 echo " os.windows.x86_32 os.windows.x86_64" 1>&2 exit 1 fi @@ -33,7 +33,7 @@ main () { METEOR="$CHECKOUT_DIR/meteor" - UNIX_PLATFORMS=( os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 ) + UNIX_PLATFORMS=( os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 os.linux.aarch64 ) WINDOWS_PLATFORMS=( os.windows.x86_32 os.windows.x86_64 ) if [[ $PLATFORM =~ ^(os\.linux|os\.osx) ]] ; then diff --git a/npm-packages/eslint-plugin-meteor/scripts/build-dev-bundle-common.sh b/npm-packages/eslint-plugin-meteor/scripts/build-dev-bundle-common.sh index 941a01eabb4..65d4c79cdc0 100644 --- a/npm-packages/eslint-plugin-meteor/scripts/build-dev-bundle-common.sh +++ b/npm-packages/eslint-plugin-meteor/scripts/build-dev-bundle-common.sh @@ -5,10 +5,10 @@ set -u UNAME=$(uname) ARCH=$(uname -m) -NODE_VERSION=14.17.6 -MONGO_VERSION_64BIT=4.4.4 +NODE_VERSION=14.21.3 +MONGO_VERSION_64BIT=6.0.3 MONGO_VERSION_32BIT=3.2.22 -NPM_VERSION=6.14.15 +NPM_VERSION=6.14.18 if [ "$UNAME" == "Linux" ] ; then if [ "$ARCH" != "i686" -a "$ARCH" != "x86_64" ] ; then diff --git a/npm-packages/eslint-plugin-meteor/scripts/dev-bundle-server-package.js b/npm-packages/eslint-plugin-meteor/scripts/dev-bundle-server-package.js index 88cd796151f..1108a6ef0df 100644 --- a/npm-packages/eslint-plugin-meteor/scripts/dev-bundle-server-package.js +++ b/npm-packages/eslint-plugin-meteor/scripts/dev-bundle-server-package.js @@ -10,19 +10,19 @@ var packageJson = { dependencies: { promise: "8.1.0", "@meteorjs/reify": "0.24.0", - "@babel/parser": "7.15.3", - "@types/underscore": "1.11.2", - underscore: "1.13.1", + "@babel/parser": "7.17.0", + "@types/underscore": "1.11.4", + underscore: "1.13.6", "source-map-support": "https://github.com/meteor/node-source-map-support/tarball/1912478769d76e5df4c365e147f25896aee6375e", - "@types/semver": "5.4.0", - semver: "5.4.1" + "@types/semver": "5.5.0", + semver: "5.7.1" }, // These are only used in dev mode (by shell.js) so end-users can avoid // needing to install them if they use `npm install --production`. devDependencies: { split2: "3.2.2", - multipipe: "1.0.2", - chalk: "0.5.1" + multipipe: "2.0.1", + chalk: "4.1.2" } }; 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 dc7e72ee711..93547f44d3a 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 @@ -10,11 +10,11 @@ var packageJson = { dependencies: { // Explicit dependency because we are replacing it with a bundled version // and we want to make sure there are no dependencies on a higher version - npm: "10.1.0", + npm: "10.5.0", pacote: "https://github.com/meteor/pacote/tarball/a81b0324686e85d22c7688c47629d4009000e8b8", "node-gyp": "9.4.0", "@mapbox/node-pre-gyp": "1.0.11", - typescript: "4.9.4", + typescript: "5.4.5", "@meteorjs/babel": "7.19.0-beta.3", "@meteorjs/reify": "0.24.0", // So that Babel can emit require("@babel/runtime/helpers/...") calls. @@ -23,10 +23,10 @@ var packageJson = { // babel-runtime rather than @babel/runtime. "babel-runtime": "7.0.0-beta.3", "@types/underscore": "1.11.2", - underscore: "1.13.1", + underscore: "1.13.6", "source-map-support": "https://github.com/meteor/node-source-map-support/tarball/1912478769d76e5df4c365e147f25896aee6375e", - "@types/semver": "5.4.0", - semver: "5.4.1", + "@types/semver": "5.5.0", + semver: "5.7.1", request: "2.88.2", uuid: "3.4.0", "graceful-fs": "4.2.6", @@ -37,7 +37,7 @@ var packageJson = { // TODO: We should replace this with: https://github.com/jprichardson/node-kexec/pull/38 kexec: "https://github.com/meteor/node-kexec/tarball/f29f54037c7db6ad29e1781463b182e5929215a0", "source-map": "0.7.3", - chalk: "4.1.1", + chalk: "4.1.2", sqlite3: "5.1.6", "http-proxy": "1.18.1", "is-reachable": "3.1.0", diff --git a/npm-packages/meteor-babel/README.md b/npm-packages/meteor-babel/README.md index 1ba631d8007..497f50a213b 100644 --- a/npm-packages/meteor-babel/README.md +++ b/npm-packages/meteor-babel/README.md @@ -1,3 +1,9 @@ # @meteorjs/babel [![Build Status](https://travis-ci.com/meteor/babel.svg)](https://travis-ci.com/meteor/babel) [Babel](https://babeljs.io/) wrapper package for use with [Meteor](https://github.com/meteor/meteor). + +## Updating: + +If while updating this package the CI starts failing due inconsistencies +in the package-lock.json file, you can run `npm install --package-lock-only` +to update the package-lock.json file to the latest version of the package. diff --git a/npm-packages/meteor-babel/package-lock.json b/npm-packages/meteor-babel/package-lock.json index a4d22372dd1..a947d93f9f4 100644 --- a/npm-packages/meteor-babel/package-lock.json +++ b/npm-packages/meteor-babel/package-lock.json @@ -1,480 +1,314 @@ { "name": "@meteorjs/babel", - "version": "7.19.0-beta.2", + "version": "7.20.0-beta.4", "lockfileVersion": 1, "requires": true, "dependencies": { "@ampproject/remapping": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.1.tgz", - "integrity": "sha512-Aolwjd7HSC2PyY0fDj/wA/EimQT4HfEnFYNp5s9CQlrdhyvWTtvZ5YzrUPu6R6/1jKiUlxu8bUhkdSnKHNAHMA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@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.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" } }, "@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==" + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==" }, "@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==", - "requires": { - "@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", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "dependencies": { - "@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==" - }, - "@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==", - "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - } - }, - "@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==" - }, - "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" - }, - "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-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" } } }, "@babel/generator": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz", - "integrity": "sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" } }, "@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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" } }, "@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==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.15" } }, "@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==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "requires": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" } }, "@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, + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", + "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", "requires": { - "@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" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" } }, "@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==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" } }, "@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==", - "requires": { - "@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", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" } }, "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.14.5" - } + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" }, "@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==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@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==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@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.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, "@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==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.23.0" } }, "@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==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.24.0" } }, "@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==", - "requires": { - "@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" - }, - "dependencies": { - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - } + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" } }, "@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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" } }, "@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==" + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==" }, "@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==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-wrap-function": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "requires": { - "@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" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" } }, "@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.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, "@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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" } }, "@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==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" } }, + "@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==" + }, "@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.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@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==" + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" }, "@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==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" } }, "@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.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", - "@babel/types": "^7.17.0" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" } }, "@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.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" } }, "@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==" + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==" }, "@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==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@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==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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==", - "requires": { - "@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" - } - }, - "@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==", - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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==" - }, - "@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==", - "requires": { - "@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" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - } + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-decorators": { @@ -489,51 +323,51 @@ } }, "@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==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@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==", + "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==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@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==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.5" + "@babel/plugin-transform-parameters": "^7.20.7" } }, "@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==", + "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==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@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==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, @@ -571,18 +405,11 @@ } }, "@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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@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==" - } + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -626,330 +453,259 @@ } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", + "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", - "requires": { - "@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", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", - "requires": { - "@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" - }, - "dependencies": { - "@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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-simple-access": "^7.22.5" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@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==" - } + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", - "requires": { - "@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" - }, - "dependencies": { - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" } }, "@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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.16.7" + "@babel/plugin-transform-react-jsx": "^7.22.5" } }, "@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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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==" - } + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "requires": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.24.0", + "regenerator-transform": "^0.15.2" } }, "@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==", - "requires": { - "@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" - }, - "dependencies": { - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "requires": { + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" } }, "@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==", - "requires": { - "@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" - }, - "dependencies": { - "@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==" - }, - "@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.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" } }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, "@babel/runtime": { "version": "7.17.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", @@ -959,114 +715,119 @@ } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" } }, "@babel/traverse": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz", - "integrity": "sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==", - "requires": { - "@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", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "requires": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" - }, - "dependencies": { - "@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==", - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.16.7" - } - } } }, "@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.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@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.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" }, "@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.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@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.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@meteorjs/reify": { - "version": "https://github.com/meteor/reify/tarball/0867be73ca61e87ae9d60edef62baf26b38719ef", - "integrity": "sha512-72nBQp00MD6O2bz0bOUm6PWpuNLk4wv2uaRWcXOp+NYjYLLZB9S+O3o3o3lDe+OM4JMobCkQk4VIDasrz2Ds+w==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@meteorjs/reify/-/reify-0.25.1.tgz", + "integrity": "sha512-Ur+C+wJNDezvNNy47jEYWeKd1VEqoDhoY+NQ8qY82P0jq3hPU0ubowm58W+PcEB+qJ1v2krcF6VIxcU8TRqhWg==", "requires": { "acorn": "^8.8.1", "magic-string": "^0.25.3", "periscopic": "^2.0.3", - "semver": "^5.7.1" + "semver": "^7.5.4" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" }, "ansi-colors": { "version": "3.2.3", @@ -1075,9 +836,9 @@ "dev": true }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, "ansi-styles": { @@ -1097,12 +858,62 @@ "sprintf-js": "~1.0.2" } }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array.prototype.reduce": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "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", @@ -1111,41 +922,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==", - "requires": { - "object.assign": "^4.1.0" - } - }, "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", @@ -1160,9 +963,9 @@ } }, "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==", "requires": { "babel-helper-evaluate-path": "^0.5.0", "babel-helper-mark-eval-scopes": "^0.4.3", @@ -1173,7 +976,7 @@ "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==", "requires": { "babel-helper-is-void-0": "^0.4.3" } @@ -1190,12 +993,12 @@ "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==", "requires": { "babel-helper-mark-eval-scopes": "^0.4.3" } @@ -1203,7 +1006,7 @@ "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", @@ -1224,62 +1027,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==", "requires": { "babel-helper-is-void-0": "^0.4.3" } }, "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.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" } }, "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.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" } }, "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.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.6.1" } }, "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==", "requires": { "esutils": "^2.0.2" } @@ -1287,17 +1090,17 @@ "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", @@ -1310,17 +1113,17 @@ "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", - "resolved": "https://registry.npmjs.org/babel-preset-meteor/-/babel-preset-meteor-7.10.0.tgz", - "integrity": "sha512-bcdNfRCQAjTV42cUcmaG5/ltLZZQLpZajUcP+o0Lr+aLTY/XLNkGfASM5383wdXiAkEFl0sDOXeknnLlQtrmdg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/babel-preset-meteor/-/babel-preset-meteor-7.10.1.tgz", + "integrity": "sha512-izJeOKYW69dPwWDDBRdnJ1/sMQ9626CVVZQHqtvrjJtZJ9FHUTknrQ9+RMgYL13R6RfkFWF9Bw5J/2K+DdYGpw==", "requires": { "@babel/plugin-proposal-async-generator-functions": "^7.13.15", "@babel/plugin-proposal-class-properties": "^7.13.0", @@ -1358,24 +1161,24 @@ } }, "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==", "requires": { "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-dead-code-elimination": "^0.5.2", "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-mangle-names": "^0.5.1", "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-merge-sibling-variables": "^6.9.5", "babel-plugin-transform-minify-booleans": "^6.9.4", "babel-plugin-transform-property-literals": "^6.9.4", "babel-plugin-transform-regexp-constructors": "^0.4.3", @@ -1410,24 +1213,27 @@ "dev": true }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" } }, "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": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "camelcase": { @@ -1437,9 +1243,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001248", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz", - "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==" + "version": "1.0.30001608", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001608.tgz", + "integrity": "sha512-cjUJTQkk9fQlJR2s4HMuPMvTiRggl0rAVMtthQuyOlDWuqHXqN8azLq+pi8B2TjwKJ32diHjUqRIKeFX4z1FoA==" }, "chalk": { "version": "2.4.2", @@ -1463,9 +1269,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "string-width": { @@ -1501,12 +1307,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "commander": { "version": "2.20.3", @@ -1517,58 +1318,20 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "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==", - "requires": { - "safe-buffer": "~5.1.1" - } + "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.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.0.tgz", - "integrity": "sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "requires": { - "browserslist": "^4.19.1", - "semver": "7.0.0" - }, - "dependencies": { - "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" - }, - "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-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - }, - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } + "browserslist": "^4.23.0" } }, "d3": { @@ -1618,13 +1381,13 @@ "d3-axis": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", - "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=", + "integrity": "sha512-K0djTb26iQ6AsuD2d6Ka08wBHf4V30awIxV4XFuB/iLzYtTqqJlE/nIN0DBJJCX7lbOqbt2/oeX3r+sU5k2veg==", "dev": true }, "d3-brush": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz", - "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=", + "integrity": "sha512-nUFueDzOlvwFvuOBynGSyJM7Wt1H9fKgJeoWFSg3ScS4c7FJBch92FKUJKum4xtgPYHdgH2C3bRg3GzSVltCJQ==", "dev": true, "requires": { "d3-dispatch": "1", @@ -1637,7 +1400,7 @@ "d3-chord": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz", - "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=", + "integrity": "sha512-o0ExexkK1N0KikUakKrQwttP5Flu8AYD6iBUh3AdPJqnTh6xlvcX5wFRuuo29sLOAr9+T4yZPUH1S3CCQJ1SlQ==", "dev": true, "requires": { "d3-array": "1", @@ -1647,19 +1410,19 @@ "d3-collection": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", - "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=", + "integrity": "sha512-+TPxaBFzbzfpLF3Hjz8JPeuStNmJnyWAufu8VUfpDCDn5RieIgY+OQDjhKMDorf2naLgAjjZXLUQN7XFp/kgog==", "dev": true }, "d3-color": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", - "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=", + "integrity": "sha512-t+rSOrshj6m2AUOe8kHvTwfUQ5TFoInEkBfmsHHAHPof58dmbRXNpicB7XAyPbMQbcC7i09p2BxeCEdgBd8xmw==", "dev": true }, "d3-dispatch": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz", - "integrity": "sha1-RuFJHqqbWMNY/OW+TovtYm54cfg=", + "integrity": "sha512-Qh2DR3neW3lq/ug4oymXHYoIsA91nYt47ERb+fPKjRg6zLij06aP7KqHHl2NyziK9ASxrR3GLkHCtZvXe/jMVg==", "dev": true }, "d3-drag": { @@ -1686,7 +1449,7 @@ "d3-ease": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", - "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=", + "integrity": "sha512-io3QwOJwVPAxRF2UXpKpCdz2wm/7VLFCQQ1yy+GzX6YCtt3vi2BGnimI8agSF5jyUrHsADyF303d2S+ps7zU8w==", "dev": true }, "d3-force": { @@ -1719,7 +1482,7 @@ "d3-hierarchy": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz", - "integrity": "sha1-ochFxC+Eoga88cAcAQmOpN2qeiY=", + "integrity": "sha512-PcsLIhThc60mWnxlojIOH7Sc0tQ2DgLWfEwEAyzCtej5f3H9wSsRmrg5pEhKZLrwiJnI2zyw/pznJxL9a/Eugw==", "dev": true }, "d3-interpolate": { @@ -1734,31 +1497,31 @@ "d3-path": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", - "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=", + "integrity": "sha512-eD76prgnTKYkLzHlY2UMyOEZXTpC+WOanCr1BLxo38w4fPPPq/LgCFqRQvqFU3AJngfZmmKR7rgKPZ4EGJ9Atw==", "dev": true }, "d3-polygon": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz", - "integrity": "sha1-FoiOkCZGCTPysXllKtN4Ik04LGI=", + "integrity": "sha512-2zP7GOvf4XOWTeQouK7fCO534yQxyhYYTw6GTqcXifIalHgA6qV/es+4GRQii9m6XxEPFcht4loobD/o2iEo1A==", "dev": true }, "d3-quadtree": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz", - "integrity": "sha1-rHmH4+I/6AWpkPKOG1DTj8uCJDg=", + "integrity": "sha512-U2Jc3jF3JOBGXIOnvWY9C4ekRwRX9hEVpMMmeduJyaxAwPmoe7t84iZFTLn1RwYOyrXxJF55H/Hrg186TFQQdw==", "dev": true }, "d3-queue": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz", - "integrity": "sha1-yTouVLQXwJWRKdfXP2z31Ckudhg=", + "integrity": "sha512-2rs+6pNFKkrJhqe1rg5znw7dKJ7KZr62j9aLZfhondkrnz6U7VRmJj1UGcbD8MRc46c7H8m4SWhab8EalBQrkw==", "dev": true }, "d3-random": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz", - "integrity": "sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM=", + "integrity": "sha512-XuMbjx3Jq4EWfJP4g6nR7zns/bZfaVbWHWfR8auDkEiWCzVbWifmasfszV1ZRN3xXK3nY4RUFL2nTIhceGZSFQ==", "dev": true }, "d3-request": { @@ -1797,7 +1560,7 @@ "d3-shape": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", - "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", + "integrity": "sha512-LP48zJ9ykPKjCdd0vSu5k2l4s8v1vI6vvdDeJtmgtTa+L6Ery0lzvOaV7pMunFuLv11hwSRZQnSnlhFl801aiw==", "dev": true, "requires": { "d3-path": "1" @@ -1841,7 +1604,7 @@ "d3-voronoi": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", - "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=", + "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==", "dev": true }, "d3-zoom": { @@ -1857,32 +1620,79 @@ "d3-transition": "1" } }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, "requires": { - "ms": "2.1.2" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "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==", + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "requires": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true }, "diff": { @@ -1892,9 +1702,9 @@ "dev": true }, "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==" + "version": "1.4.733", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.733.tgz", + "integrity": "sha512-gUI9nhI2iBGF0OaYYLKOaOtliFMl+Bt1rY7VmEjwxOxqoYLub/D9xmduPEhbw2imE6gYkJKhIE5it+KE2ulVxQ==" }, "emoji-regex": { "version": "7.0.3", @@ -1903,28 +1713,112 @@ "dev": true }, "es-abstract": { - "version": "1.18.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", - "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "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", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", "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" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "dependencies": { + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + } + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, "es-to-primitive": { @@ -1939,14 +1833,14 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" }, "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==" }, "esprima": { "version": "4.0.1", @@ -1991,16 +1885,43 @@ "is-buffer": "~2.0.3" } }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true }, "gensync": { "version": "1.0.0-beta.2", @@ -2014,13 +1935,27 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "glob": { @@ -2042,35 +1977,78 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true }, "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } }, "he": { "version": "1.2.0", @@ -2090,7 +2068,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -2104,29 +2082,43 @@ "dev": true }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, "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 + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } }, "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==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-buffer": { @@ -2136,42 +2128,57 @@ "dev": true }, "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==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "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.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "requires": { + "hasown": "^2.0.0" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, "requires": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" } }, "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 + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "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=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true }, "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, "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 + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-reference": { "version": "1.2.1", @@ -2182,20 +2189,32 @@ } }, "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==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" } }, "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 + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-symbol": { "version": "1.0.4", @@ -2206,10 +2225,34 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "js-tokens": { @@ -2233,12 +2276,9 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "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==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "locate-path": { "version": "3.0.0", @@ -2258,7 +2298,7 @@ "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==" }, "log-symbols": { "version": "2.2.0", @@ -2269,6 +2309,14 @@ "chalk": "^2.0.1" } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -2280,7 +2328,7 @@ "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==" }, "minimatch": { "version": "3.0.4", @@ -2292,9 +2340,10 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true }, "mkdirp": { "version": "0.5.4", @@ -2351,18 +2400,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "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, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", @@ -2390,55 +2427,61 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } }, "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "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": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "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==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -2471,13 +2514,13 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-parse": { @@ -2499,6 +2542,12 @@ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -2514,48 +2563,55 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "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==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "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.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "requires": { "@babel/runtime": "^7.8.4" } }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, "requires": { - "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" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } }, "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "requires": { "jsesc": "~0.5.0" }, @@ -2563,14 +2619,14 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "require-main-filename": { @@ -2580,11 +2636,11 @@ "dev": true }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "requires": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -2592,13 +2648,31 @@ "rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "dev": true }, - "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==" + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } }, "safer-buffer": { "version": "2.1.2", @@ -2607,25 +2681,52 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "source-map": { @@ -2642,7 +2743,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "string-width": { @@ -2655,30 +2756,44 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, "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==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "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==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -2687,7 +2802,7 @@ "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=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true }, "supports-color": { @@ -2706,48 +2821,109 @@ "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==" + }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==" }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, "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==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "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==" + "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": "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==" + "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.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } }, "which": { "version": "1.3.1", @@ -2772,11 +2948,24 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -2798,9 +2987,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "string-width": { @@ -2828,13 +3017,13 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", "dev": true }, "y18n": { @@ -2843,6 +3032,11 @@ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", @@ -2862,9 +3056,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "string-width": { diff --git a/npm-packages/meteor-babel/package.json b/npm-packages/meteor-babel/package.json index 021290c089e..46d5fd4b356 100644 --- a/npm-packages/meteor-babel/package.json +++ b/npm-packages/meteor-babel/package.json @@ -1,8 +1,9 @@ { "name": "@meteorjs/babel", "author": "Meteor ", - "version": "7.19.0-beta.3", + "version": "7.20.0-beta.4", "license": "MIT", + "type": "commonjs", "description": "Babel wrapper package for use with Meteor", "keywords": [ "meteor", @@ -41,13 +42,13 @@ "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.0", "@babel/types": "^7.17.0", - "@meteorjs/reify": "https://github.com/meteor/reify/tarball/cf61c57c6c4fefcbf164bf63d3c12fda1924b3d2", + "@meteorjs/reify": "0.25.1", "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.9.4" + "typescript": "~5.4.5" }, "devDependencies": { "@babel/plugin-proposal-decorators": "7.14.5", diff --git a/npm-packages/meteor-babel/test/decorators.js b/npm-packages/meteor-babel/test/decorators.js index 3c8fed9a971..a12ceb49232 100644 --- a/npm-packages/meteor-babel/test/decorators.js +++ b/npm-packages/meteor-babel/test/decorators.js @@ -25,12 +25,11 @@ describe("@decorators", function () { .includes("decorators-legacy")); assert.ok(legacyResult.options.plugins.some(function (plugin) { - return plugin.key === "regenerator-transform"; + return plugin.key === "transform-regenerator"; })); assert.strictEqual(legacyResult.code.trim(), [ "var _class;", - "", "var A = dec(_class = function A() {}) || _class;", ].join("\n")); }); @@ -57,12 +56,11 @@ describe("@decorators", function () { .includes("decorators-legacy")); assert.ok(legacyResult.options.plugins.every(function (plugin) { - return plugin.key !== "regenerator-transform"; + return plugin.key !== "transform-regenerator"; })); assert.strictEqual(legacyResult.code.trim(), [ "var _class;", - "", "let A = dec(_class = class A {}) || _class;", ].join("\n")); }); @@ -89,12 +87,11 @@ describe("@decorators", function () { .includes("decorators-legacy")); assert.ok(legacyResult.options.plugins.every(function (plugin) { - return plugin.key !== "regenerator-transform"; + return plugin.key !== "transform-regenerator"; })); assert.strictEqual(legacyResult.code.trim(), [ "var _class;", - "", "let A = dec(_class = class A {}) || _class;", ].join("\n")); }); diff --git a/npm-packages/meteor-babel/test/tests.js b/npm-packages/meteor-babel/test/tests.js index fa7861d3ad8..2dd7a4a585b 100644 --- a/npm-packages/meteor-babel/test/tests.js +++ b/npm-packages/meteor-babel/test/tests.js @@ -315,7 +315,6 @@ describe("@meteorjs/babel", () => { " }", "});", "var Test;", - "", "(function (Test) {", " Test.enabled = true;", "})(Test || module.runSetters(Test = {}, [\"Test\"]));", diff --git a/npm-packages/meteor-installer/README.md b/npm-packages/meteor-installer/README.md index 9a84c48ecad..ab1e0156bc1 100644 --- a/npm-packages/meteor-installer/README.md +++ b/npm-packages/meteor-installer/README.md @@ -14,6 +14,9 @@ npm install -g meteor | NPM Package | Meteor Official Release | |-------------|-------------------------| +| 2.16.0 | 2.16.0 | +| 2.15.0 | 2.15.0 | +| 2.14.0 | 2.14.0 | | 2.13.3 | 2.13.3 | | 2.13.1 | 2.13.1 | | 2.13.0 | 2.13.0 | diff --git a/npm-packages/meteor-installer/cli.js b/npm-packages/meteor-installer/cli.js index ea3c2034cca..7bcc2f9eebb 100755 --- a/npm-packages/meteor-installer/cli.js +++ b/npm-packages/meteor-installer/cli.js @@ -1,10 +1,10 @@ #!/usr/bin/env node -const command = process.argv[2]; +const command = process.argv[2] || 'install'; if (!command) { console.log(` - Usage: meteor-installer + Usage: npx meteor@ Commands: install diff --git a/npm-packages/meteor-installer/config.js b/npm-packages/meteor-installer/config.js index 68ac6e2640a..2dab7f9d539 100644 --- a/npm-packages/meteor-installer/config.js +++ b/npm-packages/meteor-installer/config.js @@ -1,7 +1,7 @@ const os = require('os'); const path = require('path'); -const METEOR_LATEST_VERSION = '2.13.3'; +const METEOR_LATEST_VERSION = '3.0-rc.2'; const sudoUser = process.env.SUDO_USER || ''; function isRoot() { return process.getuid && process.getuid() === 0; @@ -12,6 +12,7 @@ function isSudo() { const localAppData = process.env.LOCALAPPDATA; const isWindows = () => os.platform() === 'win32'; const isMac = () => os.platform() === 'darwin'; +const isLinux = () => os.platform() === 'linux'; let rootPath; if (isWindows()) { @@ -47,6 +48,7 @@ module.exports = { startedPath: path.resolve(rootPath, '.meteor-install-started.txt'), isWindows, isMac, + isLinux, isRoot, isSudo, shouldSetupExecPath, diff --git a/npm-packages/meteor-installer/install.js b/npm-packages/meteor-installer/install.js index 841a4615c3b..1598e0b893d 100644 --- a/npm-packages/meteor-installer/install.js +++ b/npm-packages/meteor-installer/install.js @@ -20,7 +20,7 @@ const { rootPath, sudoUser, isSudo, - isMac, + isLinux, METEOR_LATEST_VERSION, shouldSetupExecPath, } = require('./config'); @@ -45,7 +45,9 @@ if (!semver.satisfies(process.version, nodeVersion)) { ); } -const isInstalledGlobally = process.env.npm_config_global === 'true'; +const isInstalledGlobally = + process.env.npm_config_global === 'true' || + process.env.npm_lifecycle_event === 'npx'; if (!isInstalledGlobally) { console.error('******************************************'); @@ -55,17 +57,18 @@ if (!isInstalledGlobally) { console.error('Make sure you pass -g to npm install.'); console.error('Aborting...'); console.error('******************************************'); - process.exit(1); + process.exit(0); } process.on('unhandledRejection', err => { throw err; }); + if (os.arch() !== 'x64') { const isValidM1Version = semver.gte( semver.coerce(METEOR_LATEST_VERSION), '2.5.1-beta.3', ); - if (os.arch() !== 'arm64' || !isMac() || !isValidM1Version) { + if (os.arch() !== 'arm64' || !isValidM1Version) { console.error( 'The current architecture is not supported in this version: ', os.arch(), @@ -81,9 +84,15 @@ const downloadPlatform = { linux: 'linux', }; -const url = `https://packages.meteor.com/bootstrap-link?arch=os.${ - downloadPlatform[os.platform()] -}.${os.arch() === 'arm64' ? 'arm64' : 'x86_64'}&release=${release}`; +function getDownloadArch() { + const osArch = os.arch(); + if (isLinux() && osArch === 'arm64') return 'aarch64'; + if (osArch === 'arm64') return 'arm64'; + return 'x86_64'; +} + +const arch = `os.${downloadPlatform[os.platform()]}.${getDownloadArch()}`; +const url = `https://packages.meteor.com/bootstrap-link?arch=${arch}&release=${release}`; let tempDirObject; try { @@ -121,8 +130,8 @@ if (fs.existsSync(startedPath)) { console.log( `If you want to reinstall it, run: - $ meteor-installer uninstall - $ meteor-installer install + $ npx meteor uninstall + $ npx meteor@ install `, ); process.exit(); @@ -151,6 +160,9 @@ try { } } +console.log(`=> Arch: ${arch}`); +console.log(`=> Meteor Release: ${release}`); + download(); function generateProxyAgent() { @@ -316,7 +328,7 @@ function showGettingStarted() { const exportCommand = `export PATH=${meteorPath}:$PATH`; const runCommand = isWindows() - ? `set path "${meteorPath}/;%path%` + ? `set path "${meteorPath}/;%path%"` : exportCommand; const message = ` *************************************** diff --git a/npm-packages/meteor-installer/package-lock.json b/npm-packages/meteor-installer/package-lock.json new file mode 100644 index 00000000000..9d7f78791a7 --- /dev/null +++ b/npm-packages/meteor-installer/package-lock.json @@ -0,0 +1,351 @@ +{ + "name": "meteor", + "version": "3.0.0-rc.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "requires": { + "string-width": "^4.2.3" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==" + }, + "lodash.defaultto": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/lodash.defaultto/-/lodash.defaultto-4.14.0.tgz", + "integrity": "sha512-G6tizqH6rg4P5j32Wy4Z3ZIip7OfG8YWWlPFzUFGcYStH1Ld0l1tWs6NevEQNEDnO1M3NZYjuHuraaFSN5WqeQ==" + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==" + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" + }, + "lodash.negate": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.negate/-/lodash.negate-3.0.2.tgz", + "integrity": "sha512-JGJYYVslKYC0tRMm/7igfdHulCjoXjoganRNWM8AgS+RXfOvFnPkOveDhPI65F9aAypCX9QEEQoBqWf7Q6uAeA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-7z": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-7z/-/node-7z-2.1.2.tgz", + "integrity": "sha512-mSmn90OIYKYIkuRwH1YRJl2sMwB9OlYhCQS4SPTOfxlzWwomoC1G9j4tsvAsv7vJPwvK7B76Z0a2dH5Mvwo91Q==", + "requires": { + "cross-spawn": "^7.0.2", + "debug": "^4.1.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.defaultto": "^4.14.0", + "lodash.flattendeep": "^4.4.0", + "lodash.isempty": "^4.4.0", + "lodash.negate": "^3.0.2", + "normalize-path": "^3.0.0" + } + }, + "node-downloader-helper": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/node-downloader-helper/-/node-downloader-helper-2.1.9.tgz", + "integrity": "sha512-FSvAol2Z8UP191sZtsUZwHIN0eGoGue3uEXGdWIH5228e9KH1YHXT7fN8Oa33UGf+FbqGTQg3sJfrRGzmVCaJA==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/npm-packages/meteor-installer/package.json b/npm-packages/meteor-installer/package.json index 0465731d171..e23f12c8250 100644 --- a/npm-packages/meteor-installer/package.json +++ b/npm-packages/meteor-installer/package.json @@ -1,6 +1,6 @@ { "name": "meteor", - "version": "2.13.3", + "version": "3.0.0-rc.2", "description": "Install Meteor", "main": "install.js", "scripts": { @@ -8,12 +8,13 @@ }, "author": "zodern", "license": "MIT", + "type": "commonjs", "dependencies": { "7zip-bin": "^5.2.0", "cli-progress": "^3.11.1", "https-proxy-agent": "^5.0.1", "node-7z": "^2.1.2", - "node-downloader-helper": "^1.0.19", + "node-downloader-helper": "^2.1.9", "rimraf": "^3.0.2", "semver": "^7.3.7", "tar": "^6.1.11", @@ -23,7 +24,7 @@ "meteor-installer": "cli.js" }, "engines": { - "node": "<=14.x", - "npm": "<=6.x" + "node": ">=20.x", + "npm": ">=10.x" } } diff --git a/npm-packages/meteor-node-stubs/CHANGELOG.md b/npm-packages/meteor-node-stubs/CHANGELOG.md index 8e02fcc3d8f..775ab2be538 100644 --- a/npm-packages/meteor-node-stubs/CHANGELOG.md +++ b/npm-packages/meteor-node-stubs/CHANGELOG.md @@ -1,3 +1,6 @@ +v1.2.8 - 2024-04-01 +* Add new dependency `@meteorjs/crypto-browserify` to replace `crypto-browserify` as it had unsafe dependencies. + v1.2.1 - 2022-03-17 * Fix the missing dependencies. diff --git a/npm-packages/meteor-node-stubs/package-lock.json b/npm-packages/meteor-node-stubs/package-lock.json index 0f2873a7854..2463032e992 100644 --- a/npm-packages/meteor-node-stubs/package-lock.json +++ b/npm-packages/meteor-node-stubs/package-lock.json @@ -1,79 +1,203 @@ { "name": "meteor-node-stubs", - "version": "1.2.5", - "lockfileVersion": 1, + "version": "1.2.9", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "requires": { - "bn.js": "^4.0.0", + "packages": { + "": { + "name": "meteor-node-stubs", + "version": "1.2.9", + "bundleDependencies": [ + "@meteorjs/crypto-browserify", + "assert", + "browserify-zlib", + "buffer", + "console-browserify", + "constants-browserify", + "domain-browser", + "events", + "https-browserify", + "os-browserify", + "path-browserify", + "process", + "punycode", + "querystring-es3", + "readable-stream", + "stream-browserify", + "stream-http", + "string_decoder", + "timers-browserify", + "tty-browserify", + "url", + "util", + "vm-browserify" + ], + "license": "MIT", + "dependencies": { + "@meteorjs/crypto-browserify": "^3.12.1", + "assert": "^2.1.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.7.1", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "domain-browser": "^4.23.0", + "elliptic": "^6.5.4", + "events": "^3.3.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.2", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "0.0.1", + "url": "^0.11.3", + "util": "^0.12.5", + "vm-browserify": "^1.1.2" + }, + "devDependencies": { + "rimraf": "^2.7.1" + } + }, + "node_modules/@meteorjs/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@meteorjs/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-ku23zGjNb1XJXPSPlt4QCPetc4s/cPrSahhSF11mFeQff5wBuu7QVVn/MusdHh+l3aKl6L1XMLV+OYLXvNDQ6Q==", + "inBundle": true, + "dependencies": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@meteorjs/crypto-browserify/node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "inBundle": true, + "dependencies": { "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "safe-buffer": "^5.0.1" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "inBundle": true, "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "requires": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "inBundle": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, - "available-typed-arrays": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", - "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "inBundle": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "balanced-match": { + "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 }, - "base64-js": { + "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true }, - "bn.js": { + "node_modules/bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "inBundle": true }, - "brace-expansion": { + "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, - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "brorand": { + "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "inBundle": true }, - "browserify-aes": { + "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { + "inBundle": true, + "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", @@ -82,134 +206,230 @@ "safe-buffer": "^5.0.1" } }, - "browserify-cipher": { + "node_modules/browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { + "inBundle": true, + "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", "evp_bytestokey": "^1.0.0" } }, - "browserify-des": { + "node_modules/browserify-des": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { + "inBundle": true, + "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, - "browserify-rsa": { + "node_modules/browserify-rsa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "requires": { + "inBundle": true, + "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "inBundle": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "inBundle": true + }, + "node_modules/browserify-sign/node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "inBundle": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "inBundle": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "browserify-zlib": { + "node_modules/browserify-sign/node_modules/readable-stream/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==", + "inBundle": true + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "inBundle": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserify-sign/node_modules/string_decoder/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==", + "inBundle": true + }, + "node_modules/browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { + "inBundle": true, + "dependencies": { "pako": "~1.0.5" } }, - "buffer": { + "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, - "buffer-xor": { + "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "inBundle": true }, - "builtin-status-codes": { + "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "inBundle": true }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "inBundle": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "cipher-base": { + "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { + "inBundle": true, + "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, - "concat-map": { + "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=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "console-browserify": { + "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "inBundle": true }, - "constants-browserify": { + "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "inBundle": true }, - "create-ecdh": { + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "inBundle": true + }, + "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "requires": { + "inBundle": true, + "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } } }, - "create-hash": { + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true + }, + "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { + "inBundle": true, + "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", @@ -217,11 +437,12 @@ "sha.js": "^2.4.0" } }, - "create-hmac": { + "node_modules/create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { + "inBundle": true, + "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", @@ -230,68 +451,82 @@ "sha.js": "^2.4.8" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "inBundle": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "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==", - "requires": { - "object-keys": "^1.0.12" + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "inBundle": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "des.js": { + "node_modules/des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { + "inBundle": true, + "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, - "diffie-hellman": { + "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { + "inBundle": true, + "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } } }, - "domain-browser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==" + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true + }, + "node_modules/domain-browser": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", + "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", + "inBundle": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { + "node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "inBundle": true, + "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", @@ -299,651 +534,817 @@ "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", - "requires": { - "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", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "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" - } - }, - "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==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" } }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true }, - "events": { + "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "inBundle": true, + "engines": { + "node": ">=0.8.x" + } }, - "evp_bytestokey": { + "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { + "inBundle": true, + "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "inBundle": true, + "dependencies": { + "is-callable": "^1.1.3" + } }, - "fs.realpath": { + "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 }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "inBundle": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "inBundle": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "glob": { + "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, - "requires": { + "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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "inBundle": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-bigints": { + "node_modules/has-property-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "inBundle": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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==" + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "inBundle": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "inBundle": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "hash-base": { + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "inBundle": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { + "inBundle": true, + "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" } }, - "hash.js": { + "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { + "inBundle": true, + "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, - "hmac-drbg": { + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "inBundle": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { + "inBundle": true, + "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, - "https-browserify": { + "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "inBundle": true }, - "ieee754": { + "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "requires": { - "call-bind": "^1.0.0" - } + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "inBundle": true }, - "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" - }, - "is-boolean-object": { + "node_modules/is-arguments": { "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==", - "requires": { - "call-bind": "^1.0.2" + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "inBundle": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==" - }, - "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==" + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "inBundle": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-generator-function": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", - "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "inBundle": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-nan": { + "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "requires": { + "inBundle": true, + "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==" - }, - "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==" - }, - "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==", - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "inBundle": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-typed-array": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", - "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - } + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "inBundle": true }, - "md5.js": { + "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { + "inBundle": true, + "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, - "miller-rabin": { + "node_modules/miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { + "inBundle": true, + "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "minimalistic-assert": { + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true + }, + "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "inBundle": true }, - "minimalistic-crypto-utils": { + "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "inBundle": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "inBundle": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-is": { + "node_modules/object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { + "inBundle": true, + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object-keys": { + "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==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "inBundle": true, + "engines": { + "node": ">= 0.4" + } }, - "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==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "inBundle": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "os-browserify": { + "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "inBundle": true }, - "pako": { + "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "inBundle": true + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "inBundle": true, + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-asn1/node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "inBundle": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" } }, - "path-browserify": { + "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "inBundle": true }, - "path-is-absolute": { + "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "pbkdf2": { + "node_modules/pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { + "inBundle": true, + "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", "ripemd160": "^2.0.1", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" } }, - "process": { + "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "inBundle": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "inBundle": true }, - "public-encrypt": { + "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { + "inBundle": true, + "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } } }, - "punycode": { + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true + }, + "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "inBundle": true + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "inBundle": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "querystring-es3": { + "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } }, - "randombytes": { + "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { + "inBundle": true, + "dependencies": { "safe-buffer": "^5.1.0" } }, - "randomfill": { + "node_modules/randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { + "inBundle": true, + "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "inBundle": true, + "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "rimraf": { + "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "ripemd160": { + "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { + "inBundle": true, + "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "inBundle": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, - "setimmediate": { + "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "inBundle": true }, - "sha.js": { + "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { + "inBundle": true, + "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" } }, - "stream-browserify": { + "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==", + "inBundle": 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/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "requires": { + "inBundle": true, + "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" } }, - "stream-http": { + "node_modules/stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "requires": { + "inBundle": true, + "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" } }, - "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==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "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==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { + "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { + "inBundle": true, + "dependencies": { "safe-buffer": "~5.2.0" } }, - "timers-browserify": { + "node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "requires": { + "inBundle": true, + "dependencies": { "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" } }, - "tty-browserify": { + "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "inBundle": true + }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "inBundle": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, - "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "requires": { + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "inBundle": true, + "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", "which-typed-array": "^1.1.2" } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "inBundle": true }, - "vm-browserify": { + "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, - "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==", - "requires": { - "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" - } - }, - "which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "inBundle": true + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "inBundle": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "inBundle": true, + "engines": { + "node": ">=0.4" + } } } } diff --git a/npm-packages/meteor-node-stubs/package.json b/npm-packages/meteor-node-stubs/package.json index d422247d651..e73dc0f4d61 100644 --- a/npm-packages/meteor-node-stubs/package.json +++ b/npm-packages/meteor-node-stubs/package.json @@ -2,46 +2,47 @@ "name": "meteor-node-stubs", "author": "Ben Newman ", "description": "Stub implementations of Node built-in modules, a la Browserify", - "version": "1.2.5", + "version": "1.2.9", "main": "index.js", "license": "MIT", "homepage": "https://github.com/meteor/meteor/blob/devel/npm-packages/meteor-node-stubs/README.md", + "type": "commonjs", "scripts": { "prepare": "node scripts/build-deps.js" }, "dependencies": { - "assert": "^2.0.0", + "@meteorjs/crypto-browserify": "^3.12.1", + "assert": "^2.1.0", "browserify-zlib": "^0.2.0", "buffer": "^5.7.1", "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.22.0", + "domain-browser": "^4.23.0", "elliptic": "^6.5.4", "events": "^3.3.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", + "path-browserify": "^1.0.1", "process": "^0.11.10", "punycode": "^1.4.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", + "readable-stream": "^3.6.2", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", + "url": "^0.11.3", + "util": "^0.12.5", "vm-browserify": "^1.1.2" }, "bundledDependencies": [ + "@meteorjs/crypto-browserify", "assert", "browserify-zlib", "buffer", "console-browserify", "constants-browserify", - "crypto-browserify", "domain-browser", "events", "https-browserify", @@ -61,7 +62,7 @@ "vm-browserify" ], "devDependencies": { - "rimraf": "^2.5.2" + "rimraf": "^2.7.1" }, "repository": { "type": "git", diff --git a/npm-packages/meteor-node-stubs/wrappers/crypto.js b/npm-packages/meteor-node-stubs/wrappers/crypto.js index 206074a0afc..f5128a20021 100644 --- a/npm-packages/meteor-node-stubs/wrappers/crypto.js +++ b/npm-packages/meteor-node-stubs/wrappers/crypto.js @@ -1,2 +1,2 @@ global.Buffer = global.Buffer || require("buffer").Buffer; -module.exports = require("crypto-browserify"); +module.exports = require("@meteorjs/crypto-browserify"); diff --git a/npm-packages/meteor-promise/package.json b/npm-packages/meteor-promise/package.json index 3514628887a..c69cc4a3fb9 100644 --- a/npm-packages/meteor-promise/package.json +++ b/npm-packages/meteor-promise/package.json @@ -1,8 +1,9 @@ { "name": "meteor-promise", "author": "Ben Newman ", - "version": "0.9.1", + "version": "0.9.2", "description": "ES6 Promise polyfill with Fiber support", + "type": "commonjs", "keywords": [ "meteor", "promise", diff --git a/npm-packages/meteor-promise/promise_server.js b/npm-packages/meteor-promise/promise_server.js index 5f6501da96a..c2c569c3b44 100644 --- a/npm-packages/meteor-promise/promise_server.js +++ b/npm-packages/meteor-promise/promise_server.js @@ -9,7 +9,7 @@ exports.makeCompatible = function (Promise, Fiber) { } if (es6PromiseThen.name === "meteorPromiseThen") { - return; // Already compatible. + return; // Already compatible } function meteorPromiseThen(onResolved, onRejected) { diff --git a/package-lock.json b/package-lock.json index ce3cfffa5a7..68857775410 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,352 +4,596 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, "@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true }, "@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + } + }, + "@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "requires": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/eslint-parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz", - "integrity": "sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", "dev": true, "requires": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" } }, "@babel/eslint-plugin": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.19.1.tgz", - "integrity": "sha512-ElGPkQPapKMa3zVqXHkZYzuL7I5LbRw9UWBUArgWsdWDDb9XcACqOpBib5tRPA9XvbVZYrFUkoQPbiJ4BFvu4w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.23.5.tgz", + "integrity": "sha512-03+E/58Hoo/ui69gR+beFdGpplpoVK0BSIdke2iw4/Bz7eGN0ssRenNlnU4nmbkowNQOPCStKSwFr8H6DiY49g==", "dev": true, "requires": { "eslint-rule-composer": "^0.3.0" } }, - "@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "requires": { - "@babel/types": "^7.21.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/types": "^7.22.5" }, "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/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" } } } }, - "@babel/helper-annotate-as-pure": { - "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==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { - "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==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" + }, + "dependencies": { + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-plugin-utils": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==" }, "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true }, "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + } + }, + "@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "requires": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "dev": true - }, "@babel/plugin-syntax-jsx": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-react-display-name": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", - "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.21.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-react-jsx-development": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dev": true, "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.22.5" } }, "@babel/plugin-transform-react-pure-annotations": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" } }, "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", + "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "regenerator-runtime": "^0.14.0" } }, "@eslint-community/eslint-utils": { @@ -362,28 +606,28 @@ }, "dependencies": { "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true } } }, "@eslint-community/regexpp": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", - "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true }, "@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -392,32 +636,70 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true } } }, "@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@humanwhocodes/module-importer": { @@ -427,25 +709,26 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "@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==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true }, "@jridgewell/set-array": { @@ -455,19 +738,19 @@ "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { - "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==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@nicolo-ribaudo/eslint-scope-5-internals": { @@ -477,6 +760,18 @@ "dev": true, "requires": { "eslint-scope": "5.1.1" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } } }, "@nodelib/fs.scandir": { @@ -506,9 +801,9 @@ } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/json5": { @@ -518,35 +813,47 @@ "dev": true }, "@types/node": { - "version": "18.16.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.18.tgz", - "integrity": "sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw==", - "dev": true + "version": "18.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", + "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", - "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/type-utils": "5.57.0", - "@typescript-eslint/utils": "5.57.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -556,10 +863,16 @@ "yallist": "^4.0.0" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -574,53 +887,87 @@ } }, "@typescript-eslint/parser": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", - "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@typescript-eslint/scope-manager": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", - "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" } }, "@typescript-eslint/type-utils": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", - "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.57.0", - "@typescript-eslint/utils": "5.57.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@typescript-eslint/types": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", - "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", - "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -628,6 +975,15 @@ "tsutils": "^3.21.0" }, "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -637,10 +993,16 @@ "yallist": "^4.0.0" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -655,21 +1017,31 @@ } }, "@typescript-eslint/utils": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", - "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -680,9 +1052,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -697,27 +1069,33 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", - "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true } } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true }, "acorn-jsx": { @@ -760,34 +1138,35 @@ "dev": true }, "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "requires": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" } }, "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, @@ -797,68 +1176,127 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, - "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" } }, "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "axe-core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", - "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true }, "axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", "dev": true, "requires": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "balanced-match": { @@ -877,35 +1315,29 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" } }, "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": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -915,9 +1347,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001470", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", - "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", "dev": true }, "chalk": { @@ -953,9 +1385,9 @@ "dev": true }, "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "cross-spawn": { @@ -975,38 +1407,46 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "requires": { - "ms": "2.1.2" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" } }, "deep-is": { @@ -1015,16 +1455,34 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1044,94 +1502,129 @@ } }, "electron-to-chromium": { - "version": "1.4.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", - "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "1.4.615", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz", + "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==", "dev": true }, "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.15" } }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + } + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" } }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "es-to-primitive": { @@ -1158,27 +1651,28 @@ "dev": true }, "eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1186,25 +1680,40 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "requires": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + } + }, + "@babel/highlight": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "requires": { + "@babel/helper-validator-identifier": "^7.24.5", + "picocolors": "^1.0.0" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1239,6 +1748,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1246,9 +1764,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -1256,9 +1774,9 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "estraverse": { @@ -1267,6 +1785,16 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1277,9 +1805,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -1291,6 +1819,39 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1299,61 +1860,45 @@ "requires": { "has-flag": "^4.0.0" } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true } } }, "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true }, "eslint-config-vazco": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-vazco/-/eslint-config-vazco-7.1.0.tgz", - "integrity": "sha512-705HI9OdfrOUCxt12yxxmyJuAyJGRz/hdXMnbqeXVqlsgXN+sUkxoysZ7qHQ8IyypqUTTw29gkq2SaK3qk109Q==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-vazco/-/eslint-config-vazco-7.3.0.tgz", + "integrity": "sha512-OK8xVmrSxkd+Jl2OAvhwVquAMP5Xanz4mMxrBvPdtv2Ld25xI9CsbPNsFoRHOoBsu5sS5EYUdvpRy7tFk2R6Dg==", "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "requires": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "requires": { "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "eslint-plugin-eslint-comments": { @@ -1367,37 +1912,30 @@ } }, "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -1406,31 +1944,45 @@ "requires": { "esutils": "^2.0.2" } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true } } }, "eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + } } }, "eslint-plugin-prettier": { @@ -1443,26 +1995,29 @@ } }, "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" }, "dependencies": { "doctrine": { @@ -1481,15 +2036,21 @@ "dev": true }, "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true } } }, @@ -1505,16 +2066,6 @@ "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", "dev": true }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -1522,20 +2073,20 @@ "dev": true }, "espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true } } @@ -1593,15 +2144,15 @@ "dev": true }, "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -1609,6 +2160,51 @@ "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, "fast-json-stable-stringify": { @@ -1624,9 +2220,9 @@ "dev": true }, "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -1641,39 +2237,21 @@ "flat-cache": "^3.0.4" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "requires": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "for-each": { @@ -1692,21 +2270,21 @@ "dev": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functions-have-names": { @@ -1722,24 +2300,27 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "glob": { @@ -1772,12 +2353,13 @@ "dev": true }, "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "requires": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" } }, "globby": { @@ -1803,21 +2385,12 @@ "get-intrinsic": "^1.1.3" } }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -1831,18 +2404,18 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "requires": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true }, "has-symbols": { @@ -1852,18 +2425,27 @@ "dev": true }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" } }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true }, "import-fresh": { @@ -1899,35 +2481,33 @@ "dev": true }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.1" } }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "is-bigint": { @@ -1956,12 +2536,21 @@ "dev": true }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "requires": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" } }, "is-date-object": { @@ -1979,6 +2568,24 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1989,21 +2596,15 @@ } }, "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, "is-number-object": { @@ -2032,18 +2633,18 @@ } }, "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true }, "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" } }, "is-string": { @@ -2065,22 +2666,18 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" } }, "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true }, "is-weakref": { @@ -2093,13 +2690,13 @@ } }, "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" } }, "isarray": { @@ -2114,16 +2711,23 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true + "iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "requires": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } }, "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", "dev": true }, "js-yaml": { @@ -2141,6 +2745,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2154,19 +2764,33 @@ "dev": true }, "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } }, "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" } }, "language-subtag-registry": { @@ -2176,12 +2800,12 @@ "dev": true }, "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "requires": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" } }, "levn": { @@ -2194,15 +2818,6 @@ "type-check": "~0.4.0" } }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2218,31 +2833,12 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2259,9 +2855,9 @@ "dev": true }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "natural-compare": { @@ -2277,9 +2873,9 @@ "dev": true }, "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "object-assign": { @@ -2289,21 +2885,11 @@ "dev": true }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -2311,58 +2897,71 @@ "dev": true }, "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" } }, "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dev": true, "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "once": { @@ -2375,35 +2974,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" + "type-check": "^0.4.0" } }, "parent-module": { @@ -2448,8 +3029,7 @@ "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", @@ -2457,6 +3037,12 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2464,9 +3050,9 @@ "dev": true }, "prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true }, "prettier-linter-helpers": { @@ -2490,9 +3076,9 @@ } }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "queue-microtask": { @@ -2507,30 +3093,46 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + } + }, "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -2565,23 +3167,61 @@ "queue-microtask": "^1.2.2" } }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2598,14 +3238,15 @@ "dev": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "slash": { @@ -2614,62 +3255,58 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "requires": { - "internal-slot": "^1.0.4" - } - }, "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" } }, "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { @@ -2720,36 +3357,16 @@ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } } }, "tslib": { @@ -2776,27 +3393,62 @@ "prelude-ls": "^1.2.1" } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } }, "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true }, "unbox-primitive": { @@ -2811,10 +3463,16 @@ "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -2852,50 +3510,57 @@ "is-symbol": "^1.0.3" } }, + "which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "requires": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" } }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 808a91d2d92..16de72f280b 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "prettier": "^2.8.6", - "typescript": "^4.9.5" + "typescript": "^5.4.5" }, "jshintConfig": { "esversion": 11 diff --git a/packages/accounts-2fa/.npm/package/npm-shrinkwrap.json b/packages/accounts-2fa/.npm/package/npm-shrinkwrap.json index 020730fb2c7..219063698ca 100644 --- a/packages/accounts-2fa/.npm/package/npm-shrinkwrap.json +++ b/packages/accounts-2fa/.npm/package/npm-shrinkwrap.json @@ -2,9 +2,9 @@ "lockfileVersion": 4, "dependencies": { "@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==" + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==" }, "@types/notp": { "version": "2.0.5", diff --git a/packages/accounts-2fa/package.js b/packages/accounts-2fa/package.js index 22a4e985770..14d8c98f029 100644 --- a/packages/accounts-2fa/package.js +++ b/packages/accounts-2fa/package.js @@ -1,5 +1,5 @@ Package.describe({ - version: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', summary: 'Package used to enable two factor authentication through OTP protocol', }); diff --git a/packages/accounts-base/accounts-base.d.ts b/packages/accounts-base/accounts-base.d.ts index 1e1ae22c09b..7f3638bcc19 100644 --- a/packages/accounts-base/accounts-base.d.ts +++ b/packages/accounts-base/accounts-base.d.ts @@ -1,6 +1,7 @@ import { Mongo } from 'meteor/mongo'; import { Meteor } from 'meteor/meteor'; import { Configuration } from 'meteor/service-configuration'; +import { DDP } from 'meteor/ddp'; export interface URLS { resetPassword: (token: string) => string; @@ -15,6 +16,16 @@ export interface EmailFields { html?: ((user: Meteor.User, url: string) => string) | undefined; } +export interface AccountsClientOptions { + connection?: DDP.DDPStatic; + ddpUrl?: string; +} + +export class AccountsClient { + constructor(options?: AccountsClientOptions); + connection: DDP.DDPStatic; +} + export namespace Accounts { var urls: URLS; @@ -48,16 +59,34 @@ export namespace Accounts { callback?: (error?: Error | Meteor.Error | Meteor.TypedError) => void ): Promise; + function createUserVerifyingEmail( + options: { + username?: string | undefined; + email?: string | undefined; + password?: string | undefined; + profile?: Meteor.UserProfile | undefined; + }, + callback?: (error?: Error | Meteor.Error | Meteor.TypedError) => void + ): Promise; + function config(options: { sendVerificationEmail?: boolean | undefined; forbidClientAccountCreation?: boolean | undefined; restrictCreationByEmailDomain?: string | Function | undefined; + loginExpiration?: number | undefined; loginExpirationInDays?: number | undefined; oauthSecretKey?: string | undefined; + passwordResetTokenExpiration?: number | undefined; passwordResetTokenExpirationInDays?: number | undefined; + passwordEnrollTokenExpiration?: number | undefined; passwordEnrollTokenExpirationInDays?: number | undefined; ambiguousErrorMessages?: boolean | undefined; + bcryptRounds?: number | undefined; defaultFieldSelector?: { [key: string]: 0 | 1 } | undefined; + collection?: string | undefined; + loginTokenExpirationHours?: number | undefined; + tokenSequenceLength?: number | undefined; + clientStorage?: 'session' | 'local'; }): void; function onLogin( @@ -191,12 +220,6 @@ export namespace Accounts { function setUsername(userId: string, newUsername: string): void; - function setPassword( - userId: string, - newPassword: string, - options?: { logout?: boolean | undefined } - ): void; - function setPasswordAsync( userId: string, newPassword: string, @@ -324,9 +347,9 @@ export namespace Accounts { type Password = | string | { - digest: string; - algorithm: 'sha-256'; - }; + digest: string; + algorithm: 'sha-256'; + }; /** * @@ -336,7 +359,7 @@ export namespace Accounts { * properties `digest` and `algorithm` (in which case we bcrypt * `password.digest`). */ - function _checkPassword( + function _checkPasswordAsync( user: Meteor.User, password: Password ): { userId: string; error?: any }; diff --git a/packages/accounts-base/accounts_client.js b/packages/accounts-base/accounts_client.js index f04fd32d74a..bbe8e08115b 100644 --- a/packages/accounts-base/accounts_client.js +++ b/packages/accounts-base/accounts_client.js @@ -9,6 +9,7 @@ import {AccountsCommon} from "./accounts_common.js"; * @param {Object} options an object with fields: * @param {Object} options.connection Optional DDP connection to reuse. * @param {String} options.ddpUrl Optional URL for creating a new DDP connection. + * @param {'session' | 'local'} options.clientStorage Optional Define what kind of storage you want for credentials on the client. Default is 'local' to use `localStorage`. Set to 'session' to use session storage. */ export class AccountsClient extends AccountsCommon { constructor(options) { @@ -26,6 +27,8 @@ export class AccountsClient extends AccountsCommon { this.savedHash = window.location.hash; this._initUrlMatching(); + this.initStorageLocation(); + // Defined in localstorage_token.js. this._initLocalStorage(); @@ -37,6 +40,17 @@ export class AccountsClient extends AccountsCommon { this._loginCallbacksCalled = false; } + initStorageLocation(options) { + // Determine whether to use local or session storage to storage credentials and anything else. + this.storageLocation = (options?.clientStorage === 'session' || Meteor.settings?.public?.packages?.accounts?.clientStorage === 'session') ? window.sessionStorage : Meteor._localStorage; + } + + config(options) { + super.config(options); + + this.initStorageLocation(options); + } + /// /// CURRENT USER /// @@ -229,13 +243,14 @@ export class AccountsClient extends AccountsCommon { const loginCallbacks = ({ error, loginDetails }) => { if (!called) { called = true; - this._loginCallbacksCalled = true; if (!error) { this._onLoginHook.forEach(callback => { callback(loginDetails); return true; }); + this._loginCallbacksCalled = true; } else { + this._loginCallbacksCalled = false; this._onLoginFailureHook.forEach(callback => { callback({ error }); return true; @@ -364,12 +379,18 @@ export class AccountsClient extends AccountsCommon { // Make the client logged in. (The user data should already be loaded!) this.makeClientLoggedIn(result.id, result.token, result.tokenExpires); - // TODO [FIBERS]: this is a big workaround. The Tracker is now receiving promises, - // so it's finishing before time. Hopefully this PR will fix this behavior - // https://github.com/meteor/meteor/pull/12294 - Meteor.setTimeout(() => { - loginCallbacks({ loginDetails: result }); - }, 100); + + // use Tracker to make we sure have a user before calling the callbacks + Tracker.autorun(async function (computation) { + const user = await Tracker.withComputation(computation, () => + Meteor.userAsync(), + ); + + if (user) { + loginCallbacks({ loginDetails: result }) + } + }); + }; if (!options._suppressLoggingIn) { @@ -504,11 +525,11 @@ export class AccountsClient extends AccountsCommon { }; _storeLoginToken(userId, token, tokenExpires) { - Meteor._localStorage.setItem(this.USER_ID_KEY, userId); - Meteor._localStorage.setItem(this.LOGIN_TOKEN_KEY, token); + this.storageLocation.setItem(this.USER_ID_KEY, userId); + this.storageLocation.setItem(this.LOGIN_TOKEN_KEY, token); if (! tokenExpires) tokenExpires = this._tokenExpiration(new Date()); - Meteor._localStorage.setItem(this.LOGIN_TOKEN_EXPIRES_KEY, tokenExpires); + this.storageLocation.setItem(this.LOGIN_TOKEN_EXPIRES_KEY, tokenExpires); // to ensure that the localstorage poller doesn't end up trying to // connect a second time @@ -516,9 +537,9 @@ export class AccountsClient extends AccountsCommon { }; _unstoreLoginToken() { - Meteor._localStorage.removeItem(this.USER_ID_KEY); - Meteor._localStorage.removeItem(this.LOGIN_TOKEN_KEY); - Meteor._localStorage.removeItem(this.LOGIN_TOKEN_EXPIRES_KEY); + this.storageLocation.removeItem(this.USER_ID_KEY); + this.storageLocation.removeItem(this.LOGIN_TOKEN_KEY); + this.storageLocation.removeItem(this.LOGIN_TOKEN_EXPIRES_KEY); // to ensure that the localstorage poller doesn't end up trying to // connect a second time @@ -528,15 +549,15 @@ export class AccountsClient extends AccountsCommon { // This is private, but it is exported for now because it is used by a // test in accounts-password. _storedLoginToken() { - return Meteor._localStorage.getItem(this.LOGIN_TOKEN_KEY); + return this.storageLocation.getItem(this.LOGIN_TOKEN_KEY); }; _storedLoginTokenExpires() { - return Meteor._localStorage.getItem(this.LOGIN_TOKEN_EXPIRES_KEY); + return this.storageLocation.getItem(this.LOGIN_TOKEN_EXPIRES_KEY); }; _storedUserId() { - return Meteor._localStorage.getItem(this.USER_ID_KEY); + return this.storageLocation.getItem(this.USER_ID_KEY); }; _unstoreLoginTokenIfExpiresSoon() { @@ -742,7 +763,7 @@ export class AccountsClient extends AccountsCommon { this._accountsCallbacks["enroll-account"] = callback; }; -}; +} /** * @summary True if a login method (such as `Meteor.loginWithPassword`, diff --git a/packages/accounts-base/accounts_client_tests.js b/packages/accounts-base/accounts_client_tests.js index 5b51edccb66..96e88b110a8 100644 --- a/packages/accounts-base/accounts_client_tests.js +++ b/packages/accounts-base/accounts_client_tests.js @@ -53,7 +53,7 @@ const removeTestUser = done => { }; const forceEnableUser2fa = done => { - Meteor.callAsync('forceEnableUser2fa', {returnServerPromise:true}, { username }, secret2fa).then((token) => { + Meteor.callAsync('forceEnableUser2fa', { username }, secret2fa).then((token) => { done(token); }); }; @@ -304,3 +304,42 @@ Tinytest.addAsync( } ); +Tinytest.addAsync('accounts - storage', + async function(test) { + const expectWhenSessionStorage = () => { + test.isNotUndefined(sessionStorage.getItem('Meteor.loginToken')); + test.isNull(localStorage.getItem('Meteor.loginToken')); + }; + const expectWhenLocalStorage = () => { + test.isNotUndefined(localStorage.getItem('Meteor.loginToken')); + test.isNull(sessionStorage.getItem('Meteor.loginToken')); + }; + + const testCases = [{ + clientStorage: undefined, + expectStorage: expectWhenLocalStorage, + }, { + clientStorage: 'local', + expectStorage: expectWhenLocalStorage, + }, { + clientStorage: 'session', + expectStorage: expectWhenSessionStorage, + }]; + for await (const testCase of testCases) { + await new Promise(resolve => { + sessionStorage.clear(); + localStorage.clear(); + + const { clientStorage, expectStorage } = testCase; + Accounts.config({ clientStorage }); + test.equal(Accounts._options.clientStorage, clientStorage); + + // Login a user and test that tokens are in expected storage + logoutAndCreateUser(test, resolve, () => { + Accounts.logout(); + expectStorage(); + removeTestUser(resolve); + }); + }); + } + }); diff --git a/packages/accounts-base/accounts_common.js b/packages/accounts-base/accounts_common.js index 6cf77f33e7e..1159257dffc 100644 --- a/packages/accounts-base/accounts_common.js +++ b/packages/accounts-base/accounts_common.js @@ -4,19 +4,21 @@ import { Meteor } from 'meteor/meteor'; const VALID_CONFIG_KEYS = [ 'sendVerificationEmail', 'forbidClientAccountCreation', - 'passwordEnrollTokenExpiration', - 'passwordEnrollTokenExpirationInDays', 'restrictCreationByEmailDomain', - 'loginExpirationInDays', 'loginExpiration', + 'loginExpirationInDays', + 'oauthSecretKey', 'passwordResetTokenExpirationInDays', 'passwordResetTokenExpiration', + 'passwordEnrollTokenExpirationInDays', + 'passwordEnrollTokenExpiration', 'ambiguousErrorMessages', 'bcryptRounds', 'defaultFieldSelector', + 'collection', 'loginTokenExpirationHours', 'tokenSequenceLength', - 'collection', + 'clientStorage', ]; /** @@ -203,7 +205,7 @@ export class AccountsCommon { // A collection name or a Mongo.Collection object to hold the users. // - passwordResetTokenExpirationInDays {Number} // Number of days since password reset token creation until the - // token cannt be used any longer (password reset token expires). + // token can't be used any longer (password reset token expires). // - ambiguousErrorMessages {Boolean} // Return ambiguous error messages from login failures to prevent // user enumeration. @@ -218,18 +220,20 @@ export class AccountsCommon { * @param {Boolean} options.sendVerificationEmail New users with an email address will receive an address verification email. * @param {Boolean} options.forbidClientAccountCreation Calls to [`createUser`](#accounts_createuser) from the client will be rejected. In addition, if you are using [accounts-ui](#accountsui), the "Create account" link will not be available. * @param {String | Function} options.restrictCreationByEmailDomain If set to a string, only allows new users if the domain part of their email address matches the string. If set to a function, only allows new users if the function returns true. The function is passed the full email address of the proposed new user. Works with password-based sign-in and external services that expose email addresses (Google, Facebook, GitHub). All existing users still can log in after enabling this option. Example: `Accounts.config({ restrictCreationByEmailDomain: 'school.edu' })`. - * @param {Number} options.loginExpirationInDays The number of days from when a user logs in until their token expires and they are logged out. Defaults to 90. Set to `null` to disable login expiration. * @param {Number} options.loginExpiration The number of milliseconds from when a user logs in until their token expires and they are logged out, for a more granular control. If `loginExpirationInDays` is set, it takes precedent. + * @param {Number} options.loginExpirationInDays The number of days from when a user logs in until their token expires and they are logged out. Defaults to 90. Set to `null` to disable login expiration. * @param {String} options.oauthSecretKey When using the `oauth-encryption` package, the 16 byte key using to encrypt sensitive account credentials in the database, encoded in base64. This option may only be specified on the server. See packages/oauth-encryption/README.md for details. * @param {Number} options.passwordResetTokenExpirationInDays The number of days from when a link to reset password is sent until token expires and user can't reset password with the link anymore. Defaults to 3. * @param {Number} options.passwordResetTokenExpiration The number of milliseconds from when a link to reset password is sent until token expires and user can't reset password with the link anymore. If `passwordResetTokenExpirationInDays` is set, it takes precedent. * @param {Number} options.passwordEnrollTokenExpirationInDays The number of days from when a link to set initial password is sent until token expires and user can't set password with the link anymore. Defaults to 30. * @param {Number} options.passwordEnrollTokenExpiration The number of milliseconds from when a link to set initial password is sent until token expires and user can't set password with the link anymore. If `passwordEnrollTokenExpirationInDays` is set, it takes precedent. - * @param {Boolean} options.ambiguousErrorMessages Return ambiguous error messages from login failures to prevent user enumeration. Defaults to false. + * @param {Boolean} options.ambiguousErrorMessages Return ambiguous error messages from login failures to prevent user enumeration. Defaults to `false`, but in production environments it is recommended it defaults to `true`. + * @param {Number} options.bcryptRounds Allows override of number of bcrypt rounds (aka work factor) used to store passwords. The default is 10. * @param {MongoFieldSpecifier} options.defaultFieldSelector To exclude by default large custom fields from `Meteor.user()` and `Meteor.findUserBy...()` functions when called without a field selector, and all `onLogin`, `onLoginFailure` and `onLogout` callbacks. Example: `Accounts.config({ defaultFieldSelector: { myBigArray: 0 }})`. Beware when using this. If, for instance, you do not include `email` when excluding the fields, you can have problems with functions like `forgotPassword` that will break because they won't have the required data available. It's recommend that you always keep the fields `_id`, `username`, and `email`. * @param {String|Mongo.Collection} options.collection A collection name or a Mongo.Collection object to hold the users. * @param {Number} options.loginTokenExpirationHours When using the package `accounts-2fa`, use this to set the amount of time a token sent is valid. As it's just a number, you can use, for example, 0.5 to make the token valid for just half hour. The default is 1 hour. * @param {Number} options.tokenSequenceLength When using the package `accounts-2fa`, use this to the size of the token sequence generated. The default is 6. + * @param {'session' | 'local'} options.clientStorage By default login credentials are stored in local storage, setting this to true will switch to using session storage. */ config(options) { // We don't want users to accidentally only call Accounts.config on the @@ -281,7 +285,7 @@ export class AccountsCommon { VALID_CONFIG_KEYS.forEach(key => { if (key in options) { if (key in this._options) { - if (key !== 'collection') { + if (key !== 'collection' && (Meteor.isTest && key !== 'clientStorage')) { throw new Meteor.Error(`Can't set \`${key}\` more than once`); } } @@ -419,14 +423,14 @@ export class AccountsCommon { /** * @summary Get the current user id, or `null` if no user is logged in. A reactive data source. - * @locus Anywhere but publish functions + * @locus Anywhere * @importFromPackage meteor */ Meteor.userId = () => Accounts.userId(); /** * @summary Get the current user record, or `null` if no user is logged in. A reactive data source. - * @locus Anywhere but publish functions + * @locus Anywhere * @importFromPackage meteor * @param {Object} [options] * @param {MongoFieldSpecifier} options.fields Dictionary of fields to return or exclude. @@ -435,7 +439,7 @@ 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 + * @locus Anywhere * @importFromPackage meteor * @param {Object} [options] * @param {MongoFieldSpecifier} options.fields Dictionary of fields to return or exclude. diff --git a/packages/accounts-base/accounts_server.js b/packages/accounts-base/accounts_server.js index e8115898673..c50fdce9a71 100644 --- a/packages/accounts-base/accounts_server.js +++ b/packages/accounts-base/accounts_server.js @@ -181,7 +181,7 @@ export class AccountsServer extends AccountsCommon { } this._onCreateLoginTokenHook = func; - }; + } /** * @summary Customize new user creation. @@ -716,7 +716,7 @@ export class AccountsServer extends AccountsCommon { // Allow a one-time configuration for a login service. Modifications // to this collection are also allowed in insecure mode. - methods.configureLoginService = (options) => { + methods.configureLoginService = async (options) => { check(options, Match.ObjectIncluding({service: String})); // Don't let random users configure a service we haven't added yet (so // that when we do later add it, it's set up with their configuration @@ -731,7 +731,8 @@ export class AccountsServer extends AccountsCommon { if (Package['service-configuration']) { const { ServiceConfiguration } = Package['service-configuration']; - if (ServiceConfiguration.configurations.findOneAsync({service: options.service})) + const service = await ServiceConfiguration.configurations.findOneAsync({service: options.service}) + if (service) throw new Meteor.Error(403, `Service ${options.service} already configured`); if (Package["oauth-encryption"]) { @@ -740,7 +741,7 @@ export class AccountsServer extends AccountsCommon { options.secret = OAuthEncryption.seal(options.secret); } - ServiceConfiguration.configurations.insert(options); + await ServiceConfiguration.configurations.insertAsync(options); } }; @@ -1518,9 +1519,10 @@ export class AccountsServer extends AccountsCommon { } _handleError = (msg, throwError = true, errorCode = 403) => { + const isErrorAmbiguous = this._options.ambiguousErrorMessages ?? Meteor.isProduction; const error = new Meteor.Error( errorCode, - this._options.ambiguousErrorMessages + isErrorAmbiguous ? "Something went wrong. Please check your credentials." : msg ); diff --git a/packages/accounts-base/accounts_tests.js b/packages/accounts-base/accounts_tests.js index 506de9abe09..d6340dc076a 100644 --- a/packages/accounts-base/accounts_tests.js +++ b/packages/accounts-base/accounts_tests.js @@ -238,7 +238,7 @@ Tinytest.addAsync('accounts - login token', async (test) => { connection = DDP.connect(Meteor.absoluteUrl()); // evil plan foiled await test.throwsAsync( - async () => await connection.callAsync('login', { returnStubValue: true }, { resume: stolenToken2 }), + async () => await connection.callAsync('login', { resume: stolenToken2 }), /You\'ve been logged out by the server/ ); connection.disconnect(); @@ -251,7 +251,7 @@ Tinytest.addAsync('accounts - login token', async (test) => { const stampedToken2 = Accounts._generateStampedLoginToken(); await insertUnhashedLoginToken(userId4, stampedToken2); connection = DDP.connect(Meteor.absoluteUrl()); - await connection.callAsync('login', { returnStubValue: true }, { resume: stampedToken2.token }); + await connection.callAsync('login', { resume: stampedToken2.token }); connection.disconnect(); // The token is no longer available to be stolen. @@ -296,15 +296,15 @@ Tinytest.addAsync('accounts - get new token', async test => { await Accounts._insertLoginToken(userId, stampedToken); const conn = DDP.connect(Meteor.absoluteUrl()); - await conn.callAsync('login', { returnStubValue: true }, { resume: stampedToken.token }); - test.equal(await conn.callAsync('getCurrentLoginToken', { returnServerPromise: true }), + await conn.callAsync('login', { resume: stampedToken.token }); + test.equal(await conn.callAsync('getCurrentLoginToken'), Accounts._hashLoginToken(stampedToken.token)); - const newTokenResult = await conn.callAsync('getNewToken', { returnServerPromise: true }); + const newTokenResult = await conn.callAsync('getNewToken'); test.equal(newTokenResult.tokenExpires, Accounts._tokenExpiration(stampedToken.when)); - const token = await conn.callAsync('getCurrentLoginToken', { returnServerPromise: true }); - test.equal(await conn.callAsync('getCurrentLoginToken', { returnServerPromise: true }), + const token = await conn.callAsync('getCurrentLoginToken'); + test.equal(await conn.callAsync('getCurrentLoginToken'), Accounts._hashLoginToken(newTokenResult.token)); conn.disconnect(); @@ -329,7 +329,7 @@ Tinytest.addAsync('accounts - remove other tokens', async (test) => { await Accounts._insertLoginToken(userId, stampedTokens[i]); const conn = DDP.connect(Meteor.absoluteUrl()); await conn.callAsync('login', { resume: stampedTokens[i].token }); - test.equal(await conn.callAsync('getCurrentLoginToken', { returnServerPromise: true }), + test.equal(await conn.callAsync('getCurrentLoginToken'), Accounts._hashLoginToken(stampedTokens[i].token)); conns.push(conn); } @@ -339,7 +339,7 @@ Tinytest.addAsync('accounts - remove other tokens', async (test) => { simplePoll(async () => { let tokens = []; for (const conn of conns) { - tokens.push(await conn.callAsync('getCurrentLoginToken', { returnServerPromise: true })); + tokens.push(await conn.callAsync('getCurrentLoginToken')); } return !tokens[1] && tokens[0] === Accounts._hashLoginToken(stampedTokens[0].token); @@ -381,18 +381,18 @@ Tinytest.addAsync( // On a new connection, Meteor.userId() should be null until logged in. let validateAttemptExpectedUserId = null; const onLoginExpectedUserId = userId; - await conn.callAsync('login', { returnServerPromise: true }, { resume: stampedToken.token }); + await conn.callAsync('login', { resume: stampedToken.token }); // Now that the user is logged in on the connection, Meteor.userId() should // return that user. validateAttemptExpectedUserId = userId; - await conn.callAsync('login', { returnServerPromise: true }, { resume: stampedToken.token }); + await conn.callAsync('login', { resume: stampedToken.token }); // Trigger onLoginFailure callbacks const onLoginFailureExpectedUserId = userId; await test.throwsAsync( async () => - await conn.callAsync('login', { returnServerPromise: true }, { resume: "bogus" }), '403'); + await conn.callAsync('login', { resume: "bogus" }), '403'); // Trigger onLogout callbacks const onLogoutExpectedUserId = userId; @@ -437,23 +437,23 @@ Tinytest.addAsync( // test a new connection let allowLogin = true; - await conn.callAsync('login', { returnServerPromise: true }, { resume: stampedToken.token }); + await conn.callAsync('login', { resume: stampedToken.token }); // Now that the user is logged in on the connection, Meteor.userId() should // return that user. - await conn.callAsync('login', { returnServerPromise: true }, { resume: stampedToken.token }); + await conn.callAsync('login', { resume: stampedToken.token }); // Trigger onLoginFailure callbacks, this will not include the user object allowLogin = 'bogus'; await test.throwsAsync( async () => - await conn.callAsync('login', { returnServerPromise: true }, { resume: "bogus" }), '403'); + await conn.callAsync('login', { resume: "bogus" }), '403'); // test a forced login fail which WILL include the user object allowLogin = false; await test.throwsAsync( async () => - await conn.callAsync('login', { returnServerPromise: true }, { resume: stampedToken.token }), '403'); + await conn.callAsync('login', { resume: stampedToken.token }), '403'); // Trigger onLogout callbacks const onLogoutExpectedUserId = userId; diff --git a/packages/accounts-base/client_main.js b/packages/accounts-base/client_main.js index b3022e862a2..09a9cf84f92 100644 --- a/packages/accounts-base/client_main.js +++ b/packages/accounts-base/client_main.js @@ -7,7 +7,7 @@ import { * @namespace Accounts * @summary The namespace for all client-side accounts-related methods. */ -Accounts = new AccountsClient(); +Accounts = new AccountsClient(Meteor.settings?.public?.packages?.accounts || {}); /** * @summary A [Mongo.Collection](#collections) containing user documents. diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js index ea079ec5819..40bdee951ce 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: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-base/server_main.js b/packages/accounts-base/server_main.js index 05ec6211172..e76772bc268 100644 --- a/packages/accounts-base/server_main.js +++ b/packages/accounts-base/server_main.js @@ -4,7 +4,7 @@ import { AccountsServer } from "./accounts_server.js"; * @namespace Accounts * @summary The namespace for all server-side accounts-related methods. */ -Accounts = new AccountsServer(Meteor.server); +Accounts = new AccountsServer(Meteor.server, Meteor.settings.packages?.accounts || {}); // TODO[FIBERS]: I need TLA Accounts.init().then() // Users table. Don't use the normal autopublish, since we want to hide diff --git a/packages/accounts-facebook/package.js b/packages/accounts-facebook/package.js index 6bacdff7b1c..f8d66bca60a 100644 --- a/packages/accounts-facebook/package.js +++ b/packages/accounts-facebook/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Login service for Facebook accounts", - version: "1.3.4-alpha300.19", + version: '1.3.4-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-github/package.js b/packages/accounts-github/package.js index afa80ae0a3b..2eff41a245d 100644 --- a/packages/accounts-github/package.js +++ b/packages/accounts-github/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Login service for Github accounts', - version: '1.5.1-alpha300.19', + version: '1.5.1-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-google/package.js b/packages/accounts-google/package.js index 640c11885e8..b55875fd804 100644 --- a/packages/accounts-google/package.js +++ b/packages/accounts-google/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Login service for Google accounts", - version: "1.4.1-alpha300.19", + version: '1.4.1-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-meetup/package.js b/packages/accounts-meetup/package.js index 8be93ccfaad..df54f8022dd 100644 --- a/packages/accounts-meetup/package.js +++ b/packages/accounts-meetup/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Login service for Meetup accounts', - version: '1.5.1-alpha300.19', + version: '1.5.1-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-meteor-developer/package.js b/packages/accounts-meteor-developer/package.js index 75498ea504d..2232df750c0 100644 --- a/packages/accounts-meteor-developer/package.js +++ b/packages/accounts-meteor-developer/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Login service for Meteor developer accounts', - version: '1.5.1-alpha300.19', + version: '1.5.1-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-oauth/oauth_common.js b/packages/accounts-oauth/oauth_common.js index bfb99b0a5d8..1760dee14ff 100644 --- a/packages/accounts-oauth/oauth_common.js +++ b/packages/accounts-oauth/oauth_common.js @@ -1,24 +1,5 @@ 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 = {}; @@ -36,7 +17,7 @@ Accounts.oauth.registerService = name => { // so this should be a unique index. You might want to add indexes for other // fields returned by your service (eg services.github.login) but you can do // that in your app. - Meteor.users.createIndex(`services.${name}.id`, {unique: true, sparse: true}); + Meteor.users.createIndexAsync(`services.${name}.id`, {unique: true, sparse: true}); } }; @@ -72,17 +53,5 @@ Meteor.startup(() => { ); 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 f8d67eff25a..c1c5bf9b557 100644 --- a/packages/accounts-oauth/oauth_server.js +++ b/packages/accounts-oauth/oauth_server.js @@ -2,7 +2,7 @@ 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 => { +Accounts.registerLoginHandler(async options => { if (!options.oauth) return undefined; // don't handle @@ -15,7 +15,7 @@ Accounts.registerLoginHandler(options => { credentialSecret: Match.OneOf(null, String) }); - const result = OAuth.retrieveCredential(options.oauth.credentialToken, + const result = await OAuth.retrieveCredential(options.oauth.credentialToken, options.oauth.credentialSecret); if (!result) { @@ -90,8 +90,8 @@ Meteor.startup(() => { }, { "secret.algorithm": { $exists: false } }] - }).forEach(config => { - ServiceConfiguration.configurations.update(config._id, { + }).forEachAsync(async (config) => { + await ServiceConfiguration.configurations.updateAsync(config._id, { $set: { secret: OAuthEncryption.seal(config.secret) } diff --git a/packages/accounts-oauth/package.js b/packages/accounts-oauth/package.js index efb65f0ddeb..c7460d6b435 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.3-alpha300.19", + version: '1.4.5-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-password/.npm/package/npm-shrinkwrap.json b/packages/accounts-password/.npm/package/npm-shrinkwrap.json index 5a69d320056..40cbf50ec2b 100644 --- a/packages/accounts-password/.npm/package/npm-shrinkwrap.json +++ b/packages/accounts-password/.npm/package/npm-shrinkwrap.json @@ -77,9 +77,9 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==" }, "emoji-regex": { "version": "8.0.0", @@ -138,11 +138,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -238,9 +233,9 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==" }, "set-blocking": { "version": "2.0.0", @@ -268,9 +263,9 @@ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" }, "tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==" }, "tr46": { "version": "0.0.3", diff --git a/packages/accounts-password/package.js b/packages/accounts-password/package.js index 9c04defb6e5..109c378a7ad 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: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', }); Npm.depends({ diff --git a/packages/accounts-password/password_server.js b/packages/accounts-password/password_server.js index edeeb705d48..c87b0897d93 100644 --- a/packages/accounts-password/password_server.js +++ b/packages/accounts-password/password_server.js @@ -100,11 +100,6 @@ const checkPasswordAsync = async (user, password) => { return result; }; -const checkPassword = (user, password) => { - return Promise.await(checkPasswordAsync(user, password)); -}; - -Accounts._checkPassword = checkPassword; Accounts._checkPasswordAsync = checkPasswordAsync; /// @@ -113,7 +108,7 @@ Accounts._checkPasswordAsync = checkPasswordAsync; /** - * @summary Finds the user with the specified username. + * @summary Finds the user asynchronously with the specified username. * First tries to match username case sensitively; if that fails, it * tries case insensitively; but if more than one user matches the case * insensitive search, it returns null. @@ -121,7 +116,7 @@ Accounts._checkPasswordAsync = checkPasswordAsync; * @param {String} username The username to look for * @param {Object} [options] * @param {MongoFieldSpecifier} options.fields Dictionary of fields to return or exclude. - * @returns {Object} A user if found, else null + * @returns {Promise} A user if found, else null * @importFromPackage accounts-base */ Accounts.findUserByUsername = @@ -129,7 +124,7 @@ Accounts.findUserByUsername = await Accounts._findUserByQuery({ username }, options); /** - * @summary Finds the user with the specified email. + * @summary Finds the user asynchronously with the specified email. * First tries to match email case sensitively; if that fails, it * tries case insensitively; but if more than one user matches the case * insensitive search, it returns null. @@ -137,7 +132,7 @@ Accounts.findUserByUsername = * @param {String} email The email address to look for * @param {Object} [options] * @param {MongoFieldSpecifier} options.fields Dictionary of fields to return or exclude. - * @returns {Object} A user if found, else null + * @returns {Promise} A user if found, else null * @importFromPackage accounts-base */ Accounts.findUserByEmail = @@ -224,7 +219,7 @@ Accounts.registerLoginHandler("password", async options => { /// /** - * @summary Change a user's username. Use this instead of updating the + * @summary Change a user's username asynchronously. Use this instead of updating the * database directly. The operation will fail if there is an existing user * with a username only differing in case. * @locus Server @@ -356,20 +351,6 @@ Accounts.setPasswordAsync = await Meteor.users.updateAsync({_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 /// @@ -397,13 +378,13 @@ Meteor.methods({forgotPassword: async options => { }}); /** - * @summary Generates a reset token and saves it into the database. + * @summary Asynchronously generates a reset token and saves it into the database. * @locus Server * @param {String} userId The id of the user to generate the reset token for. * @param {String} email Which address of the user to generate the reset token for. This address must be in the user's `emails` list. If `null`, defaults to the first email in the list. * @param {String} reason `resetPassword` or `enrollAccount`. * @param {Object} [extraTokenData] Optional additional data to be added into the token record. - * @returns {Object} Object with {email, user, token} values. + * @returns {Promise} Promise of an object with {email, user, token} values. * @importFromPackage accounts-base */ Accounts.generateResetToken = @@ -471,12 +452,12 @@ Accounts.generateResetToken = }; /** - * @summary Generates an e-mail verification token and saves it into the database. + * @summary Generates asynchronously an e-mail verification token and saves it into the database. * @locus Server * @param {String} userId The id of the user to generate the e-mail verification token for. * @param {String} email Which address of the user to generate the e-mail verification token for. This address must be in the user's `emails` list. If `null`, defaults to the first unverified email in the list. * @param {Object} [extraTokenData] Optional additional data to be added into the token record. - * @returns {Object} Object with {email, user, token} values. + * @returns {Promise} Promise of an object with {email, user, token} values. * @importFromPackage accounts-base */ Accounts.generateVerificationToken = @@ -536,13 +517,13 @@ Accounts.generateVerificationToken = // to set a new password, without the old password. /** - * @summary Send an email with a link the user can use to reset their password. + * @summary Send an email asynchronously with a link the user can use to reset their password. * @locus Server * @param {String} userId The id of the user to send email to. * @param {String} [email] Optional. Which address of the user's to send the email to. This address must be in the user's `emails` list. Defaults to the first email in the list. * @param {Object} [extraTokenData] Optional additional data to be added into the token record. * @param {Object} [extraParams] Optional additional params to be added to the reset url. - * @returns {Object} Object with {email, user, token, url, options} values. + * @returns {Promise} Promise of an object with {email, user, token, url, options} values. * @importFromPackage accounts-base */ Accounts.sendResetPasswordEmail = @@ -568,13 +549,13 @@ Accounts.sendResetPasswordEmail = // want to use enrollment emails. /** - * @summary Send an email with a link the user can use to set their initial password. + * @summary Send an email asynchronously with a link the user can use to set their initial password. * @locus Server * @param {String} userId The id of the user to send email to. * @param {String} [email] Optional. Which address of the user's to send the email to. This address must be in the user's `emails` list. Defaults to the first email in the list. * @param {Object} [extraTokenData] Optional additional data to be added into the token record. * @param {Object} [extraParams] Optional additional params to be added to the enrollment url. - * @returns {Object} Object with {email, user, token, url, options} values. + * @returns {Promise} Promise of an object {email, user, token, url, options} values. * @importFromPackage accounts-base */ Accounts.sendEnrollmentEmail = @@ -747,14 +728,13 @@ Meteor.methods( // address as verified /** - * @summary Send an email with a link the user can use verify their email address. + * @summary Send an email asynchronously with a link the user can use verify their email address. * @locus Server * @param {String} userId The id of the user to send email to. * @param {String} [email] Optional. Which address of the user's to send the email to. This address must be in the user's `emails` list. Defaults to the first unverified email in the list. * @param {Object} [extraTokenData] Optional additional data to be added into the token record. * @param {Object} [extraParams] Optional additional params to be added to the verification url. - * - * @returns {Object} Object with {email, user, token, url, options} values. + * @returns {Promise} Promise of an object with {email, user, token, url, options} values. * @importFromPackage accounts-base */ Accounts.sendVerificationEmail = @@ -850,7 +830,7 @@ Meteor.methods( }); /** - * @summary Add an email address for a user. Use this instead of directly + * @summary Add an email asynchronously address for a user. Use this instead of directly * updating the database. The operation will fail if there is a different user * with an email only differing in case. If the specified user has an existing * email only differing in case however, we replace it. @@ -950,7 +930,7 @@ Accounts.addEmail = } /** - * @summary Remove an email address for a user. Use this instead of updating + * @summary Remove an email address asynchronously for a user. Use this instead of updating * the database directly. * @locus Server * @param {String} userId The ID of the user to update. @@ -1030,7 +1010,7 @@ Meteor.methods( }); /** - * @summary Creates an user and sends an email if `options.email` is informed. + * @summary Creates an user asynchronously and sends an email if `options.email` is informed. * Then if the `sendVerificationEmail` option from the `Accounts` package is * enabled, you'll send a verification email if `options.password` is informed, * otherwise you'll send an enrollment email. @@ -1105,12 +1085,7 @@ Accounts.createUserAsync = // method calling Accounts.createUser could set? // -Accounts.createUser = - !Meteor._isFibersEnabled - ? Accounts.createUserAsync - : (options, callback) => - Promise.await(Accounts.createUserAsync(options, callback)); - +Accounts.createUser = Accounts.createUserAsync; /// /// PASSWORD-SPECIFIC INDEXES ON USERS diff --git a/packages/accounts-password/password_tests.js b/packages/accounts-password/password_tests.js index 6d80c805522..72117d821a2 100644 --- a/packages/accounts-password/password_tests.js +++ b/packages/accounts-password/password_tests.js @@ -292,7 +292,7 @@ if (Meteor.isClient) (() => { }, // Make sure the new user has not been inserted async function (test) { - const result = await Meteor.callAsync('countUsersOnServer', { returnServerPromise: true }, { + const result = await Meteor.callAsync('countUsersOnServer', { username: this.newUsername, }); test.equal(result, 0); @@ -400,7 +400,7 @@ if (Meteor.isClient) (() => { }, // Make sure the new user has not been inserted async function (test) { - const result = await Meteor.callAsync('countUsersOnServer', { returnServerPromise: true }, { + const result = await Meteor.callAsync('countUsersOnServer', { 'emails.address': this.newEmail, }); test.equal(result, 0); @@ -428,7 +428,7 @@ if (Meteor.isClient) (() => { })); }, async function (test) { - const token = await Meteor.callAsync("getResetToken", { returnServerPromise: true }); + const token = await Meteor.callAsync("getResetToken"); test.isTrue(token); this.token = token; }, @@ -452,7 +452,7 @@ if (Meteor.isClient) (() => { loggedInAs(this.username, test, expect)); }, async function (test) { - const token = await Meteor.callAsync("getResetToken", { returnServerPromise: true }); + const token = await Meteor.callAsync("getResetToken"); test.isFalse(token); }, logoutStep, @@ -714,16 +714,7 @@ if (Meteor.isClient) (() => { // Test that even with no published fields, we still have a document. await Accounts.connection.callAsync('clearUsernameAndProfile'); test.isTrue(Meteor.userId()); - // TODO [FIBERS]: this is a big workaround. The Tracker is now receiving promises, - // so it's finishing before time. Hopefully this PR will fix this behavior - // https://github.com/meteor/meteor/pull/12294 - let resolve; - const promise = new Promise(res => resolve = res); - Meteor.setTimeout(() => { - test.equal(Meteor.user(), { _id: Meteor.userId() }); - resolve(); - }, 100); - return promise; + test.equal(await Meteor.userAsync(), { _id: Meteor.userId() }); }, logoutStep, function (test, expect) { @@ -1222,7 +1213,6 @@ if (Meteor.isServer) (() => { // This test properly belongs in accounts-base/accounts_tests.js, but // this is where the tests that actually log in are. Tinytest.addAsync('accounts - user() out of context', async test => { - // basic server context, no method. await test.throwsAsync( async () => await Meteor.user() @@ -1253,7 +1243,7 @@ if (Meteor.isServer) (() => { test.fail('observe should be gone'); }) - const result = await clientConn.callAsync('login', { returnServerPromise: true }, { + const result = await clientConn.callAsync('login', { user: { username: username }, password: hashPassword('password') }); @@ -1419,17 +1409,17 @@ if (Meteor.isServer) (() => { }, ); - Accounts._options.ambiguousErrorMessages = true + Accounts._options.ambiguousErrorMessages = true; await test.throwsAsync( async () => await Meteor.callAsync('forgotPassword', wrongOptions), 'Something went wrong. Please check your credentials' - ) + ); - Accounts._options.ambiguousErrorMessages = false + Accounts._options.ambiguousErrorMessages = false; await test.throwsAsync( async () => await Meteor.callAsync('forgotPassword', wrongOptions), /User not found/ - ) + ); // return accounts as it were Accounts._options = options }); diff --git a/packages/accounts-passwordless/package.js b/packages/accounts-passwordless/package.js index 0989262b39d..a833207bf01 100644 --- a/packages/accounts-passwordless/package.js +++ b/packages/accounts-passwordless/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'No-password login/sign-up support for accounts', - version: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-passwordless/passwordless_server.js b/packages/accounts-passwordless/passwordless_server.js index 6feb947c258..33925be23a0 100644 --- a/packages/accounts-passwordless/passwordless_server.js +++ b/packages/accounts-passwordless/passwordless_server.js @@ -12,9 +12,13 @@ const findUserWithOptions = async ({ selector }) => { if (!selector) { Accounts._handleError('A selector is necessary'); } - const { email, ...rest } = selector; + const { email, id, ...rest } = selector; return Meteor.users.findOneAsync( - { ...rest, ...(email ? { 'emails.address': selector.email } : {}) }, + { + ...rest, + ...(id && { _id: id }), + ...(email && { 'emails.address': email }) + }, { fields: { services: 1, @@ -232,11 +236,11 @@ Accounts.sendLoginTokenEmail = async ({ userId, sequence, email, extra = {} }) = }; const setupUsersCollection = () => { - Meteor.users.createIndex('services.passwordless.tokens.token', { + Meteor.users.createIndexAsync('services.passwordless.tokens.token', { unique: true, sparse: true, }); - Meteor.users.createIndex('services.passwordless.token', { + Meteor.users.createIndexAsync('services.passwordless.token', { unique: true, sparse: true, }); diff --git a/packages/accounts-twitter/package.js b/packages/accounts-twitter/package.js index 472dbabb40d..c1e0d6a3e50 100644 --- a/packages/accounts-twitter/package.js +++ b/packages/accounts-twitter/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Login service for Twitter accounts", - version: "1.5.1-alpha300.19", + version: '1.5.1-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-ui-unstyled/login_buttons_dropdown.js b/packages/accounts-ui-unstyled/login_buttons_dropdown.js index 548b2965185..8f67169eead 100644 --- a/packages/accounts-ui-unstyled/login_buttons_dropdown.js +++ b/packages/accounts-ui-unstyled/login_buttons_dropdown.js @@ -226,7 +226,7 @@ const isInPasswordSignupFields = (fieldOrFields) => { return signupFields.reduce( (prev, field) => prev && fieldOrFields.includes(field), true, - ) + ); } return signupFields.includes(fieldOrFields); @@ -488,7 +488,7 @@ Template._loginButtonsLoggedOutPasswordlessService.helpers({ inSignupFlow: () => loginButtonsSession.get('inSignupFlow'), showCreateAccountLink: () => !Accounts._options.forbidClientAccountCreation, -}) +}); Template._loginButtonsLoggedOutPasswordService.helpers({ fields: () => { @@ -565,7 +565,7 @@ Template._loginButtonsLoggedOutPasswordService.helpers({ Template._loginButtonsFormField.helpers({ inputType: function () { - return this.inputType || "text" + return this.inputType || "text"; } }); @@ -584,7 +584,7 @@ Template._loginButtonsChangePassword.events({ Template._loginButtonsChangePassword.helpers({ fields: () => { - const { username, emails } = Meteor.user() + const { username, emails } = Meteor.user(); let email; if (emails) { email = emails[0].address; diff --git a/packages/accounts-ui-unstyled/login_buttons_single.js b/packages/accounts-ui-unstyled/login_buttons_single.js index 8a2fdeb3da5..a850e409d05 100644 --- a/packages/accounts-ui-unstyled/login_buttons_single.js +++ b/packages/accounts-ui-unstyled/login_buttons_single.js @@ -78,6 +78,9 @@ Template._loginButtonsLoggedOutSingleLoginButton.helpers({ return !!ServiceConfiguration.configurations.findOne({service: this.name}); }, capitalizedName: function () { + if (this.name === 'twitter') { + return 'X/Twitter'; + } if (this.name === 'github') // XXX we should allow service packages to set their capitalized name return 'GitHub'; diff --git a/packages/accounts-ui-unstyled/package.js b/packages/accounts-ui-unstyled/package.js index bd7a1c99594..c4e6d746570 100644 --- a/packages/accounts-ui-unstyled/package.js +++ b/packages/accounts-ui-unstyled/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Unstyled version of login widgets', - version: '1.7.1-alpha300.19', + version: '1.7.1-rc300.2', }); Package.onUse(function(api) { diff --git a/packages/accounts-ui/package.js b/packages/accounts-ui/package.js index 8c40acfbe41..fd5df8e81e5 100644 --- a/packages/accounts-ui/package.js +++ b/packages/accounts-ui/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simple templates to add login widgets to an app", - version: "1.4.3-alpha300.19", + version: '1.4.3-rc300.2', }); Package.onUse(api => { diff --git a/packages/accounts-weibo/package.js b/packages/accounts-weibo/package.js index 8f40cf428cc..ade46db7a55 100644 --- a/packages/accounts-weibo/package.js +++ b/packages/accounts-weibo/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Login service for Sina Weibo accounts", - version: "1.4.1-alpha300.19", + version: '1.4.1-rc300.2', }); Package.onUse(api => { diff --git a/packages/allow-deny/allow-deny.js b/packages/allow-deny/allow-deny.js index 8811d5d42f6..47fe0ef9fbc 100644 --- a/packages/allow-deny/allow-deny.js +++ b/packages/allow-deny/allow-deny.js @@ -606,7 +606,7 @@ CollectionPrototype._validatedRemove = function(userId, selector) { return self._collection.remove.call(self._collection, selector); }; -CollectionPrototype._callMutatorMethodAsync = async function _callMutatorMethodAsync(name, args, options = {}) { +CollectionPrototype._callMutatorMethodAsync = function _callMutatorMethodAsync(name, args, options = {}) { // For two out of three mutator methods, the first argument is a selector const firstArgIsSelector = name === "updateAsync" || name === "removeAsync"; @@ -619,8 +619,9 @@ CollectionPrototype._callMutatorMethodAsync = async function _callMutatorMethodA const mutatorMethodName = this._prefix + name; return this._connection.applyAsync(mutatorMethodName, args, { - returnStubValue: true, - returnServerResultPromise: true, + returnStubValue: this.resolverType === 'stub' || this.resolverType == null, + // StubStream is only used for testing where you don't care about the server + returnServerResultPromise: !this._connection._stream._isStub && this.resolverType !== 'stub', ...options, }); } diff --git a/packages/allow-deny/package.js b/packages/allow-deny/package.js index 457b7bebc78..91d4ecf34c7 100644 --- a/packages/allow-deny/package.js +++ b/packages/allow-deny/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'allow-deny', - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', // Brief, one-line summary of the package. summary: 'Implements functionality for allow/deny and client-side db operations', // URL to the Git repository containing the source code for this package. diff --git a/packages/audit-argument-checks/package.js b/packages/audit-argument-checks/package.js index a4a48aee86e..761a86ad845 100644 --- a/packages/audit-argument-checks/package.js +++ b/packages/audit-argument-checks/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Try to detect inadequate input sanitization", - version: '1.0.8-alpha300.19' + version: '1.0.8-rc300.2', }); // This package is empty; its presence is detected by livedata. diff --git a/packages/autopublish/package.js b/packages/autopublish/package.js index 11ef0115162..3409af8aeb2 100644 --- a/packages/autopublish/package.js +++ b/packages/autopublish/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "(For prototyping only) Publish the entire database to all clients", - version: '1.0.8-alpha300.19' + version: '1.0.8-rc300.2', }); // This package is empty; its presence is detected by several other packages diff --git a/packages/autoupdate/package.js b/packages/autoupdate/package.js index 0bbafd0d573..821239637aa 100644 --- a/packages/autoupdate/package.js +++ b/packages/autoupdate/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Update the client when new client code is available', - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Package.onUse(function(api) { diff --git a/packages/babel-compiler/babel.js b/packages/babel-compiler/babel.js index d7e0c287a64..03a8543e2a7 100644 --- a/packages/babel-compiler/babel.js +++ b/packages/babel-compiler/babel.js @@ -47,5 +47,16 @@ Babel = { getMinimumModernBrowserVersions: function () { return Npm.require("@meteorjs/babel/modern-versions.js").get(); + }, + + compileForShell(command, cacheOptions) { + const babelOptions = Babel.getDefaultOptions({ + nodeMajorVersion: parseInt(process.versions.node, 10), + compileForShell: true + }); + delete babelOptions.sourceMap; + delete babelOptions.sourceMaps; + babelOptions.ast = false; + return Babel.compile(command, babelOptions, cacheOptions).code; } }; diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index c96f42dcf64..eeb49b42846 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.11.0-alpha300.19', + version: '7.11.0-rc300.2', }); Npm.depends({ - '@meteorjs/babel': '7.19.0-beta.3', + '@meteorjs/babel': '7.20.0-beta.4', 'json5': '2.1.1', 'semver': '7.3.8' }); diff --git a/packages/babel-runtime/package.js b/packages/babel-runtime/package.js index d44ae2077cf..19e0f66ccfa 100644 --- a/packages/babel-runtime/package.js +++ b/packages/babel-runtime/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "babel-runtime", summary: "Runtime support for output of Babel transpiler", - version: '1.5.2-alpha300.19', + version: '1.5.2-rc300.2', documentation: 'README.md' }); diff --git a/packages/base64/package.js b/packages/base64/package.js index cffb842aa42..b9d67980b43 100644 --- a/packages/base64/package.js +++ b/packages/base64/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Base64 encoding and decoding", - version: '1.0.13-alpha300.19', + version: '1.0.13-rc300.2', }); Package.onUse(api => { diff --git a/packages/binary-heap/package.js b/packages/binary-heap/package.js index c2454d65e37..c82a283b6d4 100644 --- a/packages/binary-heap/package.js +++ b/packages/binary-heap/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Binary Heap datastructure implementation", - version: '1.0.12-alpha300.19' + version: '1.0.12-rc300.2', }); Package.onUse(api => { diff --git a/packages/boilerplate-generator-tests/package.js b/packages/boilerplate-generator-tests/package.js index 70b2ef85dd3..33fccea44a2 100644 --- a/packages/boilerplate-generator-tests/package.js +++ b/packages/boilerplate-generator-tests/package.js @@ -2,7 +2,7 @@ Package.describe({ // These tests are in a separate package so that we can Npm.depend on // parse5, a html parsing library. summary: "Tests for the boilerplate-generator package", - version: '1.5.2-alpha300.19', + version: '1.5.2-rc300.2', documentation: null }); diff --git a/packages/boilerplate-generator/.npm/package/npm-shrinkwrap.json b/packages/boilerplate-generator/.npm/package/npm-shrinkwrap.json index 19d26e0879c..e9ca2307b47 100644 --- a/packages/boilerplate-generator/.npm/package/npm-shrinkwrap.json +++ b/packages/boilerplate-generator/.npm/package/npm-shrinkwrap.json @@ -16,6 +16,21 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==" + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", diff --git a/packages/boilerplate-generator/package.js b/packages/boilerplate-generator/package.js index de846a9f702..2a52d17ab81 100644 --- a/packages/boilerplate-generator/package.js +++ b/packages/boilerplate-generator/package.js @@ -1,15 +1,15 @@ Package.describe({ summary: "Generates the boilerplate html from program's manifest", - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Npm.depends({ - "combined-stream2": "1.1.2" + "combined-stream2": "1.1.2", + "lodash.template": "4.5.0" }); Package.onUse(api => { api.use('ecmascript'); - api.use('underscore', 'server'); api.mainModule('generator.js', 'server'); api.export('Boilerplate', 'server'); }); diff --git a/packages/boilerplate-generator/template.js b/packages/boilerplate-generator/template.js index 1f702adad76..5f38837c42a 100644 --- a/packages/boilerplate-generator/template.js +++ b/packages/boilerplate-generator/template.js @@ -1,4 +1,4 @@ -import { _ } from 'meteor/underscore'; +import lodashTemplate from 'lodash.template'; // As identified in issue #9149, when an application overrides the default // _.template settings using _.templateSettings, those new settings are @@ -6,9 +6,9 @@ import { _ } from 'meteor/underscore'; // boilerplate-generator. To handle this, _.template settings that have // been verified to work are overridden here on each _.template call. export default function template(text) { - return _.template(text, null, { + return lodashTemplate(text, null, { evaluate : /<%([\s\S]+?)%>/g, interpolate : /<%=([\s\S]+?)%>/g, escape : /<%-([\s\S]+?)%>/g, }); -}; +}; \ No newline at end of file diff --git a/packages/browser-policy-common/package.js b/packages/browser-policy-common/package.js index 700289bba29..0c8ca721261 100644 --- a/packages/browser-policy-common/package.js +++ b/packages/browser-policy-common/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Common code for browser-policy packages", - version: '1.0.13-alpha300.19', + version: '1.0.13-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/browser-policy-content/browser-policy-content.js b/packages/browser-policy-content/browser-policy-content.js index 3151fe3d0f1..f305a8c623a 100644 --- a/packages/browser-policy-content/browser-policy-content.js +++ b/packages/browser-policy-content/browser-policy-content.js @@ -53,15 +53,19 @@ var contentSniffingAllowed = false; var BrowserPolicy = require("meteor/browser-policy-common").BrowserPolicy; BrowserPolicy.content = {}; +var mergeUnique = function (firstArray, secondArray) { + return firstArray.concat(secondArray.filter(function (item) {return firstArray.indexOf(item) < 0})); +} + var parseCsp = function (csp) { var policies = csp.split("; "); cspSrcs = {}; - _.each(policies, function (policy) { + policies.forEach(function (policy) { if (policy[policy.length - 1] === ";") policy = policy.substring(0, policy.length - 1); var srcs = policy.split(" "); var directive = srcs[0]; - if (_.indexOf(srcs, keywords.none) !== -1) + if (srcs.indexOf(keywords.none) !== -1) cspSrcs[directive] = null; else cspSrcs[directive] = srcs.slice(1); @@ -72,13 +76,17 @@ var parseCsp = function (csp) { "browser-policy must specify a default-src."); // Copy default-src sources to other directives. - _.each(cspSrcs, function (sources, directive) { - cspSrcs[directive] = _.union(sources || [], cspSrcs["default-src"] || []); + Object.entries(cspSrcs).forEach(function (entry) { + var directive = entry[0]; + var sources = entry[1]; + cspSrcs[directive] = mergeUnique(sources || [], cspSrcs["default-src"] || []); }); }; var removeCspSrc = function (directive, src) { - cspSrcs[directive] = _.without(cspSrcs[directive] || [], src); + cspSrcs[directive] = (cspSrcs[directive] || []).filter(function(value) { + return value !== src; + }); }; // Prepare for a change to cspSrcs. Ensure that we have a key in the dictionary @@ -86,8 +94,8 @@ var removeCspSrc = function (directive, src) { var prepareForCspDirective = function (directive) { cspSrcs = cspSrcs || {}; cachedCsp = null; - if (! _.has(cspSrcs, directive)) - cspSrcs[directive] = _.clone(cspSrcs["default-src"]); + if (!(directive in cspSrcs)) + cspSrcs[directive] = [].concat(cspSrcs["default-src"]); }; // Add `src` to the list of allowed sources for `directive`, with the @@ -100,7 +108,7 @@ var prepareForCspDirective = function (directive) { // - Trim trailing slashes from `src`, since some browsers interpret // "foo.com/" as "foo.com" and some don't. var addSourceForDirective = function (directive, src) { - if (_.contains(_.values(keywords), src)) { + if (Object.values(keywords).includes(src)) { cspSrcs[directive].push(src); } else { var toAdd = []; @@ -123,7 +131,7 @@ var addSourceForDirective = function (directive, src) { } } - _.each(toAdd, function (s) { + toAdd.forEach(function (s) { cspSrcs[directive].push(s); }); } @@ -148,25 +156,27 @@ var setWebAppInlineScripts = async function (value) { await WebAppInternals.setInlineScriptsAllowed(value); }; -_.extend(BrowserPolicy.content, { +Object.assign(BrowserPolicy.content, { allowContentTypeSniffing: function () { contentSniffingAllowed = true; }, // Exported for tests and browser-policy-common. _constructCsp: function () { - if (! cspSrcs || _.isEmpty(cspSrcs)) + if (! cspSrcs || (Object.keys(cspSrcs).length === 0 && cspSrcs.constructor === Object)) return null; if (cachedCsp) return cachedCsp; - var header = _.map(cspSrcs, function (srcs, directive) { - srcs = srcs || []; - if (_.isEmpty(srcs)) - srcs = [keywords.none]; - var directiveCsp = _.uniq(srcs).join(" "); - return directive + " " + directiveCsp + ";"; - }); + var header = Object.entries(cspSrcs).map(function (entry) { + var directive = entry[0]; + var srcs = entry[1]; + srcs = srcs || []; + if ((!Array.isArray(srcs) || !srcs.length)) + srcs = [keywords.none]; + var directiveCsp = srcs.filter(function(value, index, array) {return array.indexOf(value) === index}).join(" "); + return directive + " " + directiveCsp + ";"; + }); header = header.join(" "); cachedCsp = header; @@ -187,7 +197,7 @@ _.extend(BrowserPolicy.content, { _keywordAllowed: function (directive, keyword) { return (cspSrcs[directive] && - _.indexOf(cspSrcs[directive], keyword) !== -1); + cspSrcs[directive].indexOf(keyword) !== -1) }, // Helpers for creating content security policies @@ -228,7 +238,7 @@ _.extend(BrowserPolicy.content, { }, allowOriginForAll: function (origin) { prepareForCspDirective("default-src"); - _.each(_.keys(cspSrcs), function (directive) { + Object.keys(cspSrcs).forEach(function (directive) { addSourceForDirective(directive, origin); }); }, @@ -260,7 +270,7 @@ var resources = [ { methodResource: "Frame", directive: "frame-src" }, { methodResource: "FrameAncestors", directive: "frame-ancestors" } ]; -_.each(resources, function (resource) { +resources.forEach(function (resource) { var directive = resource.directive; var methodResource = resource.methodResource; var allowMethodName = "allow" + methodResource + "Origin"; @@ -302,4 +312,4 @@ _.each(resources, function (resource) { await setDefaultPolicy(); -exports.BrowserPolicy = BrowserPolicy; +exports.BrowserPolicy = BrowserPolicy; \ No newline at end of file diff --git a/packages/browser-policy-content/package.js b/packages/browser-policy-content/package.js index 1eac8e54e19..b641fe0d714 100644 --- a/packages/browser-policy-content/package.js +++ b/packages/browser-policy-content/package.js @@ -1,12 +1,12 @@ Package.describe({ summary: "Configure content security policies", - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Package.onUse(function (api) { api.use("ecmascript"); - api.use("modules"); - api.use(["underscore", "browser-policy-common", "webapp"], "server"); + api.use("ecmascript"); + api.use(["browser-policy-common", "webapp"], "server"); api.imply(["browser-policy-common"], "server"); api.mainModule("browser-policy-content.js", "server"); }); diff --git a/packages/browser-policy-framing/package.js b/packages/browser-policy-framing/package.js index 932177e87de..ae3ee87d8d1 100644 --- a/packages/browser-policy-framing/package.js +++ b/packages/browser-policy-framing/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Restrict which websites can frame your app", - version: '1.1.3-alpha300.19' + version: '1.1.3-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/browser-policy/package.js b/packages/browser-policy/package.js index 9de13853dfb..7dbdf9ff0c8 100644 --- a/packages/browser-policy/package.js +++ b/packages/browser-policy/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Configure security policies enforced by the browser", - version: '1.1.3-alpha300.19' + version: '1.1.3-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/caching-compiler/caching-compiler.js b/packages/caching-compiler/caching-compiler.js index 4f28254209c..a5534edb3c7 100644 --- a/packages/caching-compiler/caching-compiler.js +++ b/packages/caching-compiler/caching-compiler.js @@ -324,7 +324,7 @@ CachingCompiler = class CachingCompiler extends CachingCompilerBase { } else { const result = await getResult(); if (result) { - this.addCompileResult(inputFile, result); + await this.addCompileResult(inputFile, result); } } } diff --git a/packages/caching-compiler/multi-file-caching-compiler.js b/packages/caching-compiler/multi-file-caching-compiler.js index 86bfef44fda..a9612a2c588 100644 --- a/packages/caching-compiler/multi-file-caching-compiler.js +++ b/packages/caching-compiler/multi-file-caching-compiler.js @@ -166,7 +166,7 @@ extends CachingCompilerBase { } else if (this.isRoot(inputFile)) { const result = await getResult(); if (result) { - this.addCompileResult(inputFile, result); + await this.addCompileResult(inputFile, result); } } } diff --git a/packages/caching-compiler/package.js b/packages/caching-compiler/package.js index d70243d52e7..07564377c9b 100644 --- a/packages/caching-compiler/package.js +++ b/packages/caching-compiler/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'caching-compiler', - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', summary: 'An easy way to make compiler plugins cache', documentation: 'README.md' }); diff --git a/packages/callback-hook/package.js b/packages/callback-hook/package.js index 462e88d292f..5437cd2ebad 100644 --- a/packages/callback-hook/package.js +++ b/packages/callback-hook/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Register callbacks on a hook", - version: '1.6.0-alpha300.19', + version: '1.6.0-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/check/check.d.ts b/packages/check/check.d.ts index 0322aab9e9a..607528c3d2d 100644 --- a/packages/check/check.d.ts +++ b/packages/check/check.d.ts @@ -80,13 +80,17 @@ export namespace Match { /** * Check that a value matches a pattern. * If the value does not match the pattern, throw a `Match.Error`. + * By default, it will throw immediately at the first error encountered. Pass in { throwAllErrors: true } to throw all errors. * * Particularly useful to assert that arguments to a function have the right * types and structure. * @param value The value to check * @param pattern The pattern to match `value` against + * @param {Object} [options={}] Additional options for check + * @param {Boolean} [options.throwAllErrors=false] If true, throw all errors */ export declare function check( value: any, - pattern: T + pattern: T, + options?: { throwAllErrors?: boolean } ): asserts value is Match.PatternMatch; diff --git a/packages/check/match.js b/packages/check/match.js index fe6d32f70d1..d5bb2d3fda3 100644 --- a/packages/check/match.js +++ b/packages/check/match.js @@ -7,17 +7,30 @@ import { isPlainObject } from './isPlainObject'; const currentArgumentChecker = new Meteor.EnvironmentVariable; const hasOwn = Object.prototype.hasOwnProperty; +const format = result => { + const err = new Match.Error(result.message); + if (result.path) { + err.message += ` in field ${result.path}`; + err.path = result.path; + } + + return err; +} + /** * @summary Check that a value matches a [pattern](#matchpatterns). * If the value does not match the pattern, throw a `Match.Error`. + * By default, it will throw immediately at the first error encountered. Pass in { throwAllErrors: true } to throw all errors. * * Particularly useful to assert that arguments to a function have the right * types and structure. * @locus Anywhere * @param {Any} value The value to check * @param {MatchPattern} pattern The pattern to match `value` against + * @param {Object} [options={}] Additional options for check + * @param {Boolean} [options.throwAllErrors=false] If true, throw all errors */ -export function check(value, pattern) { +export function check(value, pattern, options = { throwAllErrors: false }) { // Record that check got called, if somebody cared. // // We use getOrNullIfOutsideFiber so that it's OK to call check() @@ -31,15 +44,14 @@ export function check(value, pattern) { argChecker.checking(value); } - const result = testSubtree(value, pattern); + const result = testSubtree(value, pattern, options.throwAllErrors); + if (result) { - const err = new Match.Error(result.message); - if (result.path) { - err.message += ` in field ${result.path}`; - err.path = result.path; + if (options.throwAllErrors) { + throw Array.isArray(result) ? result.map(r => format(r)) : [format(result)] + } else { + throw format(result) } - - throw err; } }; @@ -203,9 +215,8 @@ const typeofChecks = [ [undefined, 'undefined'], ]; -// Return `false` if it matches. Otherwise, return an object with a `message` and a `path` field. -const testSubtree = (value, pattern) => { - +// Return `false` if it matches. Otherwise, returns an object with a `message` and a `path` field or an array of objects each with a `message` and a `path` field when collecting errors. +const testSubtree = (value, pattern, collectErrors = false, errors = [], path = '') => { // Match anything! if (pattern === Match.Any) { return false; @@ -289,15 +300,19 @@ const testSubtree = (value, pattern) => { }; } + for (let i = 0, length = value.length; i < length; i++) { - const result = testSubtree(value[i], pattern[0]); + const arrPath = `${path}[${i}]` + const result = testSubtree(value[i], pattern[0], collectErrors, errors, arrPath); if (result) { - result.path = _prependPath(i, result.path); - return result; + result.path = _prependPath(collectErrors ? arrPath : i, result.path) + if (!collectErrors) return result; + if (typeof value[i] !== 'object' || result.message) errors.push(result) } } - return false; + if (!collectErrors) return false; + return errors.length === 0 ? false : errors; } // Arbitrary validation checks. The condition can return false or throw a @@ -322,6 +337,7 @@ const testSubtree = (value, pattern) => { } // XXX this error is terrible + return { message: 'Failed Match.Where validation', path: '', @@ -425,34 +441,40 @@ const testSubtree = (value, pattern) => { for (let key in Object(value)) { const subValue = value[key]; + const objPath = path ? `${path}.${key}` : key; if (hasOwn.call(requiredPatterns, key)) { - const result = testSubtree(subValue, requiredPatterns[key]); + const result = testSubtree(subValue, requiredPatterns[key], collectErrors, errors, objPath); if (result) { - result.path = _prependPath(key, result.path); - return result; + result.path = _prependPath(collectErrors ? objPath : key, result.path) + if (!collectErrors) return result; + if (typeof subValue !== 'object' || result.message) errors.push(result); } delete requiredPatterns[key]; } else if (hasOwn.call(optionalPatterns, key)) { - const result = testSubtree(subValue, optionalPatterns[key]); + const result = testSubtree(subValue, optionalPatterns[key], collectErrors, errors, objPath); if (result) { - result.path = _prependPath(key, result.path); - return result; + result.path = _prependPath(collectErrors ? objPath : key, result.path) + if (!collectErrors) return result; + if (typeof subValue !== 'object' || result.message) errors.push(result); } } else { if (!unknownKeysAllowed) { - return { + const result = { message: 'Unknown key', path: key, }; + if (!collectErrors) return result; + errors.push(result); } if (unknownKeyPattern) { - const result = testSubtree(subValue, unknownKeyPattern[0]); + const result = testSubtree(subValue, unknownKeyPattern[0], collectErrors, errors, objPath); if (result) { - result.path = _prependPath(key, result.path); - return result; + result.path = _prependPath(collectErrors ? objPath : key, result.path) + if (!collectErrors) return result; + if (typeof subValue !== 'object' || result.message) errors.push(result); } } } @@ -460,11 +482,17 @@ const testSubtree = (value, pattern) => { const keys = Object.keys(requiredPatterns); if (keys.length) { - return { + const result = { message: `Missing key '${keys[0]}'`, path: '', }; + + if (!collectErrors) return result; + errors.push(result); } + + if (!collectErrors) return false; + return errors.length === 0 ? false : errors; }; class ArgumentChecker { @@ -529,7 +557,7 @@ const _jsKeywords = ['do', 'if', 'in', 'for', 'let', 'new', 'try', 'var', 'case' const _prependPath = (key, base) => { if ((typeof key) === 'number' || key.match(/^[0-9]+$/)) { key = `[${key}]`; - } else if (!key.match(/^[a-z_$][0-9a-z_$]*$/i) || + } else if (!key.match(/^[a-z_$][0-9a-z_$.[\]]*$/i) || _jsKeywords.indexOf(key) >= 0) { key = JSON.stringify([key]); } diff --git a/packages/check/match_test.js b/packages/check/match_test.js index bcd9249b297..7ce8976d1d3 100644 --- a/packages/check/match_test.js +++ b/packages/check/match_test.js @@ -278,6 +278,342 @@ Tinytest.add('check - check', test => { argumentsFails(1, '23'); }); +Tinytest.add('check - check throw all errors', test => { + const matches = (value, pattern) => { + let error; + try { + check(value, pattern, {throwAllErrors: true}); + } catch (e) { + error = e; + } + + test.isFalse(error); + test.isTrue(Match.test(value, pattern)); + }; + + const fails = (value, pattern) => { + let error; + + try { + check(value, pattern, {throwAllErrors: true}); + } catch (e) { + error = e; + } + + test.isTrue(error); + error.every(e => test.instanceOf(e, Match.Error)); + test.isFalse(Match.test(value, pattern)); + }; + + // Atoms. + const pairs = [ + ['foo', String], + ['', String], + [0, Number], + [42.59, Number], + [NaN, Number], + [Infinity, Number], + [true, Boolean], + [false, Boolean], + [function(){}, Function], + [undefined, undefined], + [null, null] + ]; + pairs.forEach(pair => { + matches(pair[0], Match.Any); + [String, Number, Boolean, undefined, null].forEach(type => { + if (type === pair[1]) { + matches(pair[0], type); + matches(pair[0], Match.Optional(type)); + matches(undefined, Match.Optional(type)); + matches(pair[0], Match.Maybe(type)); + matches(undefined, Match.Maybe(type)); + matches(null, Match.Maybe(type)); + matches(pair[0], Match.Where(() => { + check(pair[0], type); + return true; + })); + matches(pair[0], Match.Where(() => { + try { + check(pair[0], type); + return true; + } catch (e) { + return false; + } + })); + } else { + fails(pair[0], type); + matches(pair[0], Match.OneOf(type, pair[1])); + matches(pair[0], Match.OneOf(pair[1], type)); + fails(pair[0], Match.Where(() => { + check(pair[0], type); + return true; + })); + fails(pair[0], Match.Where(() => { + try { + check(pair[0], type); + return true; + } catch (e) { + return false; + } + })); + } + + if ( type !== null ) { + + // Optional doesn't allow null, but does match on null type + fails(null, Match.Optional(type)); + } + fails(pair[0], [type]); + fails(pair[0], Object); + }); + }); + fails(true, Match.OneOf(String, Number, undefined, null, [Boolean])); + fails(new String('foo'), String); + fails(new Boolean(true), Boolean); + fails(new Number(123), Number); + + matches([1, 2, 3], [Number]); + matches([], [Number]); + fails([1, 2, 3, '4'], [Number]); + fails([1, 2, 3, [4]], [Number]); + matches([1, 2, 3, '4'], [Match.OneOf(Number, String)]); + + matches({}, Object); + matches({}, {}); + matches({foo: 42}, Object); + fails({foo: 42}, {}); + matches({a: 1, b:2}, {b: Number, a: Number}); + fails({a: 1, b:2}, {b: Number}); + matches({a: 1, b:2}, Match.ObjectIncluding({b: Number})); + fails({a: 1, b:2}, Match.ObjectIncluding({b: String})); + fails({a: 1, b:2}, Match.ObjectIncluding({c: String})); + fails({}, {a: Number}); + matches({nodeType: 1}, {nodeType: Match.Any}); + matches({nodeType: 1}, Match.ObjectIncluding({nodeType: Match.Any})); + fails({nodeType: 1}, {nodeType: String}); + fails({}, Match.ObjectIncluding({nodeType: Match.Any})); + + // Match.Optional does not match on a null value, unless the allowed type is itself "null" + fails(null, Match.Optional(String)); + fails(null, Match.Optional(undefined)); + matches(null, Match.Optional(null)); + + // on the other hand, undefined, works fine for all of them + matches(undefined, Match.Optional(String)); + matches(undefined, Match.Optional(undefined)); + matches(undefined, Match.Optional(null)); + + fails(true, Match.Optional(String)); // different should still fail + matches('String', Match.Optional(String)); // same should pass + + matches({}, {a: Match.Optional(Number)}); + matches({a: 1}, {a: Match.Optional(Number)}); + fails({a: true}, {a: Match.Optional(Number)}); + fails({a: undefined}, {a: Match.Optional(Number)}); + + // .Maybe requires undefined, null or the allowed type in order to match + matches(null, Match.Maybe(String)); + matches(null, Match.Maybe(undefined)); + matches(null, Match.Maybe(null)); + + matches(undefined, Match.Maybe(String)); + matches(undefined, Match.Maybe(undefined)); + matches(undefined, Match.Maybe(null)); + + fails(true, Match.Maybe(String)); // different should still fail + matches('String', Match.Maybe(String)); // same should pass + + matches({}, {a: Match.Maybe(Number)}); + matches({a: 1}, {a: Match.Maybe(Number)}); + fails({a: true}, {a: Match.Maybe(Number)}); + + // Match.Optional means "or undefined" at the top level but "or absent" in + // objects. + // Match.Maybe should behave the same as Match.Optional in objects + // including handling nulls + fails({a: undefined}, {a: Match.Maybe(Number)}); + fails({a: null}, {a: Match.Maybe(Number)}); + const F = function () { + this.x = 123; + }; + + fails(new F, { x: 123 }); + + matches({}, Match.ObjectWithValues(Number)); + matches({x: 1}, Match.ObjectWithValues(Number)); + matches({x: 1, y: 2}, Match.ObjectWithValues(Number)); + fails({x: 1, y: '2'}, Match.ObjectWithValues(Number)); + + matches('asdf', 'asdf'); + fails('asdf', 'monkey'); + matches(123, 123); + fails(123, 456); + fails('123', 123); + fails(123, '123'); + matches(true, true); + matches(false, false); + fails(true, false); + fails(true, 'true'); + fails('false', false); + + matches(/foo/, RegExp); + fails(/foo/, String); + matches(new Date, Date); + fails(new Date, Number); + matches(EJSON.newBinary(42), Match.Where(EJSON.isBinary)); + fails([], Match.Where(EJSON.isBinary)); + + matches(42, Match.Where(x => x % 2 === 0)); + fails(43, Match.Where(x => x % 2 === 0)); + + matches({ + a: 'something', + b: [ + {x: 42, k: null}, + {x: 43, k: true, p: ['yay']}, + ], + }, { + a: String, + b: [ + Match.ObjectIncluding({ + x: Number, + k: Match.OneOf(null, Boolean) + }), + ], + }); + + + // Match.Integer + matches(-1, Match.Integer); + matches(0, Match.Integer); + matches(1, Match.Integer); + matches(-2147483648, Match.Integer); // INT_MIN + matches(2147483647, Match.Integer); // INT_MAX + fails(123.33, Match.Integer); + fails(.33, Match.Integer); + fails(1.348192308491824e+23, Match.Integer); + fails(NaN, Match.Integer); + fails(Infinity, Match.Integer); + fails(-Infinity, Match.Integer); + fails({}, Match.Integer); + fails([], Match.Integer); + fails(function () {}, Match.Integer); + fails(new Date, Match.Integer); + + + // Test non-plain objects. + const parentObj = {foo: 'bar'}; + const childObj = Object.assign(Object.create(parentObj), {bar: 'foo'}); + matches(parentObj, Object); + fails(parentObj, {foo: String, bar: String}); + fails(parentObj, {bar: String}); + matches(parentObj, {foo: String}); + fails(childObj, Object); + fails(childObj, {foo: String, bar: String}); + fails(childObj, {bar: String}); + fails(childObj, {foo: String}); + + // Functions + const testFunction = () => {}; + matches(testFunction, Function); + fails(5, Function); + + // Circular Reference "Classes" + + const TestInstanceChild = function () {}; + const TestInstanceParent = function (child) { + child._parent = this; + this.child = child; + }; + + const testInstanceChild = new TestInstanceChild() + const testInstanceParent = new TestInstanceParent(testInstanceChild); + + matches(TestInstanceParent, Function); + matches(testInstanceParent, TestInstanceParent); + fails(testInstanceChild, TestInstanceParent); + + matches(testInstanceParent, Match.Optional(TestInstanceParent)); + matches(testInstanceParent, Match.Maybe(TestInstanceParent)); + + // Circular Reference Objects + + const circleFoo = {}; + const circleBar = {}; + circleFoo.bar = circleBar; + circleBar.foo = circleFoo; + fails(circleFoo, null); + + // Test that "arguments" is treated like an array. + const argumentsMatches = function () { + matches(arguments, [Number]); + }; + argumentsMatches(); + argumentsMatches(1); + argumentsMatches(1, 2); + const argumentsFails = function () { + fails(arguments, [Number]); + }; + argumentsFails('123'); + argumentsFails(1, '23'); +}); + +Tinytest.add('check - check throw all errors deeply nested', test => { + let error; + + const value = { + text: 1, + emails: ['2', 3, 4], + things: [{id: '1', num: 1}, {id: 2, num: 2}, {id: 3, num: '3'}], + stuff: {foo: 'true', bar: 3, items: [{x: 1, y: '1'}, {x: '2', y: 2}, {x: '3', y: '3'}]}, + any: { a: 'a' }, + maybe: { m: 'm', a: [1, '2'], b: [{x: 1, y: '1'}, {x: '2', y: 2}, {x: '3', y: '3'}] }, + opt: { o: 'm', a: [1, '2'], b: [{x: 1, y: '1'}, {x: '2', y: 2}, {x: '3', y: '3'}] }, + int: { i: 1.2, a: [1, '2'], b: [{x: 1, y: '1'}, {x: '2', y: 2}, {x: '3', y: '3'}] }, + oneOf: { f: 'm', a: [1, '2'], b: [{x: 1, y: '1'}, {x: '2', y: 2}, {x: '3', y: '3'}] }, + where: { w: 'a', a: [1, '2'], b: [{x: 1, y: '1'}, {x: '2', y: 2}, {x: '3', y: '3'}] }, + whereArr: [1, 2, 3] + }; + + const pattern = { + text: String, + emails: [String], + things: [{id: String, num: Number}], + stuff: {foo: Boolean, bar: String, items: [{ x: String, y: Number }]}, + any: Match.Any, + maybe: { m: Match.Maybe(Number), a: [Match.Maybe(Number)], b: Match.Maybe([{ x: String, y: Number }]) }, + opt: { m: Match.Optional(Number), a: [Match.Optional(Number)], b: Match.Optional([{ x: String, y: Number }]) }, + int: { i: Match.Integer, a: [Match.Integer], b: [{ x: Match.Integer, y: Number }]}, + oneOf: { f: Match.OneOf(Number, Boolean), a: [Match.OneOf(Boolean, Function)], b: [{ x: Match.OneOf(String, Number), y: Match.OneOf(Boolean, null) }]}, + where: { + w: Match.Where((x) => { + check(x, String); + return x.length > 1; + }), + a: Match.Where((x) => { + check(x, [Number]); + return x > 1; + }) + }, + whereArr: Match.Where((x) => { + check(x, [String]); + return x.length === 1; + }) + } + + try { + check(value, pattern, {throwAllErrors: true}); + } catch (e) { + error = e; + } + + test.isTrue(error); + test.equal(error.length, 37); + error.every(e => test.instanceOf(e, Match.Error)); + test.isFalse(Match.test(value, pattern)); +}) + Tinytest.add('check - argument checker', test => { const checksAllArguments = (f, ...args) => Match._failIfArgumentsAreNotAllChecked(f, {}, args, 'test'); diff --git a/packages/check/package.js b/packages/check/package.js index 61ec42f92ce..68b68804d0c 100644 --- a/packages/check/package.js +++ b/packages/check/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Check whether a value matches a pattern', - version: '1.3.3-alpha300.19', + version: '1.4.2-rc300.2', }); Package.onUse(api => { diff --git a/packages/constraint-solver/.npm/package/.gitignore b/packages/constraint-solver/.npm/package/.gitignore new file mode 100644 index 00000000000..3c3629e647f --- /dev/null +++ b/packages/constraint-solver/.npm/package/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/constraint-solver/.npm/package/README b/packages/constraint-solver/.npm/package/README new file mode 100644 index 00000000000..3d492553a43 --- /dev/null +++ b/packages/constraint-solver/.npm/package/README @@ -0,0 +1,7 @@ +This directory and the files immediately inside it are automatically generated +when you change this package's NPM dependencies. Commit the files in this +directory (npm-shrinkwrap.json, .gitignore, and this README) to source control +so that others run the same versions of sub-dependencies. + +You should NOT check in the node_modules directory that Meteor automatically +creates; if you are using git, the .gitignore file tells git to ignore it. diff --git a/packages/constraint-solver/.npm/package/npm-shrinkwrap.json b/packages/constraint-solver/.npm/package/npm-shrinkwrap.json new file mode 100644 index 00000000000..2ecd80adff5 --- /dev/null +++ b/packages/constraint-solver/.npm/package/npm-shrinkwrap.json @@ -0,0 +1,45 @@ +{ + "lockfileVersion": 4, + "dependencies": { + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==" + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==" + } + } +} diff --git a/packages/constraint-solver/benchmark-tests.js b/packages/constraint-solver/benchmark-tests.js index 996216919be..52b35d10e54 100644 --- a/packages/constraint-solver/benchmark-tests.js +++ b/packages/constraint-solver/benchmark-tests.js @@ -274,7 +274,7 @@ runBenchmarks && Tinytest.addAsync("constraint solver - benchmark on gems - rail var solution = resolved.answer; // check that root deps are the same - _.each(args.dependencies, function (dep) { + args.dependencies.forEach(function (dep) { if (previousSolution[dep]) test.equal(solution[dep], previousSolution[dep], dep); }); @@ -285,17 +285,17 @@ runBenchmarks && Tinytest.addAsync("constraint solver - benchmark on gems - rail function getCatalogStub (gems) { return { getSortedVersionRecords(name) { - var versions = _.chain(gems) - .filter(function (pv) { return pv.name === name; }) - .pluck('number') + var versions = Object.values(gems.filter(function (pv) { return pv.name === name; }) + .map(function(gem) { + return gem.number + }) .filter(function (v) { return PackageVersion.getValidServerVersion(v); }) - .sort(PackageVersion.compare) - .uniq(true) - .value(); - return _.map(versions, function (version) { - var gem = _.find(gems, function (pv) { + .sort(PackageVersion.compare)); + + return versions.map(function (version) { + var gem = gems.find(function (pv) { return pv.name === name && pv.number === version; }); @@ -305,7 +305,7 @@ function getCatalogStub (gems) { dependencies: {} }; - _.each(gem.dependencies, function (dep) { + gem.dependencies.forEach(function (dep) { var name = dep[0]; var constraint = dep[1]; @@ -333,4 +333,4 @@ function getCatalogStub (gems) { return result; } }; -} +} \ No newline at end of file diff --git a/packages/constraint-solver/catalog-cache-tests.js b/packages/constraint-solver/catalog-cache-tests.js index f7bb34710df..7ea312ab9b5 100644 --- a/packages/constraint-solver/catalog-cache-tests.js +++ b/packages/constraint-solver/catalog-cache-tests.js @@ -38,8 +38,8 @@ Tinytest.add("constraint solver - CatalogCache", function (test) { var pvs = {}; cache.eachPackageVersion(function (pv, deps) { check(pv, CS.PackageAndVersion); - check(_.values(deps), [CS.Dependency]); - pvs[pv.package+' '+pv.version] = _.keys(deps).sort(); + check(Object.values(deps), [CS.Dependency]); + pvs[`${pv.package} ${pv.version}`] = Object.keys(deps).sort(); }); test.equal(pvs, {'foo 1.0.0': ['bar'], 'foo 1.0.1': ['bar', 'bzzz', 'weakly1', 'weakly2']}); @@ -52,9 +52,9 @@ Tinytest.add("constraint solver - CatalogCache", function (test) { test.equal(oneVersion.length, 1); // don't know which it is var foos = []; - _.each(cache.getPackageVersions('foo'), function (v) { + cache.getPackageVersions('foo').forEach(function (v) { var depMap = cache.getDependencyMap('foo', v); - foos.push([v, _.map(depMap, String).sort()]); + foos.push([v, Object.values(depMap).map(String).sort()]); }); // versions should come out sorted, just like this. test.equal(foos, @@ -81,4 +81,4 @@ Tinytest.add("constraint solver - CatalogCache", function (test) { return true; }); test.equal(onePackage.length, 1); // don't know which package it is -}); +}); \ No newline at end of file diff --git a/packages/constraint-solver/catalog-cache.js b/packages/constraint-solver/catalog-cache.js index 1c3d311421a..6c7489d5280 100644 --- a/packages/constraint-solver/catalog-cache.js +++ b/packages/constraint-solver/catalog-cache.js @@ -1,3 +1,6 @@ +const has = require('lodash.has'); +const memoize = require('lodash.memoize'); + var CS = ConstraintSolver; var PV = PackageVersion; @@ -18,7 +21,7 @@ CS.CatalogCache = function () { }; CS.CatalogCache.prototype.hasPackageVersion = function (pkg, version) { - return _.has(this._dependencies, pvkey(pkg, version)); + return has(this._dependencies, pvkey(pkg, version)); }; CS.CatalogCache.prototype.addPackageVersion = function (p, v, deps) { @@ -28,11 +31,11 @@ CS.CatalogCache.prototype.addPackageVersion = function (p, v, deps) { check(deps, [CS.Dependency]); var key = pvkey(p, v); - if (_.has(this._dependencies, key)) { + if (has(this._dependencies, key)) { throw new Error("Already have an entry for " + key); } - if (! _.has(this._versions, p)) { + if (!has(this._versions, p)) { this._versions[p] = []; } this._versions[p].push(v); @@ -40,9 +43,9 @@ CS.CatalogCache.prototype.addPackageVersion = function (p, v, deps) { var depsByPackage = {}; this._dependencies[key] = depsByPackage; - _.each(deps, function (d) { + deps.forEach(function (d) { var p2 = d.packageConstraint.package; - if (_.has(depsByPackage, p2)) { + if (has(depsByPackage, p2)) { throw new Error("Can't have two dependencies on " + p2 + " in " + key); } @@ -55,7 +58,7 @@ CS.CatalogCache.prototype.addPackageVersion = function (p, v, deps) { // `d.packageConstraint.package`. (Don't mutate the map.) CS.CatalogCache.prototype.getDependencyMap = function (p, v) { var key = pvkey(p, v); - if (! _.has(this._dependencies, key)) { + if (!has(this._dependencies, key)) { throw new Error("No entry for " + key); } return this._dependencies[key]; @@ -64,14 +67,14 @@ CS.CatalogCache.prototype.getDependencyMap = function (p, v) { // Returns an array of version strings, sorted, possibly empty. // (Don't mutate the result.) CS.CatalogCache.prototype.getPackageVersions = function (pkg) { - var result = (_.has(this._versions, pkg) ? + var result = (has(this._versions, pkg) ? this._versions[pkg] : []); if ((!result.length) || result.sorted) { return result; } else { // sort in place, and record so that we don't sort redundantly // (we'll sort again if more versions are pushed onto the array) - var pvParse = _.memoize(PV.parse); + var pvParse = memoize(PV.parse); result.sort(function (a, b) { return PV.compare(pvParse(a), pvParse(b)); }); @@ -81,16 +84,16 @@ CS.CatalogCache.prototype.getPackageVersions = function (pkg) { }; CS.CatalogCache.prototype.hasPackage = function (pkg) { - return _.has(this._versions, pkg); + return has(this._versions, pkg); }; CS.CatalogCache.prototype.toJSONable = function () { var self = this; var data = {}; - _.each(self._dependencies, function (depsByPackage, key) { + Object.entries(self._dependencies).forEach(function ([key, depsByPackage]) { // depsByPackage is a map of String -> Dependency. // Map over the values to get an array of String. - data[key] = _.map(depsByPackage, function (dep) { + data[key] = Object.values(depsByPackage).map(function (dep) { return dep.toString(); }); }); @@ -101,12 +104,12 @@ CS.CatalogCache.fromJSONable = function (obj) { check(obj, { data: Object }); var cache = new CS.CatalogCache(); - _.each(obj.data, function (depsArray, pv) { + Object.entries(obj.data).forEach(function ([pv, depsArray]) { check(depsArray, [String]); pv = CS.PackageAndVersion.fromString(pv); cache.addPackageVersion( pv.package, pv.version, - _.map(depsArray, function (str) { + depsArray.map(function (str) { return CS.Dependency.fromString(str); })); }); @@ -118,8 +121,8 @@ CS.CatalogCache.fromJSONable = function (obj) { // iteration is stopped. There's no particular order to the iteration. CS.CatalogCache.prototype.eachPackageVersion = function (iter) { var self = this; - _.find(self._dependencies, function (value, key) { - var stop = iter(CS.PackageAndVersion.fromString(key), value); + Object.keys(self._dependencies).find(function (key) { + var stop = iter(CS.PackageAndVersion.fromString(key), self._dependencies[key]); return stop; }); }; @@ -129,7 +132,7 @@ CS.CatalogCache.prototype.eachPackageVersion = function (iter) { // If `iter` returns true, iteration is stopped. ConstraintSolver.CatalogCache.prototype.eachPackage = function (iter) { var self = this; - _.find(_.keys(self._versions), function (key) { + Object.keys(self._versions).find(function (key) { var stop = iter(key, self.getPackageVersions(key)); return stop; }); diff --git a/packages/constraint-solver/catalog-loader.js b/packages/constraint-solver/catalog-loader.js index 3f75c98e95a..a489342c006 100644 --- a/packages/constraint-solver/catalog-loader.js +++ b/packages/constraint-solver/catalog-loader.js @@ -1,3 +1,5 @@ +const has = require('lodash.has'); + var PV = PackageVersion; var CS = ConstraintSolver; @@ -35,10 +37,10 @@ CS.CatalogLoader = function (fromCatalog, toCatalogCache) { }; var convertDeps = function (catalogDeps) { - return _.map(catalogDeps, function (dep, pkg) { + return Object.entries(catalogDeps).map(function ([pkg, dep], ) { // The dependency is strong if any of its "references" // (for different architectures) are strong. - var isStrong = _.any(dep.references, function (ref) { + var isStrong = dep.references.some(function (ref) { return !ref.weak; }); @@ -52,7 +54,7 @@ var convertDeps = function (catalogDeps) { // Since we don't fetch different versions of a package independently // at the moment, this helper is where we get our data. CS.CatalogLoader.prototype._getSortedVersionRecords = async function (pkg) { - if (! _.has(this._sortedVersionRecordsCache, pkg)) { + if (!has(this._sortedVersionRecordsCache, pkg)) { this._sortedVersionRecordsCache[pkg] = await this.catalog.getSortedVersionRecords(pkg); } @@ -65,8 +67,8 @@ CS.CatalogLoader.prototype.loadSingleVersion = async function (pkg, version) { var cache = self.catalogCache; if (! cache.hasPackageVersion(pkg, version)) { var rec; - if (_.has(self._sortedVersionRecordsCache, pkg)) { - rec = _.find(self._sortedVersionRecordsCache[pkg], + if (has(self._sortedVersionRecordsCache, pkg)) { + rec = self._sortedVersionRecordsCache[pkg].find( function (r) { return r.version === version; }); @@ -84,7 +86,7 @@ CS.CatalogLoader.prototype.loadAllVersions = async function (pkg) { var self = this; var cache = self.catalogCache; var versionRecs = await self._getSortedVersionRecords(pkg); - _.each(versionRecs, function (rec) { + versionRecs.forEach(function (rec) { var version = rec.version; if (! cache.hasPackageVersion(pkg, version)) { var deps = convertDeps(rec.dependencies); @@ -106,20 +108,20 @@ CS.CatalogLoader.prototype.loadAllVersionsRecursive = async function (packageLis var packagesEverEnqueued = {}; var enqueue = function (pkg) { - if (! _.has(packagesEverEnqueued, pkg)) { + if (!has(packagesEverEnqueued, pkg)) { packagesEverEnqueued[pkg] = true; loadQueue.push(pkg); } }; - _.each(packageList, enqueue); + packageList.forEach(enqueue); while (loadQueue.length) { var pkg = loadQueue.pop(); await self.loadAllVersions(pkg); - _.each(self.catalogCache.getPackageVersions(pkg), function (v) { + self.catalogCache.getPackageVersions(pkg).forEach(function (v) { var depMap = self.catalogCache.getDependencyMap(pkg, v); - _.each(depMap, function (dep, package2) { + Object.entries(depMap).forEach(function ([package2, dep]) { enqueue(package2); }); }); diff --git a/packages/constraint-solver/constraint-solver-input.js b/packages/constraint-solver/constraint-solver-input.js index 5c6173c8d5c..db862d035f7 100644 --- a/packages/constraint-solver/constraint-solver-input.js +++ b/packages/constraint-solver/constraint-solver-input.js @@ -1,3 +1,7 @@ +const has = require('lodash.has'); +const isEmpty = require('lodash.isempty'); +const isEqual = require('lodash.isequal'); + var PV = PackageVersion; var CS = ConstraintSolver; @@ -18,7 +22,7 @@ CS.Input = function (dependencies, constraints, catalogCache, options) { // Convert them to our PackageConstraint class if necessary. (This is // just top-level constraints from .meteor/packages or running from // checkout, so it's not a lot of data.) - constraints = _.map(constraints, function (c) { + constraints = constraints.map(function (c) { if (c instanceof PV.PackageConstraint) { return c; } else { @@ -62,27 +66,27 @@ CS.Input = function (dependencies, constraints, catalogCache, options) { validatePackageName(packageName); }); self.catalogCache.eachPackageVersion(function (packageName, depsMap) { - _.each(depsMap, function (deps, depPackageName) { + Object.entries(depsMap).forEach(function ([depPackageName, deps]) { validatePackageName(depPackageName); }); }); - _.each(self.dependencies, validatePackageName); - _.each(self.upgrade, validatePackageName); - _.each(self.constraints, function (c) { + self.dependencies.forEach(validatePackageName); + self.upgrade.forEach(validatePackageName); + self.constraints.forEach(function (c) { validatePackageName(c.package); }); if (self.previousSolution) { - _.each(_.keys(self.previousSolution), + Object.keys(self.previousSolution).forEach( validatePackageName); } self._dependencySet = {}; // package name -> true - _.each(self.dependencies, function (d) { + self.dependencies.forEach(function (d) { self._dependencySet[d] = true; }); self._upgradeSet = {}; - _.each(self.upgrade, function (u) { + self.upgrade.forEach(function (u) { self._upgradeSet[u] = true; }); }; @@ -107,33 +111,33 @@ CS.Input.prototype.isKnownPackage = function (p) { }; CS.Input.prototype.isRootDependency = function (p) { - return _.has(this._dependencySet, p); + return has(this._dependencySet, p); }; CS.Input.prototype.isUpgrading = function (p) { - return _.has(this._upgradeSet, p); + return has(this._upgradeSet, p); }; CS.Input.prototype.isInPreviousSolution = function (p) { - return !! (this.previousSolution && _.has(this.previousSolution, p)); + return !! (this.previousSolution && has(this.previousSolution, p)); }; function getMentionedPackages(input) { var packages = {}; // package -> true - _.each(input.dependencies, function (pkg) { + input.dependencies.forEach(function (pkg) { packages[pkg] = true; }); - _.each(input.constraints, function (constraint) { + input.constraints.forEach(function (constraint) { packages[constraint.package] = true; }); if (input.previousSolution) { - _.each(input.previousSolution, function (version, pkg) { + Object.entries(input.previousSolution).forEach(function ([pkg, version]) { packages[pkg] = true; }); } - return _.keys(packages); + return Object.keys(packages); } CS.Input.prototype.loadFromCatalog = async function (catalogLoader) { @@ -170,7 +174,7 @@ CS.Input.prototype.isEqual = function (otherInput) { // the same input. So by omitting `catalogCache` we no longer need // to reload the entire relevant part of the catalog from SQLite on // every rebuild! - return _.isEqual( + return isEqual( a.toJSONable(true), b.toJSONable(true) ); @@ -180,7 +184,7 @@ CS.Input.prototype.toJSONable = function (omitCatalogCache) { var self = this; var obj = { dependencies: self.dependencies, - constraints: _.map(self.constraints, function (c) { + constraints: self.constraints.map(function (c) { return c.toString(); }) }; @@ -194,7 +198,7 @@ CS.Input.prototype.toJSONable = function (omitCatalogCache) { if (self.upgrade.length) { obj.upgrade = self.upgrade; } - if (! _.isEmpty(self.anticipatedPrereleases)) { + if (!isEmpty(self.anticipatedPrereleases)) { obj.anticipatedPrereleases = self.anticipatedPrereleases; } if (self.previousSolution !== null) { @@ -225,7 +229,7 @@ CS.Input.fromJSONable = function (obj) { return new CS.Input( obj.dependencies, - _.map(obj.constraints, function (cstr) { + obj.constraints.map(function (cstr) { return PV.parsePackageConstraint(cstr); }), CS.CatalogCache.fromJSONable(obj.catalogCache), diff --git a/packages/constraint-solver/constraint-solver-tests.js b/packages/constraint-solver/constraint-solver-tests.js index 432dbd0152b..7f8a1a12397 100644 --- a/packages/constraint-solver/constraint-solver-tests.js +++ b/packages/constraint-solver/constraint-solver-tests.js @@ -1,16 +1,20 @@ +const has = Npm.require('lodash.has'); +const isString = Npm.require('lodash.isstring'); +const isEmpty = Npm.require('lodash.isempty'); + var PV = PackageVersion; var CS = ConstraintSolver; var makeResolver = function (data) { var Versions = new LocalCollection; - _.each(data, function (versionDescription) { + data.forEach(function (versionDescription) { var packageName = versionDescription.shift(); var version = versionDescription.shift(); var deps = versionDescription.shift(); - var constructedDeps = {}; - _.each(deps, function (constraint, name) { + if (!isEmpty(deps)) { + Object.entries(deps).forEach(function ([name, constraint]) { constructedDeps[name] = { constraint: constraint, references: [ @@ -20,6 +24,7 @@ var makeResolver = function (data) { ] }; }); + } Versions.insert({ packageName: packageName, version: version, dependencies: constructedDeps }); }); @@ -73,8 +78,7 @@ var defaultResolver = makeResolver([ // in the returned arrays. splitArgs = function (deps) { var dependencies = [], constraints = []; - - _.each(deps, function (constr, dep) { + Object.entries(deps).forEach(function ([dep, constr]) { if (constr && constr.charAt(0) === 'w') { constr = constr.slice(1); } else { @@ -89,7 +93,7 @@ splitArgs = function (deps) { var testWithResolver = async function (test, resolver, f) { var answerToString = function (answer) { - var pvs = _.map(answer, function (v, p) { return p + ' ' + v; }); + var pvs = Object.keys(answer).map(function (p) { return p + ' ' + answer[p]; }); return pvs.sort().join('\n'); }; var t = async function (deps, expected, options) { @@ -306,7 +310,7 @@ Tinytest.addAsync("constraint solver - previousSolution", async function (test) Tinytest.addAsync("constraint solver - no constraint dependency - anything", async function (test) { var versions = (await defaultResolver.resolve(["sparkle"], [])).answer; - test.isTrue(_.isString(versions.sparkle)); + test.isTrue(isString(versions.sparkle)); }); @@ -333,9 +337,9 @@ Tinytest.add("constraint solver - input serialization", function (test) { test.equal(input1.upgradeIndirectDepPatchVersions, false); var obj1 = input1.toJSONable(); - test.isFalse(_.has(obj1, 'upgrade')); - test.isFalse(_.has(obj1, 'anticipatedPrereleases')); - test.isFalse(_.has(obj1, 'previousSolution')); + test.isFalse(has(obj1, 'upgrade')); + test.isFalse(has(obj1, 'anticipatedPrereleases')); + test.isFalse(has(obj1, 'previousSolution')); var input2 = CS.Input.fromJSONable(obj1); var obj2 = input2.toJSONable(); diff --git a/packages/constraint-solver/constraint-solver.js b/packages/constraint-solver/constraint-solver.js index 9337e65f5be..a5ebb1a7163 100644 --- a/packages/constraint-solver/constraint-solver.js +++ b/packages/constraint-solver/constraint-solver.js @@ -1,3 +1,5 @@ +const isEqual = require('lodash.isequal'); + var PV = PackageVersion; var CS = ConstraintSolver; @@ -50,13 +52,17 @@ CS.PackagesResolver.prototype.resolve = async function (dependencies, constraint var Profile = (self._options.Profile || CS.DummyProfile); var input = await Profile.time("new CS.Input", function () { + const { upgrade, + anticipatedPrereleases, + previousSolution, + allowIncompatibleUpdate, + upgradeIndirectDepPatchVersions } = options; return new CS.Input(dependencies, constraints, self.catalogCache, - _.pick(options, - 'upgrade', - 'anticipatedPrereleases', - 'previousSolution', - 'allowIncompatibleUpdate', - 'upgradeIndirectDepPatchVersions')); + { upgrade, + anticipatedPrereleases, + previousSolution, + allowIncompatibleUpdate, + upgradeIndirectDepPatchVersions }); }); // The constraint solver avoids re-solving everything from scratch on @@ -78,14 +84,14 @@ CS.PackagesResolver.prototype.resolve = async function (dependencies, constraint resultCache = null; } else if (resultCache && resultCache.lastInput && - _.isEqual(resultCache.lastInput, + isEqual(resultCache.lastInput, input.toJSONable(true))) { return resultCache.lastOutput; } if (options.supportedIsobuildFeaturePackages) { - _.each(options.supportedIsobuildFeaturePackages, function (versions, pkg) { - _.each(versions, function (version) { + Object.entries(options.supportedIsobuildFeaturePackages).forEach(function ([pkg, versions]) { + versions.forEach(function (version) { input.catalogCache.addPackageVersion(pkg, version, []); }); }); @@ -100,7 +106,7 @@ CS.PackagesResolver.prototype.resolve = async function (dependencies, constraint if (options.previousSolution && options.missingPreviousVersionIsError) { // see comment where missingPreviousVersionIsError is passed in await Profile.time("check for previous versions in catalog", function () { - _.each(options.previousSolution, function (version, pkg) { + Object.entries(options.previousSolution).forEach(function ([pkg, version]) { if (! input.catalogCache.hasPackageVersion(pkg, version)) { CS.throwConstraintSolverError( "Package version not in catalog: " + pkg + " " + version); @@ -196,7 +202,7 @@ CS.PackagesResolver._resolveWithInput = async function (input, options) { // with an `alternatives` property lifted from one. // - version: version String CS.isConstraintSatisfied = function (pkg, vConstraint, version) { - return _.some(vConstraint.alternatives, function (simpleConstraint) { + return vConstraint.alternatives.some(function (simpleConstraint) { var type = simpleConstraint.type; if (type === "any-reasonable") { diff --git a/packages/constraint-solver/datatypes-tests.js b/packages/constraint-solver/datatypes-tests.js index 88275ee8c99..8d070790884 100644 --- a/packages/constraint-solver/datatypes-tests.js +++ b/packages/constraint-solver/datatypes-tests.js @@ -2,7 +2,7 @@ var PV = PackageVersion; var CS = ConstraintSolver; Tinytest.add("constraint solver - datatypes - Dependency", function (test) { - _.each(["foo", "foo@1.0.0"], function (foo) { + ["foo", "foo@1.0.0"].forEach(function (foo) { var d1 = new CS.Dependency(PV.parsePackageConstraint(foo)); test.equal(d1.packageConstraint.toString(), foo); test.equal(d1.isWeak, false); diff --git a/packages/constraint-solver/input-tests.js b/packages/constraint-solver/input-tests.js index 671871c59dc..8fd26cdb840 100644 --- a/packages/constraint-solver/input-tests.js +++ b/packages/constraint-solver/input-tests.js @@ -12,7 +12,7 @@ var CS = ConstraintSolver; // in that order. If that's not true, these tests will break. var sortKeys = function (obj) { var result = {}; - _.each(_.keys(obj).sort(), function (k) { + Object.keys(obj).sort().forEach(function (k) { result[k] = obj[k]; }); return result; @@ -22,7 +22,7 @@ var formatSolution = function (obj) { // results into tests. return JSON.stringify({ answer: sortKeys(obj.answer), - allAnswers: obj.allAnswers && _.map(obj.allAnswers, sortKeys), + allAnswers: obj.allAnswers && obj.allAnswers.map(sortKeys), neededToUseUnanticipatedPrereleases: obj.neededToUseUnanticipatedPrereleases }, null, 2); }; @@ -36,7 +36,7 @@ var doTest = async function (test, inputJSONable, outputJSONable, options) { } if (typeof outputJSONable.neededToUseUnanticipatedPrereleases !== 'boolean') { - outputJSONable = _.extend(outputJSONable, { + outputJSONable = Object.assign(outputJSONable, { neededToUseUnanticipatedPrereleases: ( !! outputJSONable.neededToUseUnanticipatedPrereleases) }); diff --git a/packages/constraint-solver/package.js b/packages/constraint-solver/package.js index ca6e7be28f3..3afe3c564c8 100644 --- a/packages/constraint-solver/package.js +++ b/packages/constraint-solver/package.js @@ -1,12 +1,23 @@ Package.describe({ summary: "Given the set of the constraints, picks a satisfying configuration", - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', +}); + +Npm.depends({ + 'lodash.has': '4.5.2', + 'lodash.memoize': '4.1.2', + 'lodash.isequal': '4.5.0', + 'lodash.isempty': '4.4.0', + 'lodash.zip': '4.2.0', + 'lodash.groupby': '4.6.0', + 'lodash.isstring': '4.0.1', + 'lodash.isobject': '3.0.2' }); Package.onUse(function (api) { api.export('ConstraintSolver'); api.use([ - 'underscore', + 'ecmascript', 'check', 'package-version-parser', 'logic-solver' @@ -27,7 +38,6 @@ Package.onTest(function (api) { 'tinytest', 'minimongo', 'package-version-parser', - 'underscore', 'check' ]); diff --git a/packages/constraint-solver/solver.js b/packages/constraint-solver/solver.js index 102e957d434..d14b1d50584 100644 --- a/packages/constraint-solver/solver.js +++ b/packages/constraint-solver/solver.js @@ -1,3 +1,8 @@ +const groupBy = require('lodash.groupby'); +const has = require('lodash.has'); +const memoize = require('lodash.memoize'); +const zip = require('lodash.zip'); + var CS = ConstraintSolver; var PV = PackageVersion; @@ -16,10 +21,10 @@ CS.Solver = function (input, options) { self.errors = []; // [String] self.pricer = new CS.VersionPricer(); - self.getConstraintFormula = _.memoize(_getConstraintFormula, - function (p, vConstraint) { - return p + "@" + vConstraint.raw; - }); + self.getConstraintFormula = memoize(_getConstraintFormula, + function (p, vConstraint) { + return p + "@" + vConstraint.raw; + }); self.options = options || {}; self.Profile = (self.options.Profile || CS.DummyProfile); @@ -41,7 +46,7 @@ CS.Solver.prototype.init = async function() { CS.Solver.prototype.throwAnyErrors = function () { if (this.errors.length) { - var multiline = _.any(this.errors, function (e) { + var multiline = this.errors.some(function (e) { return /\n/.test(e); }); CS.throwConstraintSolverError(this.errors.join( @@ -51,7 +56,7 @@ CS.Solver.prototype.throwAnyErrors = function () { CS.Solver.prototype.getVersions = function (pkg) { var self = this; - if (_.has(self.analysis.allowedVersions, pkg)) { + if (has(self.analysis.allowedVersions, pkg)) { return self.analysis.allowedVersions[pkg]; } else { return self.input.catalogCache.getPackageVersions(pkg); @@ -94,20 +99,20 @@ CS.Solver.prototype.analyze = async function () { // track such packages in packagesWithNoAllowedVersions so that we // throw a good error later. await Profile.time("analyze allowed versions", function () { - _.each(_.groupBy(input.constraints, 'package'), function (cs, p) { + Object.entries(groupBy(input.constraints, 'package')).forEach(function ([p, cs]) { var versions = cache.getPackageVersions(p); - if (! versions.length) { + if (!versions.length) { // deal with wholly unknown packages later return; } - _.each(cs, function (constr) { - versions = _.filter(versions, function (v) { + cs.forEach(function (constr) { + versions = versions.filter(function (v) { return CS.isConstraintSatisfied(p, constr.versionConstraint, v); }); }); - if (! versions.length) { - analysis.packagesWithNoAllowedVersions[p] = _.filter(cs, function (c) { - return !! c.constraintString; + if (!versions.length) { + analysis.packagesWithNoAllowedVersions[p] = cs.filter(function (c) { + return !!c.constraintString; }); } analysis.allowedVersions[p] = versions; @@ -122,11 +127,11 @@ CS.Solver.prototype.analyze = async function () { analysis.previousRootDepVersions = []; await Profile.time("analyze root dependencies", function () { - _.each(input.dependencies, function (p) { - if (! input.isKnownPackage(p)) { + input.dependencies.forEach(function (p) { + if (!input.isKnownPackage(p)) { analysis.unknownRootDeps.push(p); } else if (input.isInPreviousSolution(p) && - ! input.isUpgrading(p)) { + !input.isUpgrading(p)) { analysis.previousRootDepVersions.push(new CS.PackageAndVersion( p, input.previousSolution[p])); } @@ -134,7 +139,7 @@ CS.Solver.prototype.analyze = async function () { // throw if there are unknown packages in root deps if (analysis.unknownRootDeps.length) { - _.each(analysis.unknownRootDeps, function (p) { + analysis.unknownRootDeps.forEach(function (p) { if (CS.isIsobuildFeaturePackage(p)) { self.errors.push( 'unsupported Isobuild feature "' + p + @@ -175,21 +180,21 @@ CS.Solver.prototype.analyze = async function () { var markReachable = function (p) { analysis.reachablePackages[p] = true; - _.each(self.getVersions(p), function (v) { - _.each(cache.getDependencyMap(p, v), function (dep) { + self.getVersions(p).forEach(function (v) { + Object.values(cache.getDependencyMap(p, v)).forEach(function (dep) { // `dep` is a CS.Dependency var p2 = dep.packageConstraint.package; - if (! input.isKnownPackage(p2)) { + if (!input.isKnownPackage(p2)) { // record this package so we will generate a variable // for it. we'll try not to select it, and ultimately // throw an error if we are forced to. - if (! _.has(analysis.unknownPackages, p2)) { + if (!has(analysis.unknownPackages, p2)) { analysis.unknownPackages[p2] = []; } analysis.unknownPackages[p2].push(pvVar(p, v)); } else { - if (! dep.isWeak) { - if (! _.has(analysis.reachablePackages, p2)) { + if (!dep.isWeak) { + if (!has(analysis.reachablePackages, p2)) { markReachable(p2); } } @@ -199,7 +204,7 @@ CS.Solver.prototype.analyze = async function () { }; await Profile.time("analyze reachability", function () { - _.each(input.dependencies, markReachable); + input.dependencies.forEach(markReachable); }); ////////// ANALYZE CONSTRAINTS @@ -221,9 +226,9 @@ CS.Solver.prototype.analyze = async function () { // version constraints is a power-tool that should be used sparingly // by application developers, and never abused by package authors. var overrides = new Set; - _.each(input.constraints, function (c) { + input.constraints.forEach(function (c) { if (c.constraintString && - c.versionConstraint.override) { + c.versionConstraint.override) { overrides.add(c.package); } }); @@ -264,28 +269,28 @@ CS.Solver.prototype.analyze = async function () { } // top-level constraints - _.each(input.constraints, function (c) { + input.constraints.forEach(function (c) { if (c.constraintString) { analysis.constraints.push(new CS.Solver.Constraint( null, c.package, getVersionConstraint(c), "constraint#" + analysis.constraints.length)); if (c.versionConstraint.alternatives.length === 1 && - c.versionConstraint.alternatives[0].type === 'exactly') { + c.versionConstraint.alternatives[0].type === 'exactly') { analysis.topLevelEqualityConstrainedPackages[c.package] = true; } } }); // constraints specified in package dependencies - _.each(_.keys(analysis.reachablePackages), function (p) { - _.each(self.getVersions(p), function (v) { + Object.keys(analysis.reachablePackages).forEach(function (p) { + self.getVersions(p).forEach(function (v) { var pv = pvVar(p, v); - _.each(cache.getDependencyMap(p, v), function (dep) { + Object.values(cache.getDependencyMap(p, v)).forEach(function (dep) { // `dep` is a CS.Dependency var p2 = dep.packageConstraint.package; if (input.isKnownPackage(p2) && - dep.packageConstraint.constraintString) { + dep.packageConstraint.constraintString) { analysis.constraints.push(new CS.Solver.Constraint( pv, p2, getVersionConstraint(dep.packageConstraint), "constraint#" + analysis.constraints.length)); @@ -299,11 +304,11 @@ CS.Solver.prototype.analyze = async function () { await Profile.time("analyze pre-releases", function () { var unanticipatedPrereleases = []; - _.each(_.keys(analysis.reachablePackages), function (p) { + Object.keys(analysis.reachablePackages).forEach(function (p) { var anticipatedPrereleases = input.anticipatedPrereleases[p]; - _.each(self.getVersions(p), function (v) { - if (/-/.test(v) && ! (anticipatedPrereleases && - _.has(anticipatedPrereleases, v))) { + self.getVersions(p).forEach(function (v) { + if (/-/.test(v) && !(anticipatedPrereleases && + has(anticipatedPrereleases, v))) { unanticipatedPrereleases.push(pvVar(p, v)); } }); @@ -361,7 +366,7 @@ CS.Solver.Step.prototype.addTerm = function (term, weight) { if (typeof this.weights === 'number') { if (weight !== this.weights) { throw new Error("Can't specify a different weight now: " + - weight + " != " + this.weights); + weight + " != " + this.weights); } } else { this.weights.push(weight); @@ -378,7 +383,7 @@ var DEBUG = false; CS.Solver.prototype.minimize = async function (step, options) { var self = this; - if (_.isArray(step)) { + if (Array.isArray(step)) { // minimize([steps...], options) for (const st of step) { await self.minimize(st, options) @@ -393,7 +398,7 @@ CS.Solver.prototype.minimize = async function (step, options) { var costWeights_ = arguments[2]; var options_ = arguments[3]; if (costWeights_ && typeof costWeights_ === 'object' && - ! _.isArray(costWeights_)) { + !Array.isArray(costWeights_)) { options_ = costWeights_; costWeights_ = null; } @@ -423,29 +428,29 @@ CS.Solver.prototype.minimize = async function (step, options) { self.setSolution(await logic.minimizeWeightedSum( self.solution, optimized.costTerms, optimized.costWeights, { - progress: async function (status, cost) { + progress: async function (status, cost) { if (self.options.yield) { - await self.options.yield(); - } - if (DEBUG) { - if (status === 'improving') { - console.log(cost + " ... trying to improve ..."); - } else if (status === 'trying') { - console.log("... trying " + cost + " ... "); - } + await self.options.yield(); + } + if (DEBUG) { + if (status === 'improving') { + console.log(cost + " ... trying to improve ..."); + } else if (status === 'trying') { + console.log("... trying " + cost + " ... "); } - }, - strategy: (options && options.strategy) - })); + } + }, + strategy: (options && options.strategy) + })); step.optimum = self.solution.getWeightedSum(costTerms, costWeights); if (DEBUG) { console.log(step.optimum + " is optimal"); if (step.optimum) { - _.each(costTerms, function (t, i) { + costTerms.forEach(function (t, i) { var w = (typeof costWeights === 'number' ? costWeights : - costWeights[i]); + costWeights[i]); if (w && self.solution.evaluate(t)) { console.log(" " + w + ": " + t); } @@ -478,32 +483,38 @@ var groupMutuallyExclusiveTerms = function (costTerms, costWeights) { // first space. So "foo 1.0.0" becomes "foo " and "foo" stays "foo". var getTermKey = function (t) { var firstSpace = t.indexOf(' '); - return firstSpace < 0 ? t : t.slice(0, firstSpace+1); + return firstSpace < 0 ? t : t.slice(0, firstSpace + 1); }; // costWeights, as usual, may be a number or an array if (typeof costWeights === 'number') { return { - costTerms: _.map(_.groupBy(costTerms, getTermKey), function (group) { + costTerms: Object.values(groupBy(costTerms, getTermKey)).map(function (group) { return Logic.or(group); }), costWeights: costWeights }; - } else if (! costTerms.length) { + } else if (!costTerms.length) { return { costTerms: costTerms, costWeights: costWeights }; } else { - var weightedTerms = _.zip(costWeights, costTerms); - var newWeightedTerms = _.map(_.groupBy(weightedTerms, function (wt) { + var weightedTerms = zip(costWeights, costTerms); + var newWeightedTerms = Object.values(groupBy(weightedTerms, function (wt) { // construct a string from the weight and term key, for grouping // purposes. since the weight comes first, there's no ambiguity // and the separator char could be pretty much anything. return wt[0] + ' ' + getTermKey(wt[1]); - }), function (wts) { - return [wts[0][0], Logic.or(_.pluck(wts, 1))]; + })).map(function (wts) { + return [wts[0][0], Logic.or(wts.map(function(x){ + return x[1] + }))]; }); return { - costTerms: _.pluck(newWeightedTerms, 1), - costWeights: _.pluck(newWeightedTerms, 0) + costTerms: newWeightedTerms.map(function(x){ + return x[1] + }), + costWeights: newWeightedTerms.map(function(x){ + return x[0] + }) }; } @@ -517,7 +528,7 @@ CS.Solver.prototype.getStepContributions = function (step) { var solution = self.solution; var contributions = {}; var weights = step.weights; - _.each(step.terms, function (t, i) { + step.terms.forEach(function (t, i) { var w = (typeof weights === 'number' ? weights : weights[i]); if (w && self.solution.evaluate(t)) { contributions[t] = w; @@ -527,7 +538,7 @@ CS.Solver.prototype.getStepContributions = function (step) { }; var addCostsToSteps = function (pkg, versions, costs, steps) { - var pvs = _.map(versions, function (v) { + var pvs = versions.map(function (v) { return pvVar(pkg, v); }); for (var j = 0; j < steps.length; j++) { @@ -550,7 +561,7 @@ var addCostsToSteps = function (pkg, versions, costs, steps) { // the cost of every version of every package. This function iterates // over `packages` and puts the result into `Step` objects. CS.Solver.prototype.getVersionCostSteps = async function (stepBaseName, packages, - pricerMode) { + pricerMode) { var self = this; var major = new CS.Solver.Step(stepBaseName + '_major'); var minor = new CS.Solver.Step(stepBaseName + '_minor'); @@ -560,7 +571,7 @@ CS.Solver.prototype.getVersionCostSteps = async function (stepBaseName, packages await self.Profile.time( "calculate " + stepBaseName + " version costs", function () { - _.each(packages, function (p) { + packages.forEach(function (p) { var versions = self.getVersions(p); if (versions.length >= 2) { var costs = self.pricer.priceVersions(versions, pricerMode); @@ -578,8 +589,8 @@ CS.Solver.prototype.getVersionCostSteps = async function (stepBaseName, packages // as `packageAndVersion`. (Actually it's a complicated function of the // previous and new version.) CS.Solver.prototype.getVersionDistanceSteps = async function (stepBaseName, - packageAndVersions, - takePatches) { + packageAndVersions, + takePatches) { var self = this; var incompat = new CS.Solver.Step(stepBaseName + '_incompat'); @@ -591,7 +602,7 @@ CS.Solver.prototype.getVersionDistanceSteps = async function (stepBaseName, await self.Profile.time( "calculate " + stepBaseName + " distance costs", function () { - _.each(packageAndVersions, function (pvArg) { + packageAndVersions.forEach(function (pvArg) { var pkg = pvArg.package; var previousVersion = pvArg.version; var versions = self.getVersions(pkg); @@ -599,7 +610,7 @@ CS.Solver.prototype.getVersionDistanceSteps = async function (stepBaseName, var costs = self.pricer.priceVersionsWithPrevious( versions, previousVersion, takePatches); addCostsToSteps(pkg, versions, costs, - [incompat, major, minor, patch, rest]); + [incompat, major, minor, patch, rest]); } }); }); @@ -610,7 +621,7 @@ CS.Solver.prototype.getVersionDistanceSteps = async function (stepBaseName, CS.Solver.prototype.currentVersionMap = function () { var self = this; var pvs = []; - _.each(self.solution.getTrueVars(), function (x) { + self.solution.getTrueVars().forEach(function (x) { if (x.indexOf(' ') >= 0) { // all variables with spaces in them are PackageAndVersions var pv = CS.PackageAndVersion.fromString(x); @@ -619,11 +630,11 @@ CS.Solver.prototype.currentVersionMap = function () { }); var versionMap = {}; - _.each(pvs, function (pv) { - if (_.has(versionMap, pv.package)) { + pvs.forEach(function (pv) { + if (has(versionMap, pv.package)) { throw new Error("Assertion failure: Selected two versions of " + - pv.package + ", " +versionMap[pv.package] + - " and " + pv.version); + pv.package + ", " + versionMap[pv.package] + + " and " + pv.version); } versionMap[pv.package] = pv.version; }); @@ -636,7 +647,7 @@ CS.Solver.prototype.currentVersionMap = function () { CS.Solver.prototype.setSolution = function (solution) { var self = this; self.solution = solution; - if (! self.solution) { + if (!self.solution) { throw new Error("Unexpected unsatisfiability"); } // When we query a Solution, we always want to treat unknown variables @@ -676,19 +687,19 @@ CS.Solver.prototype._getAnswer = async function (options) { // require root dependencies await Profile.time("require root dependencies", function () { - _.each(input.dependencies, function (p) { + input.dependencies.forEach(function (p) { logic.require(p); }); }); // generate package version variables for known, reachable packages await Profile.time("generate package variables", function () { - _.each(_.keys(analysis.reachablePackages), function (p) { - if (! _.has(analysis.packagesWithNoAllowedVersions, p)) { - var versionVars = _.map(self.getVersions(p), - function (v) { - return pvVar(p, v); - }); + Object.keys(analysis.reachablePackages).forEach(function (p) { + if (!has(analysis.packagesWithNoAllowedVersions, p)) { + var versionVars = self.getVersions(p).map( + function (v) { + return pvVar(p, v); + }); // At most one of ["foo 1.0.0", "foo 1.0.1", ...] is true. logic.require(Logic.atMostOne(versionVars)); // The variable "foo" is true if and only if at least one of the @@ -700,11 +711,11 @@ CS.Solver.prototype._getAnswer = async function (options) { // generate strong dependency requirements await Profile.time("generate dependency requirements", function () { - _.each(_.keys(analysis.reachablePackages), function (p) { - _.each(self.getVersions(p), function (v) { - _.each(cache.getDependencyMap(p, v), function (dep) { + Object.keys(analysis.reachablePackages).forEach(function (p) { + self.getVersions(p).forEach(function (v) { + Object.values(cache.getDependencyMap(p, v)).forEach(function (dep) { // `dep` is a CS.Dependency - if (! dep.isWeak) { + if (!dep.isWeak) { var p2 = dep.packageConstraint.package; logic.require(Logic.implies(pvVar(p, v), p2)); } @@ -716,7 +727,7 @@ CS.Solver.prototype._getAnswer = async function (options) { // generate constraints -- but technically don't enforce them, because // we haven't forced the conflictVars to be false await Profile.time("generate constraints", function () { - _.each(analysis.constraints, function (c) { + analysis.constraints.forEach(function (c) { // We logically require that EITHER a constraint is marked as a // conflict OR it comes from a package version that is not selected // OR its constraint formula must be true. @@ -724,8 +735,8 @@ CS.Solver.prototype._getAnswer = async function (options) { // then a version of it that satisfies our constraint must be true.) logic.require( Logic.or(c.conflictVar, - c.fromVar ? Logic.not(c.fromVar) : [], - self.getConstraintFormula(c.toPackage, c.vConstraint))); + c.fromVar ? Logic.not(c.fromVar) : [], + self.getConstraintFormula(c.toPackage, c.vConstraint))); }); }); @@ -767,9 +778,9 @@ CS.Solver.prototype._getAnswer = async function (options) { } else { var error = 'No version of ' + p + ' satisfies all constraints: ' + - _.map(constrs, function (constr) { - return '@' + constr.constraintString; - }).join(', '); + constrs.map(function (constr) { + return '@' + constr.constraintString; + }).join(', '); error += '\n' + self.listConstraintsOnPackage(p); self.errors.push(error); } @@ -781,7 +792,7 @@ CS.Solver.prototype._getAnswer = async function (options) { // than 0, we'll throw an error later, after we apply the constraints // and the cost function, so that we can explain the problem to the // user in a convincing way. - await self.minimize('unknown_packages', _.keys(analysis.unknownPackages)); + await self.minimize('unknown_packages', Object.keys(analysis.unknownPackages)); // try not to set the conflictVar on any constraint. If the minimum // is greater than 0, we'll throw an error later, after we've run the @@ -789,12 +800,14 @@ CS.Solver.prototype._getAnswer = async function (options) { // If there are conflicts, this minimization can be time-consuming // (several seconds or more). The strategy 'bottom-up' helps by // looking for solutions with few conflicts first. - await self.minimize('conflicts', _.pluck(analysis.constraints, 'conflictVar'), - { strategy: 'bottom-up' }); + await self.minimize('conflicts', analysis.constraints.map(function (constraint) { + return constraint.conflictVar + }), + { strategy: 'bottom-up' }); // Try not to use "unanticipated" prerelease versions await self.minimize('unanticipated_prereleases', - analysis.unanticipatedPrereleases); + analysis.unanticipatedPrereleases); var previousRootSteps = await self.getVersionDistanceSteps( 'previous_root', analysis.previousRootDepVersions); @@ -803,25 +816,25 @@ CS.Solver.prototype._getAnswer = async function (options) { // the "previous_root_major", "previous_root_minor", etc. steps var previousRootVersionParts = previousRootSteps.slice(1); - var toUpdate = _.filter(input.upgrade, function (p) { + var toUpdate = input.upgrade.filter(function (p) { return analysis.reachablePackages[p] === true; }); // make sure packages that are being updated can still count as // a previous_root for the purposes of previous_root_incompat await Profile.time("add terms to previous_root_incompat", function () { - _.each(toUpdate, function (p) { + toUpdate.forEach(function (p) { if (input.isRootDependency(p) && input.isInPreviousSolution(p)) { var parts = self.pricer.partitionVersions( self.getVersions(p), input.previousSolution[p]); - _.each(parts.older.concat(parts.higherMajor), function (v) { + parts.older.concat(parts.higherMajor).forEach(function (v) { previousRootIncompat.addTerm(pvVar(p, v), 1); }); } }); }); - if (! input.allowIncompatibleUpdate) { + if (!input.allowIncompatibleUpdate) { // Enforce that we don't make breaking changes to your root dependencies, // unless you pass --allow-incompatible-update. It will actually be enforced // farther down, but for now, we want to apply this constraint before handling @@ -841,20 +854,20 @@ CS.Solver.prototype._getAnswer = async function (options) { await self.minimize(previousRootVersionParts); - var otherPrevious = _.filter(_.map(input.previousSolution, function (v, p) { + var otherPrevious = Object.entries(input.previousSolution || []).map(function ([p, v]) { return new CS.PackageAndVersion(p, v); - }), function (pv) { + }).filter(function (pv) { var p = pv.package; return analysis.reachablePackages[p] === true && - ! input.isRootDependency(p); + !input.isRootDependency(p); }); await self.minimize(await self.getVersionDistanceSteps( 'previous_indirect', otherPrevious, input.upgradeIndirectDepPatchVersions)); - var newRootDeps = _.filter(input.dependencies, function (p) { - return ! input.isInPreviousSolution(p); + var newRootDeps = input.dependencies.filter(function (p) { + return !input.isInPreviousSolution(p); }); await self.minimize(await self.getVersionCostSteps( @@ -881,10 +894,10 @@ CS.Solver.prototype._getAnswer = async function (options) { // signal. In other words, the user might be better off with some tie-breaker // that looks only at the important packages anyway. await Profile.time("lock down important versions", function () { - _.each(self.currentVersionMap(), function (v, pkg) { + Object.entries(self.currentVersionMap()).forEach(function ([pkg, v]) { if (input.isRootDependency(pkg) || - input.isInPreviousSolution(pkg) || - input.isUpgrading(pkg)) { + input.isInPreviousSolution(pkg) || + input.isUpgrading(pkg)) { logic.require(Logic.implies(pkg, pvVar(pkg, v))); } }); @@ -892,10 +905,10 @@ CS.Solver.prototype._getAnswer = async function (options) { // new, indirect packages are the lowest priority var otherPackages = []; - _.each(_.keys(analysis.reachablePackages), function (p) { - if (! (input.isRootDependency(p) || - input.isInPreviousSolution(p) || - input.isUpgrading(p))) { + Object.keys(analysis.reachablePackages).forEach(function (p) { + if (!(input.isRootDependency(p) || + input.isInPreviousSolution(p) || + input.isUpgrading(p))) { otherPackages.push(p); } }); @@ -904,17 +917,17 @@ CS.Solver.prototype._getAnswer = async function (options) { 'new_indirect', otherPackages, CS.VersionPricer.MODE_GRAVITY_WITH_PATCHES)); - await self.minimize('total_packages', _.keys(analysis.reachablePackages)); + await self.minimize('total_packages', Object.keys(analysis.reachablePackages)); // throw errors about unknown packages if (self.stepsByName['unknown_packages'].optimum > 0) { await Profile.time("generate error for unknown packages", function () { - var unknownPackages = _.keys(analysis.unknownPackages); - var unknownPackagesNeeded = _.filter(unknownPackages, function (p) { + var unknownPackages = Object.keys(analysis.unknownPackages); + var unknownPackagesNeeded = unknownPackages.filter(function (p) { return self.solution.evaluate(p); }); - _.each(unknownPackagesNeeded, function (p) { - var requirers = _.filter(analysis.unknownPackages[p], function (pv) { + unknownPackagesNeeded.forEach(function (p) { + var requirers = analysis.unknownPackages[p].filter(function (pv) { return self.solution.evaluate(pv); }); var errorStr; @@ -925,7 +938,7 @@ CS.Solver.prototype._getAnswer = async function (options) { } else { errorStr = 'unknown package: ' + p; } - _.each(requirers, function (pv) { + requirers.forEach(function (pv) { errorStr += '\nRequired by: ' + pv; }); self.errors.push(errorStr); @@ -939,36 +952,36 @@ CS.Solver.prototype._getAnswer = async function (options) { await self.throwConflicts(); } - if ((! input.allowIncompatibleUpdate) && - self.stepsByName['previous_root_incompat'].optimum > 0) { + if ((!input.allowIncompatibleUpdate) && + self.stepsByName['previous_root_incompat'].optimum > 0) { // we have some "incompatible root changes", where we needed to change a // version of a root dependency to a new version incompatible with the // original, but --allow-incompatible-update hasn't been passed in. // these are in the form of PackageAndVersion strings that we need. - var incompatRootChanges = _.keys(self.getStepContributions( + var incompatRootChanges = Object.keys(self.getStepContributions( self.stepsByName['previous_root_incompat'])); await Profile.time("generate errors for incompatible root change", function () { var numActualErrors = 0; - _.each(incompatRootChanges, function (pvStr) { + incompatRootChanges.forEach(function (pvStr) { var pv = CS.PackageAndVersion.fromString(pvStr); // exclude packages with top-level equality constraints (added by user // or by the tool pinning a version) - if (! _.has(analysis.topLevelEqualityConstrainedPackages, pv.package)) { + if (!has(analysis.topLevelEqualityConstrainedPackages, pv.package)) { var prevVersion = input.previousSolution[pv.package]; self.errors.push( 'Potentially incompatible change required to ' + - 'top-level dependency: ' + - pvStr + ', was ' + prevVersion + '.\n' + - self.listConstraintsOnPackage(pv.package)); + 'top-level dependency: ' + + pvStr + ', was ' + prevVersion + '.\n' + + self.listConstraintsOnPackage(pv.package)); numActualErrors++; } }); if (numActualErrors) { self.errors.push( 'To allow potentially incompatible changes to top-level ' + - 'dependencies, you must pass --allow-incompatible-update ' + - 'on the command line.'); + 'dependencies, you must pass --allow-incompatible-update ' + + 'on the command line.'); } }); self.throwAnyErrors(); @@ -1006,13 +1019,13 @@ CS.Solver.prototype._getAnswer = async function (options) { // Get a list of package-version variables that satisfy a given constraint. var getOkVersions = function (toPackage, vConstraint, targetVersions) { - return _.compact(_.map(targetVersions, function (v) { + return (targetVersions.map(function (v) { if (CS.isConstraintSatisfied(toPackage, vConstraint, v)) { return pvVar(toPackage, v); } else { return null; } - })); + })).filter(Boolean); }; // The CS.Solver constructor turns this into a memoized method. @@ -1036,7 +1049,7 @@ CS.Solver.prototype.listConstraintsOnPackage = function (pkg) { var result = 'Constraints on package "' + pkg + '":'; - _.each(constraints, function (c) { + constraints.forEach(function (c) { if (c.toPackage === pkg) { var paths; if (c.fromVar) { @@ -1045,7 +1058,7 @@ CS.Solver.prototype.listConstraintsOnPackage = function (pkg) { } else { paths = [['top level']]; } - _.each(paths, function (path) { + paths.forEach(function (path) { result += '\n* ' + (new PV.PackageConstraint( pkg, c.vConstraint.raw)) + ' <- ' + path.join(' <- '); }); @@ -1062,15 +1075,15 @@ CS.Solver.prototype.throwConflicts = async function () { var constraints = self.analysis.constraints; await self.Profile.time("generate error about conflicts", function () { - _.each(constraints, function (c) { + constraints.forEach(function (c) { // c is a CS.Solver.Constraint if (solution.evaluate(c.conflictVar)) { // skipped this constraint var possibleVersions = self.getVersions(c.toPackage); - var chosenVersion = _.find(possibleVersions, function (v) { + var chosenVersion = possibleVersions.find(function (v) { return solution.evaluate(pvVar(c.toPackage, v)); }); - if (! chosenVersion) { + if (!chosenVersion) { // this can't happen, because for a constraint to be a problem, // we must have chosen some version of the package it applies to! throw new Error("Internal error: Version not found"); @@ -1078,7 +1091,7 @@ CS.Solver.prototype.throwConflicts = async function () { var error = ( 'Conflict: Constraint ' + (new PV.PackageConstraint( c.toPackage, c.vConstraint)) + - ' is not satisfied by ' + c.toPackage + ' ' + chosenVersion + '.'); + ' is not satisfied by ' + c.toPackage + ' ' + chosenVersion + '.'); error += '\n' + self.listConstraintsOnPackage(c.toPackage); @@ -1117,12 +1130,12 @@ CS.Solver.prototype.getPathsToPackageVersion = function (packageAndVersion) { var versionMap = self.currentVersionMap(); var hasDep = function (p1, p2) { // Include weak dependencies, because their constraints matter. - return _.has(cache.getDependencyMap(p1, versionMap[p1]), p2); + return has(cache.getDependencyMap(p1, versionMap[p1]), p2); }; - var allPackages = _.keys(versionMap); + var allPackages = Object.keys(versionMap); var getPaths = function (pv, _ignorePackageSet) { - if (! solution.evaluate(pv.toString())) { + if (!solution.evaluate(pv.toString())) { return []; } var pkg = pv.package; @@ -1131,20 +1144,20 @@ CS.Solver.prototype.getPathsToPackageVersion = function (packageAndVersion) { return [[pv]]; } - var newIgnorePackageSet = _.clone(_ignorePackageSet); + var newIgnorePackageSet = Object.assign({}, _ignorePackageSet); newIgnorePackageSet[pkg] = true; var paths = []; var shortestLength = null; - _.each(allPackages, function (p) { - if ((! _.has(newIgnorePackageSet, p)) && - solution.evaluate(p) && - hasDep(p, pkg)) { + allPackages.forEach(function (p) { + if ((!has(newIgnorePackageSet, p)) && + solution.evaluate(p) && + hasDep(p, pkg)) { var newPV = new CS.PackageAndVersion(p, versionMap[p]); - _.each(getPaths(newPV, newIgnorePackageSet), function (path) { + getPaths(newPV, newIgnorePackageSet).forEach(function (path) { var newPath = [pv].concat(path); - if ((! paths.length) || newPath.length < shortestLength) { + if ((!paths.length) || newPath.length < shortestLength) { paths.push(newPath); shortestLength = newPath.length; } diff --git a/packages/constraint-solver/version-pricer-tests.js b/packages/constraint-solver/version-pricer-tests.js index e6a2429882b..49bf9b5cc1c 100644 --- a/packages/constraint-solver/version-pricer-tests.js +++ b/packages/constraint-solver/version-pricer-tests.js @@ -1,3 +1,6 @@ +const zip = Npm.require('lodash.zip'); +const isObject = Npm.require('lodash.isobject'); + var CS = ConstraintSolver; var PV = PackageVersion; @@ -7,24 +10,26 @@ Tinytest.add("constraint solver - version pricer", function (test) { var pricer = new CS.VersionPricer(); var testScanVersions = function (versions, mode, options, expected) { - if (options && _.isArray(options)) { + if (options && Array.isArray(options)) { expected = options; options = null; } var result, tuples; // Accepts either a mode like CS.VersionPricer.MODE_UPDATE or // an object that looks like `{ previous: version }` - if (_.isObject(mode) && mode.previous) { + if (isObject(mode) && mode.previous) { result = pricer.priceVersionsWithPrevious(versions, mode.previous); - tuples = _.zip(versions, result[0], result[1], result[2], result[3], + tuples = zip(versions, result[0], result[1], result[2], result[3], result[4]); } else { result = pricer.priceVersions(versions, mode, options); - tuples = _.zip(versions, result[0], result[1], result[2], result[3]); + tuples = zip(versions, result[0], result[1], result[2], result[3]); } test.equal(tuples.length, expected.length); - test.equal(_.pluck(tuples, 0), versions); - _.each(_.zip(tuples, expected), function (x) { + test.equal(tuples.map(function(x){ + return x[0] + }), versions); + zip(tuples, expected).forEach(function (x) { var tuple = x[0]; var expectedTuple = x[1]; if (typeof expectedTuple[0] !== 'string') { @@ -200,4 +205,4 @@ Tinytest.add("constraint solver - version pricer", function (test) { ["4.0.0", 1, 3, 0, 0, 1], ["4.0.0_1", 1, 3, 0, 0, 0]]); -}); +}); \ No newline at end of file diff --git a/packages/constraint-solver/version-pricer.js b/packages/constraint-solver/version-pricer.js index 7b94d868e8e..90b3e24170d 100644 --- a/packages/constraint-solver/version-pricer.js +++ b/packages/constraint-solver/version-pricer.js @@ -1,3 +1,5 @@ +const memoize = require('lodash.memoize'); + var CS = ConstraintSolver; var PV = PackageVersion; @@ -9,7 +11,7 @@ CS.VersionPricer = function () { // // The VersionPricer instance stores a memoization table for // efficiency. - self.getVersionInfo = _.memoize(PV.parse); + self.getVersionInfo = memoize(PV.parse); }; CS.VersionPricer.MODE_UPDATE = 1; diff --git a/packages/core-runtime/load-js-image.js b/packages/core-runtime/load-js-image.js index 667ea74b8c5..029c9f2edb1 100644 --- a/packages/core-runtime/load-js-image.js +++ b/packages/core-runtime/load-js-image.js @@ -5,55 +5,39 @@ // Ensures packages and eager requires run in the correct order // when there is code that uses top level await -var pending = Object.create(null); var hasOwn = Object.prototype.hasOwnProperty; -function queue(name, deps, runImage) { - pending[name] = []; - - var pendingDepsCount = 0; - - function onDepLoaded() { - pendingDepsCount -= 1; +var pending = []; +function queue(name, runImage) { + pending.push({name: name, runImage: runImage}); + processNext(); +} - if (pendingDepsCount === 0) { - load(name, runImage); - } +var isProcessing = false; +function processNext() { + if (isProcessing) { + return; } - deps.forEach(function (dep) { - if (hasOwn.call(pending, dep)) { - pendingDepsCount += 1; - pending[dep].push(onDepLoaded); - } else { - // load must always be called for a package's dependencies first. - // If the package is not pending, then it must have already loaded - // or is a weak dependency, and the dependency is not being used. - } - }); - - if (pendingDepsCount === 0) { - load(name, runImage); + var next = pending.shift(); + if (!next) { + return; } -} -function load(name, runImage) { - var config = runImage(); + isProcessing = true; + var config = next.runImage.call(this); runEagerModules(config, function (mainModuleExports) { // Get the exports after the eager code has been run var exports = config.export ? config.export() : {}; if (config.mainModulePath) { - Package._define(name, mainModuleExports, exports); + Package._define(next.name, mainModuleExports, exports); } else { - Package._define(name, exports); + Package._define(next.name, exports); } - var pendingCallbacks = pending[name] || []; - delete pending[name]; - pendingCallbacks.forEach(function (callback) { - callback(); - }); + isProcessing = false; + processNext(); }); } @@ -96,7 +80,7 @@ function runEagerModules(config, callback) { evaluateNextModule(); }) // This also handles errors in modules and packages loaded sync - // afterwards since they are run within the .then. + // afterwards since they are run within the `.then`. .catch(function (error) { if ( typeof process === 'object' && @@ -138,9 +122,7 @@ function checkAsyncModule (exports) { // For this to be accurate, all linked files must be queued before calling this // If all are loaded, returns null. Otherwise, returns a promise function waitUntilAllLoaded() { - var pendingNames = Object.keys(pending); - - if (pendingNames.length === 0) { + if (pending.length === 0 && !isProcessing) { // All packages are loaded // If there were no async packages, then there might not be a promise // polyfill loaded either, so we don't create a promise to return @@ -148,16 +130,11 @@ function waitUntilAllLoaded() { } return new Promise(function (resolve) { - var pendingCount = pendingNames.length; - pendingNames.forEach(function (name) { - pending[name].push(function () { - pendingCount -= 1; - if (pendingCount === 0) { - resolve(); - } - }); + queue(null, function () { + resolve(); + return {}; }); - }) + }); } // Since the package.js doesn't export load or waitUntilReady diff --git a/packages/core-runtime/package.js b/packages/core-runtime/package.js index 43a2efa8a60..5ab74d5def1 100644 --- a/packages/core-runtime/package.js +++ b/packages/core-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Core runtime to load packages and the app", - version: '1.0.0-alpha300.19', + version: '1.0.0-rc300.2', documentation: null }); diff --git a/packages/crosswalk/package.js b/packages/crosswalk/package.js index ffc0a15cf08..008bc5dd3eb 100644 --- a/packages/crosswalk/package.js +++ b/packages/crosswalk/package.js @@ -1,10 +1,10 @@ Package.describe({ summary: "Makes your Cordova application use the Crosswalk WebView \ instead of the System WebView on Android", - version: '1.7.2-alpha300.19', + version: '1.7.2-rc300.2', documentation: null }); Cordova.depends({ - 'cordova-plugin-crosswalk-webview': '2.3.0' + 'cordova-plugin-crosswalk-webview': '2.4.0' }); diff --git a/packages/ddp-client/client/client_convenience.js b/packages/ddp-client/client/client_convenience.js index 35bd3bb4808..78a1ff7473e 100644 --- a/packages/ddp-client/client/client_convenience.js +++ b/packages/ddp-client/client/client_convenience.js @@ -1,5 +1,6 @@ import { DDP } from '../common/namespace.js'; import { Meteor } from 'meteor/meteor'; +import { loadAsyncStubHelpers } from "./queueStubsHelpers"; // Meteor.refresh can be called on the client (if you're in common code) but it // only has an effect on the server. @@ -38,6 +39,9 @@ function onDDPVersionNegotiationFailure(description) { } } +// Makes sure to inject the stub async helpers before creating the connection +loadAsyncStubHelpers(); + Meteor.connection = DDP.connect(ddpUrl, { onDDPVersionNegotiationFailure: onDDPVersionNegotiationFailure }); diff --git a/packages/ddp-client/client/queueStubsHelpers.js b/packages/ddp-client/client/queueStubsHelpers.js new file mode 100644 index 00000000000..bedbaa082fc --- /dev/null +++ b/packages/ddp-client/client/queueStubsHelpers.js @@ -0,0 +1,241 @@ +import { DDP } from "../common/namespace.js"; +import { isEmpty, last } from "meteor/ddp-common/utils.js"; +import { Connection } from "../common/livedata_connection"; + +// https://forums.meteor.com/t/proposal-to-fix-issues-with-async-method-stubs/60826 + +let queueSize = 0; +let queue = Promise.resolve(); + +export const loadAsyncStubHelpers = () => { + function queueFunction(fn, promiseProps = {}) { + queueSize += 1; + + let resolve; + let reject; + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve; + reject = _reject; + }); + + queue = queue.finally(() => { + fn(resolve, reject); + + return promise.stubPromise?.catch(() => {}); // silent uncaught promise + }); + + promise + .catch(() => {}) // silent uncaught promise + .finally(() => { + queueSize -= 1; + if (queueSize === 0) { + Meteor.connection._maybeMigrate(); + } + }); + + promise.stubPromise = promiseProps.stubPromise; + promise.serverPromise = promiseProps.serverPromise; + + return promise; + } + + let oldReadyToMigrate = Connection.prototype._readyToMigrate; + Connection.prototype._readyToMigrate = function () { + if (queueSize > 0) { + return false; + } + + return oldReadyToMigrate.apply(this, arguments); + }; + + let currentMethodInvocation = null; + + /** + * Meteor sets CurrentMethodInvocation to undefined for the reasons explained at + * https://github.com/meteor/meteor/blob/c9e3551b9673a7ed607f18cb1128563ff49ca96f/packages/ddp-client/common/livedata_connection.js#L578-L605 + * The app code could call `.then` on a promise while the async stub is running, + * causing the `then` callback to think it is inside the stub. + * + * With the queueing we are doing, this is no longer necessary. The point + * of the queueing is to prevent app/package code from running while + * the stub is running, so we don't need to worry about this. + */ + + let oldApplyAsync = Connection.prototype.applyAsync; + Connection.prototype.applyAsync = function () { + let args = arguments; + let name = args[0]; + + if (currentMethodInvocation) { + DDP._CurrentMethodInvocation._set(currentMethodInvocation); + currentMethodInvocation = null; + } + + const enclosing = DDP._CurrentMethodInvocation.get(); + const alreadyInSimulation = enclosing?.isSimulation; + const isFromCallAsync = enclosing?._isFromCallAsync; + + if ( + Meteor.connection._getIsSimulation({ + isFromCallAsync, + alreadyInSimulation, + }) + ) { + // In stub - call immediately + return oldApplyAsync.apply(this, args); + } + + let stubPromiseResolver; + let serverPromiseResolver; + const stubPromise = new Promise((r) => (stubPromiseResolver = r)); + const serverPromise = new Promise((r) => (serverPromiseResolver = r)); + + return queueFunction( + (resolve, reject) => { + let hasStub = false; + let finished = false; + + Meteor._setImmediate(() => { + const applyAsyncPromise = oldApplyAsync.apply(this, args); + stubPromiseResolver(applyAsyncPromise.stubPromise); + serverPromiseResolver(applyAsyncPromise.serverPromise); + hasStub = !!applyAsyncPromise.stubPromise; + if (hasStub) { + applyAsyncPromise.stubPromise + .catch(() => {}) // silent uncaught promise + .finally(() => { + finished = true; + }); + } + + applyAsyncPromise + .then((result) => { + resolve(result); + }) + .catch((err) => { + reject(err); + }); + serverPromise.catch(() => {}); // silent uncaught promise + }); + + Meteor._setImmediate(() => { + if (hasStub && !finished) { + console.warn( + `Method stub (${name}) took too long and could cause unexpected problems. Learn more at https://github.com/zodern/fix-async-stubs/#limitations` + ); + } + }); + }, + { + stubPromise, + serverPromise, + } + ); + }; + + let oldApply = Connection.prototype.apply; + Connection.prototype.apply = function () { + // [name, args, options] + let options = arguments[2] || {}; + let wait = options.wait; + + // Apply runs the stub before synchronously returning. + // + // However, we want the server to run the methods in the original call order + // so we have to queue sending the message to the server until any previous async + // methods run. + // This does mean the stubs run in a different order than the methods on the + // server. + + let oldOutstandingMethodBlocks = Meteor.connection._outstandingMethodBlocks; + // Meteor only sends the method if _outstandingMethodBlocks.length is 1. + // Add a wait block to force Meteor to put the new method in a second block. + let outstandingMethodBlocks = [{ wait: true, methods: [] }]; + Meteor.connection._outstandingMethodBlocks = outstandingMethodBlocks; + + let result; + try { + result = oldApply.apply(this, arguments); + } finally { + Meteor.connection._outstandingMethodBlocks = oldOutstandingMethodBlocks; + } + + if (outstandingMethodBlocks[1]) { + let methodInvoker = outstandingMethodBlocks[1].methods[0]; + + if (methodInvoker) { + queueMethodInvoker(methodInvoker, wait); + } + } + + return result; + }; + + function queueMethodInvoker(methodInvoker, wait) { + queueFunction((resolve) => { + let self = Meteor.connection; + // based on https://github.com/meteor/meteor/blob/e0631738f2a8a914d8a50b1060e8f40cb0873680/packages/ddp-client/common/livedata_connection.js#L833-L853C1 + if (wait) { + // It's a wait method! Wait methods go in their own block. + self._outstandingMethodBlocks.push({ + wait: true, + methods: [methodInvoker], + }); + } else { + // Not a wait method. Start a new block if the previous block was a wait + // block, and add it to the last block of methods. + if ( + isEmpty(self._outstandingMethodBlocks) || + last(self._outstandingMethodBlocks).wait + ) { + self._outstandingMethodBlocks.push({ + wait: false, + methods: [], + }); + } + + last(self._outstandingMethodBlocks).methods.push(methodInvoker); + } + + // If we added it to the first block, send it out now. + if (self._outstandingMethodBlocks.length === 1) + methodInvoker.sendMessage(); + + resolve(); + }); + } + + /** + * Queue subscriptions in case they rely on previous method calls + */ + let queueSend = false; + let oldSubscribe = Connection.prototype.subscribe; + Connection.prototype.subscribe = function () { + if (this._stream._neverQueued) { + return oldSubscribe.apply(this, arguments); + } + + queueSend = true; + try { + return oldSubscribe.apply(this, arguments); + } finally { + queueSend = false; + } + }; + + let oldSend = Connection.prototype._send; + Connection.prototype._send = function () { + if (!queueSend) { + return oldSend.apply(this, arguments); + } + + queueSend = false; + queueFunction((resolve) => { + try { + oldSend.apply(this, arguments); + } finally { + resolve(); + } + }); + }; +}; diff --git a/packages/ddp-client/common/livedata_connection.js b/packages/ddp-client/common/livedata_connection.js index 19e2f2680b0..c027f70dbe0 100644 --- a/packages/ddp-client/common/livedata_connection.js +++ b/packages/ddp-client/common/livedata_connection.js @@ -416,7 +416,7 @@ export class Connection { // onReady callback provided, if any.) // If the sub is already ready, run the ready callback right away. // It seems that users would expect an onReady callback inside an - // autorun to trigger once the the sub first becomes ready and also + // autorun to trigger once the sub first becomes ready and also // when re-subs happens. if (existing.ready) { callbacks.onReady(); @@ -571,7 +571,7 @@ export class Connection { * @param {EJSONable} [arg1,arg2...] Optional method arguments * @returns {Promise} */ - async callAsync(name /* .. [arguments] .. */) { + callAsync(name /* .. [arguments] .. */) { const args = slice.call(arguments, 1); if (args.length && typeof args[args.length - 1] === 'function') { throw new Error( @@ -579,66 +579,7 @@ export class Connection { ); } - const applyOptions = ['returnStubValue', 'returnServerResultPromise', 'returnServerPromise']; - const defaultOptions = { - returnServerResultPromise: true, - }; - const options = { - ...defaultOptions, - ...(applyOptions.some(o => args[0]?.hasOwnProperty(o)) - ? args.shift() - : {}), - }; - - const invocation = DDP._CurrentCallAsyncInvocation.get(); - - if (invocation?.hasCallAsyncParent) { - return this.applyAsync(name, args, { ...options, isFromCallAsync: true }); - } - - /* - * This is necessary because when you call a Promise.then, you're actually calling a bound function by Meteor. - * - * This is done by this code https://github.com/meteor/meteor/blob/17673c66878d3f7b1d564a4215eb0633fa679017/npm-packages/meteor-promise/promise_client.js#L1-L16. (All the logic below can be removed in the future, when we stop overwriting the - * Promise.) - * - * When you call a ".then()", like "Meteor.callAsync().then()", the global context (inside currentValues) - * will be from the call of Meteor.callAsync(), and not the context after the promise is done. - * - * This means that without this code if you call a stub inside the ".then()", this stub will act as a simulation - * and won't reach the server. - * - * Inside the function _getIsSimulation(), if isFromCallAsync is false, we continue to consider just the - * alreadyInSimulation, otherwise, isFromCallAsync is true, we also check the value of callAsyncMethodRunning (by - * calling DDP._CurrentMethodInvocation._isCallAsyncMethodRunning()). - * - * With this, if a stub is running inside a ".then()", it'll know it's not a simulation, because callAsyncMethodRunning - * will be false. - * - * DDP._CurrentMethodInvocation._set() is important because without it, if you have a code like: - * - * Meteor.callAsync("m1").then(() => { - * Meteor.callAsync("m2") - * }) - * - * The call the method m2 will act as a simulation and won't reach the server. That's why we reset the context here - * before calling everything else. - * - * */ - DDP._CurrentMethodInvocation._set(); - DDP._CurrentMethodInvocation._setCallAsyncMethodRunning(true); - const promise = new Promise((resolve, reject) => { - DDP._CurrentCallAsyncInvocation._set({ name, hasCallAsyncParent: true }); - this.applyAsync(name, args, { isFromCallAsync: true, ...options }) - .then(resolve) - .catch(reject) - .finally(() => { - DDP._CurrentCallAsyncInvocation._set(); - }); - }); - return promise.finally(() => - DDP._CurrentMethodInvocation._setCallAsyncMethodRunning(false) - ); + return this.applyAsync(name, args, { returnServerResultPromise: true }); } /** @@ -694,7 +635,32 @@ export class Connection { * @param {Boolean} options.throwStubExceptions (Client only) If true, exceptions thrown by method stubs will be thrown instead of logged, and the method will not be invoked on the server. * @param {Boolean} options.returnStubValue (Client only) If true then in cases where we would have otherwise discarded the stub's return value and returned undefined, instead we go ahead and return it. Specifically, this is any time other than when (a) we are already inside a stub or (b) we are in Node and no callback was provided. Currently we require this flag to be explicitly passed to reduce the likelihood that stub return values will be confused with server return values; we may improve this in future. */ - async applyAsync(name, args, options, callback = null) { + applyAsync(name, args, options, callback = null) { + const stubPromise = this._applyAsyncStubInvocation(name, args, options); + + const promise = this._applyAsync({ + name, + args, + options, + callback, + stubPromise, + }); + if (Meteor.isClient) { + // only return the stubReturnValue + promise.stubPromise = stubPromise.then(o => { + if (o.exception) { + throw o.exception; + } + return o.stubReturnValue; + }); + // this avoids attribute recursion + promise.serverPromise = new Promise((resolve, reject) => + promise.then(resolve).catch(reject), + ); + } + return promise; + } + async _applyAsyncStubInvocation(name, args, options) { const { stubInvocation, invocation, ...stubOptions } = this._stubCall(name, EJSON.clone(args), options); if (stubOptions.hasStub) { if ( @@ -728,6 +694,10 @@ export class Connection { stubOptions.exception = e; } } + return stubOptions; + } + async _applyAsync({ name, args, options, callback, stubPromise }) { + const stubOptions = await stubPromise; return this._apply(name, stubOptions, args, options, callback); } @@ -890,14 +860,14 @@ export class Connection { // If we're using the default callback on the server, // block waiting for the result. if (future) { - if (options.returnServerPromise) { - return future; + // This is the result of the method ran in the client. + // You can opt-in in getting the local result by running: + // const { stubPromise, serverPromise } = Meteor.callAsync(...); + // const whatServerDid = await serverPromise; + if (options.returnStubValue) { + return future.then(() => stubReturnValue); } - return options.returnStubValue - ? future.then(() => stubReturnValue) - : { - stubValuePromise: future, - }; + return future; } return options.returnStubValue ? stubReturnValue : undefined; } @@ -954,6 +924,7 @@ export class Connection { }; const invocation = new DDPCommon.MethodInvocation({ + name, isSimulation: true, userId: self.userId(), isFromCallAsync: options?.isFromCallAsync, diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js index 2a489abadd2..0b9ef737d26 100644 --- a/packages/ddp-client/package.js +++ b/packages/ddp-client/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data client", - version: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', documentation: null }); @@ -60,4 +60,7 @@ Package.onTest((api) => { api.addFiles('test/livedata_tests.js'); api.addFiles('test/livedata_test_service.js'); api.addFiles('test/random_stream_tests.js'); + api.addFiles('test/async_stubs/client.js', 'client'); + api.addFiles('test/async_stubs/server_setup.js', 'server'); + api.addFiles('test/livedata_callAsync_tests.js'); }); diff --git a/packages/ddp-client/test/async_stubs/client.js b/packages/ddp-client/test/async_stubs/client.js new file mode 100644 index 00000000000..60347931db8 --- /dev/null +++ b/packages/ddp-client/test/async_stubs/client.js @@ -0,0 +1,341 @@ +let events = []; +Meteor.methods({ + "sync-stub"() { + events.push("sync-stub"); + return "sync-stub-result"; + }, + async "async-stub"() { + events.push("start async-stub"); + await 0; + events.push("end async-stub"); + return "async-stub-result"; + }, + callAsyncFromSyncStub() { + events.push("callAsyncFromSyncStub"); + Meteor.callAsync("async-stub"); + }, + async callSyncStubFromAsyncStub() { + events.push("start callSyncStubFromAsyncStub"); + await 0; + let result = Meteor.call("sync-stub"); + events.push("end callSyncStubFromAsyncStub"); + return result; + }, + callSyncStubFromSyncStub() { + events.push("callSyncStubFromSyncStub"); + return Meteor.call("sync-stub"); + }, + callAsyncStubFromAsyncStub() { + events.push("callAsyncStubFromAsyncStub"); + return Meteor.callAsync("async-stub"); + }, +}); + +Tinytest.addAsync("applyAsync - server only", async function (test) { + let serverResolver; + let serverPromise = new Promise((resolve) => { + serverResolver = resolve; + }); + + let stubResult = await Meteor.applyAsync( + "server-only-sync", + [], + { returnStubValue: true }, + (err, result) => { + console.log(err); + if (!err) { + serverResolver(result); + } + } + ); + + let serverResult = await serverPromise; + + test.equal(stubResult, undefined); + test.equal(serverResult, "sync-result"); +}); + +Tinytest.addAsync("applyAsync - sync stub", async function (test) { + let serverResolver; + let serverPromise = new Promise((resolve) => { + serverResolver = resolve; + }); + + let stubResult = await Meteor.applyAsync( + "sync-stub", + [], + { + returnStubValue: true, + }, + (err, result) => { + console.log(err); + if (!err) { + serverResolver(result); + } + } + ); + + let serverResult = await serverPromise; + + test.equal(stubResult, "sync-stub-result"); + test.equal(serverResult, "sync-server-result"); +}); + +Tinytest.addAsync("applyAsync - callAsync", async function (test) { + let serverResult = await Meteor.callAsync("async-stub"); + + test.equal(serverResult, "async-server-result"); +}); + +Tinytest.addAsync("applyAsync - callAsync twice", async function (test) { + events = []; + let promise1 = Meteor.callAsync("async-stub"); + let promise2 = Meteor.callAsync("async-stub"); + + console.log("PROMISESS", promise1, promise2); + let results = await Promise.all([promise1, promise2]); + + test.equal(events, [ + "start async-stub", + "end async-stub", + "start async-stub", + "end async-stub", + ]); + test.equal(results, ["async-server-result", "async-server-result"]); +}); + +// Broken in Meteor 2.13: https://github.com/meteor/meteor/issues/12889#issue-1998128607 +Tinytest.addAsync( + "applyAsync - callAsync from async stub", + async function (test) { + await Meteor.callAsync("getAndResetEvents"); + events = []; + let serverResolver; + let serverPromise = new Promise((resolve) => { + serverResolver = resolve; + }); + let stubResult = await Meteor.applyAsync( + "callAsyncStubFromAsyncStub", + [], + { returnStubValue: true }, + (err, result) => { + if (!err) { + serverResolver(result); + } + } + ); + let serverResult = await serverPromise; + + let serverEvents = await Meteor.callAsync("getAndResetEvents"); + + test.equal(stubResult, "async-stub-result"); + test.equal(serverResult, "server result"); + test.equal(events, [ + "callAsyncStubFromAsyncStub", + "start async-stub", + "end async-stub", + ]); + test.equal(serverEvents, ["callAsyncStubFromAsyncStub"]); + } +); + +Tinytest.addAsync("applyAsync - callAsync in then", async function (test) { + await Meteor.callAsync("getAndResetEvents"); + + events = []; + let result = await Meteor.callAsync("async-stub").then(() => + Meteor.callAsync("async-stub") + ); + let serverEvents = await Meteor.callAsync("getAndResetEvents"); + + test.equal(events, [ + "start async-stub", + "end async-stub", + "start async-stub", + "end async-stub", + ]); + test.equal(serverEvents, ["async-stub", "async-stub"]); + test.equal(result, "async-server-result"); +}); + +Tinytest.addAsync("applyAsync - call from async stub", async function (test) { + await Meteor.callAsync("getAndResetEvents"); + events = []; + let serverResolver; + let serverPromise = new Promise((resolve) => { + serverResolver = resolve; + }); + let stubResult = await Meteor.applyAsync( + "callSyncStubFromAsyncStub", + [], + { returnStubValue: true }, + (err, result) => { + if (!err) { + serverResolver(result); + } + } + ); + let serverResult = await serverPromise; + + let serverEvents = await Meteor.callAsync("getAndResetEvents"); + + test.equal(stubResult, "sync-stub-result"); + test.equal(serverResult, "server result"); + test.equal(events, [ + "start callSyncStubFromAsyncStub", + "sync-stub", + "end callSyncStubFromAsyncStub", + ]); + test.equal(serverEvents, ["callSyncStubFromAsyncStub"]); +}); + +Tinytest.addAsync("apply - call from sync stub", async function (test) { + await Meteor.callAsync("getAndResetEvents"); + events = []; + let serverResolver; + let serverPromise = new Promise((resolve) => { + serverResolver = resolve; + }); + let stubResult = Meteor.apply( + "callSyncStubFromSyncStub", + [], + { returnStubValue: true }, + (err, result) => { + if (!err) { + serverResolver(result); + } + } + ); + let serverResult = await serverPromise; + + let serverEvents = await Meteor.callAsync("getAndResetEvents"); + + test.equal(stubResult, "sync-stub-result"); + test.equal(serverResult, "server result"); + test.equal(events, ["callSyncStubFromSyncStub", "sync-stub"]); + test.equal(serverEvents, ["callSyncStubFromSyncStub"]); +}); + +Tinytest.addAsync( + "apply - proper order with applyAsync", + async function (test) { + await Meteor.callAsync("getAndResetEvents"); + events = []; + let serverResolver; + let serverPromise = new Promise((resolve) => { + serverResolver = resolve; + }); + + let promise1 = Meteor.callAsync("callSyncStubFromAsyncStub"); + let stubResult = Meteor.apply( + "callSyncStubFromSyncStub", + [], + { returnStubValue: true }, + (err, result) => { + if (!err) { + serverResolver(result); + } + } + ); + let promise2 = Meteor.callAsync("server-only-sync"); + let [serverResult, result1, result2] = await Promise.all([ + serverPromise, + promise1, + promise2, + ]); + + let serverEvents = await Meteor.callAsync("getAndResetEvents"); + + test.equal(stubResult, "sync-stub-result"); + test.equal(serverResult, "server result"); + test.equal(result1, "server result"); + test.equal(result2, "sync-result"); + test.equal(events, [ + "callSyncStubFromSyncStub", + "sync-stub", + "start callSyncStubFromAsyncStub", + "sync-stub", + "end callSyncStubFromAsyncStub", + ]); + test.equal(serverEvents, [ + "callSyncStubFromAsyncStub", + "callSyncStubFromSyncStub", + "server-only-sync", + ]); + } +); + +Tinytest.addAsync("apply - wait", async function (test) { + await Meteor.callAsync("getAndResetEvents"); + events = []; + let serverResolver; + let serverPromise = new Promise((resolve) => { + serverResolver = resolve; + }); + + let stubResult = Meteor.apply( + "callSyncStubFromSyncStub", + [], + { returnStubValue: true, wait: true }, + (err, result) => { + if (!err) { + serverResolver(result); + } + } + ); + + const serverResult = await serverPromise; + + test.equal(stubResult, "sync-stub-result"); + test.equal(serverResult, "server result"); +}); + +Tinytest.addAsync( + "apply - preserve order with subscriptions", + async function (test) { + await Meteor.callAsync("getAndResetEvents"); + let serverResolver; + let serverPromise = new Promise((resolve) => { + serverResolver = resolve; + }); + let subResolver; + let subPromise = new Promise((resolve) => { + subResolver = resolve; + }); + + Meteor.call("server-only-sync", (err, result) => { + if (!err) { + serverResolver(result); + } + }); + + let handle = Meteor.subscribe("simple-publication", () => subResolver()); + + await serverPromise; + await subPromise; + handle.stop(); + + let serverEvents = await Meteor.callAsync("getAndResetEvents"); + + test.equal(serverEvents, ["server-only-sync", "publication"]); + } +); + +Tinytest.addAsync( + "method interaction with unblocking mechanism", + async function (test) { + await Meteor.callAsync("getAndResetEvents"); + + await Promise.all([ + Meteor.callAsync("unblockedMethod", { delay: 200 }), // unblock + sleep for 200 milliseconds + Meteor.callAsync("blockingMethod"), // run straight + block + ]); + + let serverEvents = await Meteor.callAsync("getAndResetEvents"); + test.equal( + serverEvents, + ["unblock start", "blockingMethod", "unblock end"], + "should have properly executed the unblocking mechanism" + ); + } +); diff --git a/packages/ddp-client/test/async_stubs/server_setup.js b/packages/ddp-client/test/async_stubs/server_setup.js new file mode 100644 index 00000000000..47a4f721f55 --- /dev/null +++ b/packages/ddp-client/test/async_stubs/server_setup.js @@ -0,0 +1,58 @@ +let events = []; + +Meteor.methods({ + getAndResetEvents() { + let oldEvents = events; + events = []; + + return oldEvents; + }, + 'server-only-sync' () { + events.push('server-only-sync'); + return 'sync-result'; + }, + async 'server-only-async' () { + events.push('server-only-async'); + await 0 + return 'server-only-async-result'; + }, + 'sync-stub' () { + events.push('sync-stub'); + return 'sync-server-result' + }, + 'async-stub' () { + events.push('async-stub'); + return 'async-server-result' + }, + 'callAsyncFromSyncStub'() { + events.push('callAsyncFromSyncStub'); + }, + 'callSyncStubFromAsyncStub'() { + events.push('callSyncStubFromAsyncStub'); + + return 'server result'; + }, + 'callSyncStubFromSyncStub'() { + events.push('callSyncStubFromSyncStub'); + return 'server result'; + }, + 'callAsyncStubFromAsyncStub'() { + events.push('callAsyncStubFromAsyncStub'); + + return 'server result'; + }, + async 'unblockedMethod'({ delay }) { + events.push('unblock start'); + this.unblock(); + await Meteor._sleepForMs(delay); + events.push('unblock end'); + }, + 'blockingMethod'() { + events.push('blockingMethod'); + }, +}); + +Meteor.publish("simple-publication", function () { + events.push("publication"); + this.ready(); +}); diff --git a/packages/ddp-client/test/livedata_callAsync_tests.js b/packages/ddp-client/test/livedata_callAsync_tests.js new file mode 100644 index 00000000000..8025c1fc09f --- /dev/null +++ b/packages/ddp-client/test/livedata_callAsync_tests.js @@ -0,0 +1,24 @@ +if (Meteor.isServer) { + Meteor.methods({ + "server-only"() { + return "result"; + }, + }); +} + +Meteor.methods({ + "client-only"() { + return "result"; + }, +}); + +Tinytest.addAsync( + "livedata stub - callAsync works like in 2.x", + async function (t) { + let result = await Meteor.callAsync("server-only"); + t.equal(result, "result"); + + result = await Meteor.callAsync("client-only"); + t.equal(result, "result"); + } +); diff --git a/packages/ddp-client/test/livedata_connection_tests.js b/packages/ddp-client/test/livedata_connection_tests.js index 34fe0ccd8ec..1fc797c2517 100644 --- a/packages/ddp-client/test/livedata_connection_tests.js +++ b/packages/ddp-client/test/livedata_connection_tests.js @@ -500,7 +500,7 @@ if (Meteor.isClient) { // setup method conn.methods({ do_something: async function(x) { - return coll.insertAsync({ value: x }); + return coll.insertAsync({ value: x }).stubPromise; } }); @@ -686,7 +686,7 @@ if (Meteor.isClient) { await conn.applyAsync('do_something_else', []); }, do_something_else: async function() { - await coll.insertAsync({ a: 1 }); + await coll.insertAsync({ a: 1 }).stubPromise; } }); @@ -1037,7 +1037,7 @@ if (Meteor.isClient) { conn.methods({ writeSomething: async function() { // stub write - await coll.insertAsync({ foo: 'bar' }); + await coll.insertAsync({ foo: 'bar' }).stubPromise; } }); @@ -1374,10 +1374,10 @@ if (Meteor.isClient) { conn.methods({ insertSomething: async function() { // stub write - await coll.insertAsync({ foo: 'bar' }); + await coll.insertAsync({ foo: 'bar' }).stubPromise; }, updateIt: async function(id) { - await coll.updateAsync(id, { $set: { baz: 42 } }); + await coll.updateAsync(id, { $set: { baz: 42 } }).stubPromise; } }); @@ -1496,7 +1496,7 @@ if (Meteor.isClient) { conn.methods({ insertSomething: async function() { // stub write - await coll.insertAsync({ foo: 'bar' }); + await coll.insertAsync({ foo: 'bar' }).stubPromise; } }); @@ -2297,7 +2297,7 @@ if (Meteor.isClient) { test.length(stream.sent, 0); // Insert a document. The stub updates "conn" directly. - coll.insertAsync({ _id: 'foo', bar: 42 }); + await coll.insertAsync({ _id: 'foo', bar: 42 }).stubPromise; test.equal(await coll.find().countAsync(), 1); test.equal(await coll.findOneAsync(), { _id: 'foo', bar: 42 }); // It also sends the method message. @@ -2339,7 +2339,7 @@ if (Meteor.isClient) { conn.methods({ update_value: async function() { - await coll.updateAsync('aaa', { value: 222, tet: "dfsdfsdf" }); + await coll.updateAsync('aaa', { value: 222, tet: "dfsdfsdf" }).stubPromise; } }); @@ -2431,7 +2431,7 @@ if (Meteor.isClient) { update_value: async function() { const value = (await coll.findOneAsync('aaa')).subscription; // Method should have access to the latest value of the collection. - await coll.updateAsync('aaa', { $set: { method: value + 110 } }); + await coll.updateAsync('aaa', { $set: { method: value + 110 } }).stubPromise; } }); diff --git a/packages/ddp-client/test/livedata_tests.js b/packages/ddp-client/test/livedata_tests.js index 05637dd2082..20bfe2c30cf 100644 --- a/packages/ddp-client/test/livedata_tests.js +++ b/packages/ddp-client/test/livedata_tests.js @@ -379,46 +379,51 @@ const subscribeBeforeRun = async (subName, testId, cb) => { // would be nice to have a database-aware test harness of some kind -- // this is a big hack (and XXX pollutes the global test namespace) -testAsyncMulti('livedata - compound methods', [ - async function(test) { +testAsyncMulti("livedata - compound methods", [ + async function (test) { if (Meteor.isClient) { - Meteor.subscribe('ledger', test.runId(), () => {}); + Meteor.subscribe("ledger", test.runId(), () => {}); } - await Ledger.insertAsync( - { name: 'alice', balance: 100, world: test.runId() } - ); - await Ledger.insertAsync( - { name: 'bob', balance: 50, world: test.runId() } - ); + await Ledger.insertAsync({ + name: "alice", + balance: 100, + world: test.runId(), + }); + await Ledger.insertAsync({ name: "bob", balance: 50, world: test.runId() }); }, - async function(test) { - await Meteor.callAsync( - 'ledger/transfer', - test.runId(), - 'alice', - 'bob', - 10, - ) + async function (test) { + await Meteor.callAsync("ledger/transfer", test.runId(), "alice", "bob", 10); await checkBalances(test, 90, 60); }, - async function(test) { - try { - await Meteor.callAsync( - 'ledger/transfer', - test.runId(), - 'alice', - 'bob', - 100, - true, - ); - } catch (e) { - } - if (Meteor.isClient) + async function (test) { + let promise = Meteor.callAsync( + "ledger/transfer", + test.runId(), + "alice", + "bob", + 100, + true + ); + + if (Meteor.isClient) { // client can fool itself by cheating, but only until the sync // finishes + + // for some reason, this doesn't work without the sleep + // .stubPromise is undefined. + // promise does not have a stubPromise property. + await promise.stubPromise; await checkBalances(test, -10, 160); - else await checkBalances(test, 90, 60); + } + + await promise.catch((err) => { + failure(test, 409)(err); + }); + + + // Balances are reverted back to pre-stub values. + await checkBalances(test, 90, 60); }, ]); @@ -820,15 +825,9 @@ if (Meteor.isClient) { onError: function() { gotErrorFromStopper = true; }, + onStop: expect(function () {}), } ); - // Call a method. This method won't be processed until the publisher's - // function returns, so blocking on it being done ensures that we've - // gotten the removed/nosub/etc. - conn.call( - 'nothing', - expect(function() {}) - ); }, function(test, expect) { test.equal(coll.find().count(), 0); @@ -915,6 +914,7 @@ if (Meteor.isClient) { test.equal(errorFromRerun.reason, 'Explicit error'); test.equal(_.size(conn._subscriptions), 0); // white-box test + const expected = expect(); conn.subscribe( 'publisherErrors', collName, @@ -924,16 +924,10 @@ if (Meteor.isClient) { if (error) { gotErrorFromStopper = true; } + expected(); }, } ); - // Call a method. This method won't be processed until the publisher's - // function returns, so blocking on it being done ensures that we've - // gotten the removed/nosub/etc. - conn.call( - 'nothing', - expect(function() {}) - ); }, function(test, expect) { test.equal(coll.find().count(), 0); @@ -1045,7 +1039,7 @@ if (Meteor.isServer) { const self = this; if (self.conn.status().connected) { const callResult = await self.conn.callAsync('s2s', 'foo'); - test.equal(await callResult.stubValuePromise, 's2s foo'); + test.equal(callResult, 's2s foo'); } }, ]); @@ -1155,7 +1149,6 @@ testAsyncMulti('livedata - methods with nested stubs', [ const r = await self.coll.updateAsync( id, { $set: data }, - { returnStubValue: true } ); const afterUpdateData = await Meteor.callAsync('getData', id); return [ @@ -1194,12 +1187,12 @@ testAsyncMulti('livedata - methods with nested stubs', [ if (Meteor.isClient) { return Meteor.callAsync('insertData', { a: 1 }) .then(async data => { - const [id, message] = await data.stubValuePromise; + const [id, message] = data; test.equal(message, `inserted with: ${id}`); return Meteor.callAsync('updateData', id, { a: 2 }); }) .then(async data => { - const [count, message] = await data.stubValuePromise; + const [count, message] = data; test.equal(count, 1); test.equal(message.before, 'before update: a:1'); test.equal(message.after, 'after update: a:2, gotData:true'); @@ -1208,11 +1201,13 @@ testAsyncMulti('livedata - methods with nested stubs', [ }, ]); - Tinytest.addAsync('livedata - isAsync call', async function (test) { - Meteor.call('isCallAsync', (err, result) => test.equal(result, false)) - const result = await Meteor.callAsync('isCallAsync', { returnStubValue: true }) - test.equal(result, true) -}) +// TODO [FIBERS] - check if this still makes sense to have + +// Tinytest.addAsync('livedata - isAsync call', async function (test) { +// Meteor.call('isCallAsync', (err, result) => test.equal(result, false)) +// const result = await Meteor.callAsync('isCallAsync', { returnStubValue: true }) +// test.equal(result, true) +// }) // XXX some things to test in greater detail: // staying in simulation mode diff --git a/packages/ddp-client/test/stub_stream.js b/packages/ddp-client/test/stub_stream.js index d65990055d7..0464e40d987 100644 --- a/packages/ddp-client/test/stub_stream.js +++ b/packages/ddp-client/test/stub_stream.js @@ -53,5 +53,8 @@ _.extend(StubStream.prototype, { // Provide a tag to detect stub streams. // We don't log heartbeat failures on stub streams, for example. - _isStub: true + _isStub: true, + // useful for testing, where we're sure we don't rely on previous method calls + // this is an example of one https://github.com/meteor/meteor/blob/918e4e10ac05a28a553a36bb1405914f71302170/packages/ddp-client/test/livedata_connection_tests.js#L200 + _neverQueued: true, }); diff --git a/packages/ddp-common/method_invocation.js b/packages/ddp-common/method_invocation.js index 5240e74beeb..12b86e98766 100644 --- a/packages/ddp-common/method_invocation.js +++ b/packages/ddp-common/method_invocation.js @@ -17,6 +17,16 @@ DDPCommon.MethodInvocation = class MethodInvocation { // since there's usually no point in running stubs unless you have a // zero-latency connection to the user. + /** + * @summary The name given to the method. + * @locus Anywhere + * @name name + * @memberOf DDPCommon.MethodInvocation + * @instance + * @type {String} + */ + this.name = options.name; + /** * @summary Access inside a method invocation. Boolean value, true if this invocation is a stub. * @locus Anywhere diff --git a/packages/ddp-common/package.js b/packages/ddp-common/package.js index cb5b6bd854b..63a924f9417 100644 --- a/packages/ddp-common/package.js +++ b/packages/ddp-common/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Code shared beween ddp-client and ddp-server", - version: '1.4.1-alpha300.19', + version: '1.4.1-rc300.2', documentation: null }); diff --git a/packages/ddp-rate-limiter/ddp-rate-limiter-tests.js b/packages/ddp-rate-limiter/ddp-rate-limiter-tests.js index b7ef7bc6a42..983c68f403e 100644 --- a/packages/ddp-rate-limiter/ddp-rate-limiter-tests.js +++ b/packages/ddp-rate-limiter/ddp-rate-limiter-tests.js @@ -31,7 +31,7 @@ testAsyncMulti('ddp rate limiter - default rate limit', [ ); }, async function (test, expect) { - await Meteor.callAsync('removeUserByUsername', { returnServerPromise : true }, this.username); + await Meteor.callAsync('removeUserByUsername', this.username); // Remove the default rate limiter rule Meteor.call('removeDefaultAccountsRateLimitRule'); }, @@ -67,7 +67,7 @@ testAsyncMulti('ddp rate limiter - matchers get passed correct arguments', [ })); }, async function (test, expect) { - await Meteor.callAsync('removeUserByUsername', { returnServerPromise : true }, this.username); + await Meteor.callAsync('removeUserByUsername', this.username); }, function (test, expect) { // Cleanup @@ -127,7 +127,7 @@ testAsyncMulti('ddp rate limiter - callbacks get passed correct arguments', [ })); }, async function (test, expect) { - await Meteor.callAsync('removeUserByUsername', { returnServerPromise : true }, this.username); + await Meteor.callAsync('removeUserByUsername', this.username); }, function (test, expect) { // Cleanup @@ -336,7 +336,7 @@ testAsyncMulti('ddp rate limiter - test removing rule with rateLimited ' + ); }, async function (test, expect) { - await Meteor.callAsync('removeUserByUsername', { returnServerPromise : true }, this.username); + await Meteor.callAsync('removeUserByUsername', this.username); }, ]); diff --git a/packages/ddp-rate-limiter/package.js b/packages/ddp-rate-limiter/package.js index bda9328d47b..ecc6403e49d 100644 --- a/packages/ddp-rate-limiter/package.js +++ b/packages/ddp-rate-limiter/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ddp-rate-limiter', - version: '1.2.1-alpha300.19', + version: '1.2.1-rc300.2', // Brief, one-line summary of the package. summary: 'The DDPRateLimiter allows users to add rate limits to DDP' + ' methods and subscriptions.', @@ -20,9 +20,8 @@ Package.onUse(function(api) { }); Package.onTest(function(api) { - api.use('underscore'); api.use(['accounts-password', 'tinytest', 'test-helpers', 'tracker', - 'accounts-base', 'random', 'email', 'underscore', 'check', + 'accounts-base', 'random', 'email', 'check', 'ddp', 'ecmascript', 'es5-shim']); api.use('ddp-rate-limiter'); diff --git a/packages/ddp-server/livedata_server.js b/packages/ddp-server/livedata_server.js index 3a8d9756018..0b9d0b43dc7 100644 --- a/packages/ddp-server/livedata_server.js +++ b/packages/ddp-server/livedata_server.js @@ -9,6 +9,7 @@ const publicationStrategies = { // When using this strategy, the server maintains a copy of all data a connection is subscribed to. // This allows us to only send deltas over multiple publications. SERVER_MERGE: { + useDummyDocumentView: false, useCollectionView: true, doAccountingForCollection: true, }, @@ -17,6 +18,7 @@ const publicationStrategies = { // to it will not trigger removed messages when a subscription is stopped. // This should only be chosen for special use cases like send-and-forget queues. NO_MERGE_NO_HISTORY: { + useDummyDocumentView: false, useCollectionView: false, doAccountingForCollection: false, }, @@ -24,8 +26,17 @@ const publicationStrategies = { // sent to the client so it can remove them when a subscription is stopped. // This strategy can be used when a collection is only used in a single publication. NO_MERGE: { + useDummyDocumentView: false, useCollectionView: false, doAccountingForCollection: true, + }, + // NO_MERGE_MULTI is similar to `NO_MERGE`, but it does track whether a document is + // used by multiple publications. This has some memory overhead, but it still does not do + // diffing so it's faster and slimmer than SERVER_MERGE. + NO_MERGE_MULTI: { + useDummyDocumentView: true, + useCollectionView: true, + doAccountingForCollection: true } }; @@ -39,6 +50,26 @@ DDPServer.publicationStrategies = publicationStrategies; // Session and Subscription are file scope. For now, until we freeze // the interface, Server is package scope (in the future it should be // exported). +var DummyDocumentView = function () { + var self = this; + self.existsIn = new Set(); // set of subscriptionHandle + self.dataByKey = new Map(); // key-> [ {subscriptionHandle, value} by precedence] +}; + +Object.assign(DummyDocumentView.prototype, { + getFields: function () { + return {} + }, + + clearField: function (subscriptionHandle, key, changeCollector) { + changeCollector[key] = undefined + }, + + changeField: function (subscriptionHandle, key, value, + changeCollector, isAdd) { + changeCollector[key] = value + } +}); // Represents a single document in a SessionCollectionView var SessionDocumentView = function () { @@ -202,7 +233,12 @@ Object.assign(SessionCollectionView.prototype, { var added = false; if (!docView) { added = true; - docView = new SessionDocumentView(); + if (Meteor.server.getPublicationStrategy(this.collectionName).useDummyDocumentView) { + docView = new DummyDocumentView(); + } else { + docView = new SessionDocumentView(); + } + self.documents.set(id, docView); } docView.existsIn.add(subscriptionHandle); @@ -635,7 +671,7 @@ Object.assign(Session.prototype, { }, protocol_handlers: { - sub: function (msg, unblock) { + sub: async function (msg, unblock) { var self = this; // cacheUnblock temporarly, so we can capture it later @@ -694,7 +730,7 @@ Object.assign(Session.prototype, { var handler = self.server.publish_handlers[msg.name]; - self._startSubscription(handler, msg.id, msg.params, msg.name); + await self._startSubscription(handler, msg.id, msg.params, msg.name); // cleaning cached unblock self.cachedUnblock = null; @@ -751,6 +787,7 @@ Object.assign(Session.prototype, { }; var invocation = new DDPCommon.MethodInvocation({ + name: msg.method, isSimulation: false, userId: self.userId, setUserId: setUserId, @@ -952,7 +989,7 @@ Object.assign(Session.prototype, { else self._universalSubs.push(sub); - sub._runHandler(); + return sub._runHandler(); }, // Tear down specified subscription @@ -1126,7 +1163,7 @@ var Subscription = function ( }; Object.assign(Subscription.prototype, { - _runHandler: function() { + _runHandler: async function() { // XXX should we unblock() here? Either before running the publish // function, or before running _publishCursor. // @@ -1166,17 +1203,17 @@ Object.assign(Subscription.prototype, { // Both conventional and async publish handler functions are supported. // If an object is returned with a then() function, it is either a promise // or thenable and will be resolved asynchronously. - const isThenable = + const isThenable = resultOrThenable && typeof resultOrThenable.then === 'function'; if (isThenable) { - Promise.resolve(resultOrThenable).then( - (...args) => self._publishHandlerResult.bind(self)(...args), - e => self.error(e) - ); + try { + self._publishHandlerResult(await resultOrThenable); + } catch(e) { + self.error(e) + } } else { self._publishHandlerResult(resultOrThenable); } - }, _publishHandlerResult: function (res) { diff --git a/packages/ddp-server/livedata_server_tests.js b/packages/ddp-server/livedata_server_tests.js index 930287100ba..445630b4c4c 100644 --- a/packages/ddp-server/livedata_server_tests.js +++ b/packages/ddp-server/livedata_server_tests.js @@ -30,11 +30,13 @@ Tinytest.addAsync( // Wait for the connection to be closed from the server side. simplePoll( function () { - return ! clientConn.status().connected; + return !clientConn.status().connected; }, onComplete, function () { - test.fail("timeout waiting for the connection to be closed on the server side"); + test.fail( + "timeout waiting for the connection to be closed on the server side" + ); onComplete(); } ); @@ -47,36 +49,37 @@ Tinytest.addAsync( } ); - testAsyncMulti( "livedata server - onConnection doesn't get callback after stop.", - [function (test, expect) { - var afterStop = false; - var expectStop1 = expect(); - var stopHandle1 = Meteor.onConnection(function (conn) { - stopHandle2.stop(); - stopHandle1.stop(); - afterStop = true; - // yield to the event loop for a moment to see that no other calls - // to listener2 are called. - Meteor.setTimeout(expectStop1, 10); - }); - var stopHandle2 = Meteor.onConnection(function (conn) { - test.isFalse(afterStop); - }); - - // trigger a connection - var expectConnection = expect(); - makeTestConnection( - test, - function (clientConn, serverConn) { - // Close the connection from the client. - clientConn.disconnect(); - expectConnection(); - }, - expectConnection - ); - }] + [ + function (test, expect) { + var afterStop = false; + var expectStop1 = expect(); + var stopHandle1 = Meteor.onConnection(function (conn) { + stopHandle2.stop(); + stopHandle1.stop(); + afterStop = true; + // yield to the event loop for a moment to see that no other calls + // to listener2 are called. + Meteor.setTimeout(expectStop1, 10); + }); + var stopHandle2 = Meteor.onConnection(function (conn) { + test.isFalse(afterStop); + }); + + // trigger a connection + var expectConnection = expect(); + makeTestConnection( + test, + function (clientConn, serverConn) { + // Close the connection from the client. + clientConn.disconnect(); + expectConnection(); + }, + expectConnection + ); + }, + ] ); Meteor.methods({ @@ -85,50 +88,48 @@ Meteor.methods({ }, livedata_server_test_outer: async function () { - return await Meteor.callAsync('livedata_server_test_inner'); + return await Meteor.callAsync("livedata_server_test_inner"); }, livedata_server_test_setuserid: function (userId) { this.setUserId(userId); - } + }, }); - Tinytest.addAsync( - "livedata server - onMessage hook", - function (test, onComplete) { + "livedata server - onMessage hook", + function (test, onComplete) { + var cb = Meteor.onMessage(function (msg, session) { + if (msg.method !== 'livedata_server_test_inner') return; + test.equal(msg.method, "livedata_server_test_inner"); + cb.stop(); + onComplete(); + }); - var cb = Meteor.onMessage(function (msg, session) { - test.equal(msg.method, 'livedata_server_test_inner'); - cb.stop(); + makeTestConnection( + test, + function (clientConn, serverConn) { + clientConn + .callAsync("livedata_server_test_inner") + .then(() => clientConn.disconnect()) + .catch((e) => { onComplete(); - }); - - makeTestConnection( - test, - function(clientConn, serverConn) { - clientConn - .callAsync('livedata_server_test_inner') - .then(() => clientConn.disconnect()) - .catch(e => { - onComplete(); - throw new Meteor.Error(e); - }); - }, - onComplete - ); - } + throw new Meteor.Error(e); + }); + }, + onComplete + ); + } ); - Tinytest.addAsync( "livedata server - connection in method invocation", function (test, onComplete) { makeTestConnection( test, function (clientConn, serverConn) { - clientConn.callAsync('livedata_server_test_inner').then(async res => { - const r = await res.stubValuePromise; + clientConn.callAsync("livedata_server_test_inner").then(async (res) => { + const r = res; test.equal(r, serverConn.id); clientConn.disconnect(); onComplete(); @@ -139,15 +140,14 @@ Tinytest.addAsync( } ); - Tinytest.addAsync( "livedata server - connection in nested method invocation", function (test, onComplete) { makeTestConnection( test, - function(clientConn, serverConn) { - clientConn.callAsync('livedata_server_test_outer').then(async res => { - const r = await res.stubValuePromise; + function (clientConn, serverConn) { + clientConn.callAsync("livedata_server_test_outer").then(async (res) => { + const r = res; test.equal(r, serverConn.id); clientConn.disconnect(); onComplete(); @@ -158,169 +158,172 @@ Tinytest.addAsync( } ); - // connectionId -> callback var onSubscription = {}; Meteor.publish("livedata_server_test_sub", function (connectionId) { var callback = onSubscription[connectionId]; - if (callback) - callback(this); + if (callback) callback(this); this.stop(); }); -Meteor.publish("livedata_server_test_sub_method", async function (connectionId) { - var callback = onSubscription[connectionId]; - if (callback) { - var id = await Meteor.callAsync('livedata_server_test_inner'); - callback(id); +Meteor.publish( + "livedata_server_test_sub_method", + async function (connectionId) { + var callback = onSubscription[connectionId]; + if (callback) { + var id = await Meteor.callAsync("livedata_server_test_inner"); + callback(id); + } + this.stop(); } - this.stop(); -}); +); -Meteor.publish("livedata_server_test_sub_context", async function (connectionId, userId) { - var callback = onSubscription[connectionId]; - var methodInvocation = DDP._CurrentMethodInvocation.get(); - var publicationInvocation = DDP._CurrentPublicationInvocation.get(); +Meteor.publish( + "livedata_server_test_sub_context", + async function (connectionId, userId) { + var callback = onSubscription[connectionId]; + var methodInvocation = DDP._CurrentMethodInvocation.get(); + var publicationInvocation = DDP._CurrentPublicationInvocation.get(); - // Check the publish function's environment variables and context. - if (callback) { - callback.call(this, methodInvocation, publicationInvocation); - } + // Check the publish function's environment variables and context. + if (callback) { + callback.call(this, methodInvocation, publicationInvocation); + } - // Check that onStop callback is have the same context as the publish function - // and that it runs with the same environment variables as this publish function. - this.onStop(function () { - var onStopMethodInvocation = DDP._CurrentMethodInvocation.get(); - var onStopPublicationInvocation = DDP._CurrentPublicationInvocation.get(); - callback.call(this, onStopMethodInvocation, onStopPublicationInvocation, true); - }); + // Check that onStop callback is have the same context as the publish function + // and that it runs with the same environment variables as this publish function. + this.onStop(function () { + var onStopMethodInvocation = DDP._CurrentMethodInvocation.get(); + var onStopPublicationInvocation = DDP._CurrentPublicationInvocation.get(); + callback.call( + this, + onStopMethodInvocation, + onStopPublicationInvocation, + true + ); + }); - if (this.userId) { - this.stop(); - } else { - this.ready(); - await Meteor.callAsync('livedata_server_test_setuserid', userId); + if (this.userId) { + this.stop(); + } else { + this.ready(); + await Meteor.callAsync("livedata_server_test_setuserid", userId); + } } -}); - +); Tinytest.addAsync( "livedata server - connection in publish function", function (test, onComplete) { - makeTestConnection( - test, - function (clientConn, serverConn) { - onSubscription[serverConn.id] = function (subscription) { - delete onSubscription[serverConn.id]; - test.equal(subscription.connection.id, serverConn.id); - clientConn.disconnect(); - onComplete(); - }; - clientConn.subscribe("livedata_server_test_sub", serverConn.id); - } - ); + makeTestConnection(test, function (clientConn, serverConn) { + onSubscription[serverConn.id] = function (subscription) { + delete onSubscription[serverConn.id]; + test.equal(subscription.connection.id, serverConn.id); + clientConn.disconnect(); + onComplete(); + }; + clientConn.subscribe("livedata_server_test_sub", serverConn.id); + }); } ); Tinytest.addAsync( "livedata server - connection in method called from publish function", function (test, onComplete) { - makeTestConnection( - test, - function (clientConn, serverConn) { - onSubscription[serverConn.id] = function (id) { - delete onSubscription[serverConn.id]; - test.equal(id, serverConn.id); - clientConn.disconnect(); - onComplete(); - }; - clientConn.subscribe("livedata_server_test_sub_method", serverConn.id); - } - ); + makeTestConnection(test, function (clientConn, serverConn) { + onSubscription[serverConn.id] = function (id) { + delete onSubscription[serverConn.id]; + test.equal(id, serverConn.id); + clientConn.disconnect(); + onComplete(); + }; + clientConn.subscribe("livedata_server_test_sub_method", serverConn.id); + }); } ); Tinytest.addAsync( "livedata server - verify context in publish function", function (test, onComplete) { - makeTestConnection( - test, - function (clientConn, serverConn) { - var userId = 'someUserId'; - onSubscription[serverConn.id] = function (methodInvocation, publicationInvocation, fromOnStop) { - // DDP._CurrentMethodInvocation should be undefined in a publish function - test.isUndefined(methodInvocation, 'Should have been undefined'); - // DDP._CurrentPublicationInvocation should be set in a publish function - test.isNotUndefined(publicationInvocation, 'Should have been defined'); - if (this.userId === userId && fromOnStop) { - delete onSubscription[serverConn.id]; - clientConn.disconnect(); - onComplete(); - } + makeTestConnection(test, function (clientConn, serverConn) { + var userId = "someUserId"; + onSubscription[serverConn.id] = function ( + methodInvocation, + publicationInvocation, + fromOnStop + ) { + // DDP._CurrentMethodInvocation should be undefined in a publish function + test.isUndefined(methodInvocation, "Should have been undefined"); + // DDP._CurrentPublicationInvocation should be set in a publish function + test.isNotUndefined(publicationInvocation, "Should have been defined"); + if (this.userId === userId && fromOnStop) { + delete onSubscription[serverConn.id]; + clientConn.disconnect(); + onComplete(); } - clientConn.subscribe("livedata_server_test_sub_context", serverConn.id, userId); - } - ); + }; + clientConn.subscribe( + "livedata_server_test_sub_context", + serverConn.id, + userId + ); + }); } ); let onSubscriptions = {}; Meteor.publish({ - publicationObject () { + publicationObject() { let callback = onSubscriptions; - if (callback) - callback(); + if (callback) callback(); this.stop(); - } + }, }); Meteor.publish({ - "publication_object": function () { + publication_object: function () { let callback = onSubscriptions; - if (callback) - callback(); + if (callback) callback(); this.stop(); - } + }, }); Meteor.publish("publication_compatibility", function () { let callback = onSubscriptions; - if (callback) - callback(); + if (callback) callback(); this.stop(); }); Tinytest.addAsync( "livedata server - publish object", function (test, onComplete) { - makeTestConnection( - test, - function (clientConn, serverConn) { - let testsLength = 0; + makeTestConnection(test, function (clientConn, serverConn) { + let testsLength = 0; - onSubscriptions = function (subscription) { - delete onSubscriptions; - clientConn.disconnect(); - testsLength++; - if(testsLength == 3){ - onComplete(); - } - }; - clientConn.subscribe("publicationObject"); - clientConn.subscribe("publication_object"); - clientConn.subscribe("publication_compatibility"); - } - ); + onSubscriptions = function (subscription) { + delete onSubscriptions; + clientConn.disconnect(); + testsLength++; + if (testsLength == 3) { + onComplete(); + } + }; + clientConn.subscribe("publicationObject"); + clientConn.subscribe("publication_object"); + clientConn.subscribe("publication_compatibility"); + }); } ); Meteor.methods({ async testResolvedPromise(arg) { - const invocationRunningFromCallAsync1 = DDP._CurrentMethodInvocation._isCallAsyncMethodRunning(); - return Promise.resolve(arg).then(result => { - const invocationRunningFromCallAsync2 = DDP._CurrentMethodInvocation._isCallAsyncMethodRunning(); + const invocationRunningFromCallAsync1 = + DDP._CurrentMethodInvocation._isCallAsyncMethodRunning(); + return Promise.resolve(arg).then((result) => { + const invocationRunningFromCallAsync2 = + DDP._CurrentMethodInvocation._isCallAsyncMethodRunning(); // What matters here is that both invocations are coming from the same call, // so both of them can be considered a simulation. if (invocationRunningFromCallAsync1 !== invocationRunningFromCallAsync2) { @@ -331,37 +334,58 @@ Meteor.methods({ }, testRejectedPromise(arg) { - return Promise.resolve(arg).then(result => { + return Promise.resolve(arg).then((result) => { throw new Meteor.Error(result + " raised Meteor.Error"); }); }, testRejectedPromiseWithGenericError(arg) { - return Promise.resolve(arg).then(result => { - const error = new Error('MESSAGE'); - error.error = 'ERROR'; - error.reason = 'REASON'; - error.details = { foo: 'bar' }; + return Promise.resolve(arg).then((result) => { + const error = new Error("MESSAGE"); + error.error = "ERROR"; + error.reason = "REASON"; + error.details = { foo: "bar" }; error.isClientSafe = true; throw error; }); - } + }, +}); + +Meteor.publish("livedata_server_test_sub_chain", async function () { + await new Promise((r) => setTimeout(r, 2000)); + this.ready(); + return null; }); Tinytest.addAsync( - "livedata server - waiting for Promise", - (test, onComplete) => makeTestConnection(test, async (clientConn, serverConn) => { - const testResolvedPromiseResult = await clientConn.callAsync("testResolvedPromise", "clientConn.call"); - test.equal( - await testResolvedPromiseResult.stubValuePromise, - "clientConn.call after waiting" + "livedata server - waiting for subscription chain", + (test, onComplete) => + makeTestConnection(test, async (clientConn, serverConn) => { + const handlers = []; + for (let i = 0; i < 10; i++) { + handlers.push(clientConn.subscribe("livedata_server_test_sub_chain")); + } + await new Promise((r) => setTimeout(r, 3000)); + test.equal( + handlers.map((sub) => sub.ready()).filter((o) => o).length === 1, + true + ); + onComplete(); + }) +); +Tinytest.addAsync("livedata server - waiting for Promise", (test, onComplete) => + makeTestConnection(test, async (clientConn, serverConn) => { + const testResolvedPromiseResult = await clientConn.callAsync( + "testResolvedPromise", + "clientConn.call" ); + test.equal(testResolvedPromiseResult, "clientConn.call after waiting"); - const clientCallPromise = new Promise( - (resolve, reject) => clientConn.call( + const clientCallPromise = new Promise((resolve, reject) => + clientConn.call( "testResolvedPromise", "clientConn.call with callback", - (error, result) => error ? reject(error) : resolve(result) + (error, result) => (error ? reject(error) : resolve(result)) ) ); @@ -375,18 +399,15 @@ Tinytest.addAsync( ["Meteor.server.applyAsync"] ); - const clientCallRejectedPromise = new Promise(resolve => { - clientConn.call( - "testRejectedPromise", - "with callback", - (error, result) => resolve(error.message) + const clientCallRejectedPromise = new Promise((resolve) => { + clientConn.call("testRejectedPromise", "with callback", (error, result) => + resolve(error.message) ); }); - const clientCallRejectedPromiseWithGenericError = new Promise(resolve => { - clientConn.call( - "testRejectedPromiseWithGenericError", - (error, result) => resolve({ + const clientCallRejectedPromiseWithGenericError = new Promise((resolve) => { + clientConn.call("testRejectedPromiseWithGenericError", (error, result) => + resolve({ message: error.message, error: error.error, reason: error.reason, @@ -400,19 +421,24 @@ Tinytest.addAsync( clientCallRejectedPromise, clientCallRejectedPromiseWithGenericError, serverCallAsyncPromise, - serverApplyAsyncPromise - ]).then(results => test.equal(results, [ - "clientConn.call with callback after waiting", - "[with callback raised Meteor.Error]", - { - message: 'REASON [ERROR]', - error: 'ERROR', - reason: 'REASON', - details: { foo: 'bar' }, - }, - "Meteor.server.callAsync after waiting", - "Meteor.server.applyAsync after waiting" - ]), error => test.fail(error)) + serverApplyAsyncPromise, + ]) + .then( + (results) => + test.equal(results, [ + "clientConn.call with callback after waiting", + "[with callback raised Meteor.Error]", + { + message: "REASON [ERROR]", + error: "ERROR", + reason: "REASON", + details: { foo: "bar" }, + }, + "Meteor.server.callAsync after waiting", + "Meteor.server.applyAsync after waiting", + ]), + (error) => test.fail(error) + ) .then(onComplete); }) ); diff --git a/packages/ddp-server/package.js b/packages/ddp-server/package.js index b6b1c8965d6..33423add72b 100644 --- a/packages/ddp-server/package.js +++ b/packages/ddp-server/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data server", - version: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', documentation: null }); diff --git a/packages/ddp-server/stream_server.js b/packages/ddp-server/stream_server.js index 49c0f1385d0..bda04141302 100644 --- a/packages/ddp-server/stream_server.js +++ b/packages/ddp-server/stream_server.js @@ -50,6 +50,9 @@ StreamServer = function () { // combining CPU-heavy processing with SockJS termination (eg a proxy which // converts to Unix sockets) but for now, raise the delay. disconnect_delay: 60 * 1000, + // Allow disabling of CORS requests to address + // https://github.com/meteor/meteor/issues/8317. + disable_cors: !!process.env.DISABLE_SOCKJS_CORS, // Set the USE_JSESSIONID environment variable to enable setting the // JSESSIONID cookie. This is useful for setting up proxies with // session affinity. diff --git a/packages/ddp/ddp.d.ts b/packages/ddp/ddp.d.ts index 199adb3d55b..33e6f23bcf8 100644 --- a/packages/ddp/ddp.d.ts +++ b/packages/ddp/ddp.d.ts @@ -4,6 +4,7 @@ export namespace DDP { interface DDPStatic { subscribe(name: string, ...rest: any[]): Meteor.SubscriptionHandle; call(method: string, ...parameters: any[]): any; + callAsync(method: string, ...parameters: any[]): Promise; apply(method: string, ...parameters: any[]): any; methods(IMeteorMethodsDictionary: any): any; status(): DDPStatus; diff --git a/packages/ddp/package.js b/packages/ddp/package.js index ee8f374b903..e46a4f91bea 100644 --- a/packages/ddp/package.js +++ b/packages/ddp/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data framework", - version: '1.4.2-alpha300.19' + version: '1.4.2-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/appcache/.gitignore b/packages/deprecated/appcache/.gitignore similarity index 100% rename from packages/appcache/.gitignore rename to packages/deprecated/appcache/.gitignore diff --git a/packages/appcache/CHANGELOG.md b/packages/deprecated/appcache/CHANGELOG.md similarity index 100% rename from packages/appcache/CHANGELOG.md rename to packages/deprecated/appcache/CHANGELOG.md diff --git a/packages/appcache/QA.md b/packages/deprecated/appcache/QA.md similarity index 100% rename from packages/appcache/QA.md rename to packages/deprecated/appcache/QA.md diff --git a/packages/appcache/README.md b/packages/deprecated/appcache/README.md similarity index 95% rename from packages/appcache/README.md rename to packages/deprecated/appcache/README.md index d0d10221caf..e5e08a8a520 100644 --- a/packages/appcache/README.md +++ b/packages/deprecated/appcache/README.md @@ -1,5 +1,5 @@ # appcache -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/appcache) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/appcache) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/appcache) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/appcache) *** The `appcache` package, part of diff --git a/packages/appcache/appcache-client.js b/packages/deprecated/appcache/appcache-client.js similarity index 100% rename from packages/appcache/appcache-client.js rename to packages/deprecated/appcache/appcache-client.js diff --git a/packages/appcache/appcache-server.js b/packages/deprecated/appcache/appcache-server.js similarity index 100% rename from packages/appcache/appcache-server.js rename to packages/deprecated/appcache/appcache-server.js diff --git a/packages/appcache/appcache_tests-client.js b/packages/deprecated/appcache/appcache_tests-client.js similarity index 100% rename from packages/appcache/appcache_tests-client.js rename to packages/deprecated/appcache/appcache_tests-client.js diff --git a/packages/appcache/appcache_tests-server.js b/packages/deprecated/appcache/appcache_tests-server.js similarity index 100% rename from packages/appcache/appcache_tests-server.js rename to packages/deprecated/appcache/appcache_tests-server.js diff --git a/packages/appcache/package.js b/packages/deprecated/appcache/package.js similarity index 95% rename from packages/appcache/package.js rename to packages/deprecated/appcache/package.js index ecbd7fc65d1..f9e166fe4d9 100644 --- a/packages/appcache/package.js +++ b/packages/deprecated/appcache/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Enable the application cache in the browser", - version: '1.2.9-alpha300.19', + version: '1.2.9-beta300.7', deprecated: true, }); diff --git a/packages/deprecated/code-prettify/README.md b/packages/deprecated/code-prettify/README.md index 783efebed36..c4d909d3cd9 100644 --- a/packages/deprecated/code-prettify/README.md +++ b/packages/deprecated/code-prettify/README.md @@ -1,5 +1,5 @@ # code-prettify -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/code-prettify) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/code-prettify) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/code-prettify) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/code-prettify) *** This internal Meteor package is now unnecessary and has been deprecated. To diff --git a/packages/deprecated/context/package.js b/packages/deprecated/context/package.js index 156c5fef3a0..d7a3bca5482 100644 --- a/packages/deprecated/context/package.js +++ b/packages/deprecated/context/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "context", - version: '1.0.0-alpha300.19', + version: '1.0.0-beta300.7', summary: "Manage contextual information without passing objects around", documentation: "README.md", deprecated: 'You should not be needing this package in Meteor 3' diff --git a/packages/deprecated/deps/README.md b/packages/deprecated/deps/README.md index ee8dff27cf9..52103c78800 100644 --- a/packages/deprecated/deps/README.md +++ b/packages/deprecated/deps/README.md @@ -1,5 +1,5 @@ # deps -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deps) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deps) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/deps) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/deps) *** -This is an internal Meteor package. \ No newline at end of file +This is an internal Meteor package. diff --git a/packages/deprecated/facebook/README.md b/packages/deprecated/facebook/README.md index 33a61e7d966..cf055c9b61a 100644 --- a/packages/deprecated/facebook/README.md +++ b/packages/deprecated/facebook/README.md @@ -1,5 +1,5 @@ # facebook -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/facebook) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/facebook) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/facebook) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/facebook) *** ** Deprecated, use facebook-oauth instead** diff --git a/packages/deprecated/facts/README.md b/packages/deprecated/facts/README.md index d6ca4f54456..32c4320704a 100644 --- a/packages/deprecated/facts/README.md +++ b/packages/deprecated/facts/README.md @@ -1,5 +1,5 @@ # facts -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/facts) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/facts) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/facts) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/facts) *** This is a legacy internal Meteor package. Use facts-ui or facts-base instead. diff --git a/packages/deprecated/fastclick/README.md b/packages/deprecated/fastclick/README.md index e5a1cf6bca9..91623a5caee 100644 --- a/packages/deprecated/fastclick/README.md +++ b/packages/deprecated/fastclick/README.md @@ -1,5 +1,5 @@ # fastclick -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/fastclick) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/fastclick) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/fastclick) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/fastclick) *** > **Warning:** As of late 2015 most mobile browsers - notably Chrome and Safari - no longer have a 300ms touch delay, so fastclick offers no benefit on newer browsers, and risks introducing [bugs](https://github.com/ftlabs/fastclick/issues) into your application. Consider carefully whether you really need to use it. diff --git a/packages/deprecated/github/README.md b/packages/deprecated/github/README.md index f485e8f45f6..59a7fcbde56 100644 --- a/packages/deprecated/github/README.md +++ b/packages/deprecated/github/README.md @@ -1,5 +1,5 @@ # github -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/github) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/github) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/github) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/github) *** **Deprecated, use github-oauth instead.** diff --git a/packages/deprecated/google/README.md b/packages/deprecated/google/README.md index dd09ba9bad4..5bda6ee6d71 100644 --- a/packages/deprecated/google/README.md +++ b/packages/deprecated/google/README.md @@ -1,5 +1,5 @@ # google-oauth -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/google) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/google) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/google) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/google) *** ** Deprecated, use google-oauth instead** diff --git a/packages/deprecated/handlebars/README.md b/packages/deprecated/handlebars/README.md index b5883dc56ff..51057c558f4 100644 --- a/packages/deprecated/handlebars/README.md +++ b/packages/deprecated/handlebars/README.md @@ -1,5 +1,5 @@ # handlebars -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/handlebars) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/handlebars) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/handlebars) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/handlebars) *** -This is an internal Meteor package. \ No newline at end of file +This is an internal Meteor package. diff --git a/packages/deprecated/http/package.js b/packages/deprecated/http/package.js index b2f335da65c..405387d2000 100644 --- a/packages/deprecated/http/package.js +++ b/packages/deprecated/http/package.js @@ -1,15 +1,15 @@ Package.describe({ summary: "Make HTTP calls to remote servers", - version: '3.0.0-alpha300.19', + version: '3.0.0-beta300.7', deprecated: 'Please use the fetch package' }); Package.onUse(function (api) { api.use([ 'url@1.3.2', - 'ecmascript@0.16.8-alpha300.19', - 'fetch@0.1.4-alpha300.19', - 'modules@0.19.1-alpha300.19' + 'ecmascript@0.16.8-beta300.7', + 'fetch@0.1.4-beta300.7', + 'modules@0.19.1-beta300.7' ]); api.mainModule('httpcall_client.js', 'client'); diff --git a/packages/deprecated/jquery-layout/jquery.layout.js b/packages/deprecated/jquery-layout/jquery.layout.js index b0bf6111e6a..1cdbae67fd5 100644 --- a/packages/deprecated/jquery-layout/jquery.layout.js +++ b/packages/deprecated/jquery-layout/jquery.layout.js @@ -797,7 +797,7 @@ $.layout.defaults = { * PANE-SPECIFIC SETTINGS * - options listed below MUST be specified per-pane - they CANNOT be set under 'panes' * - all options under the 'panes' key can also be set specifically for any pane - * - most options under the 'panes' key apply only to 'border-panes' - NOT the the center-pane + * - most options under the 'panes' key apply only to 'border-panes' - NOT the center-pane */ , north: { paneSelector: ".ui-layout-north" @@ -978,7 +978,7 @@ $.layout.backwardCompatibility = { $.extend(true, opts.panes, opts.defaults); delete opts.defaults; } - // rename options in the the options.panes key + // rename options in the options.panes key if (opts.panes) ren( opts.panes ); // rename options inside *each pane key*, eg: options.west $.each($.layout.config.allPanes, function (i, pane) { @@ -5935,4 +5935,4 @@ $.layout.browserZoom = { $.layout.onReady.push( $.layout.browserZoom._init ); -})( jQuery ); +})( jQuery ); diff --git a/packages/deprecated/jquery-waypoints/README.md b/packages/deprecated/jquery-waypoints/README.md index c850cf03943..84d71a33833 100644 --- a/packages/deprecated/jquery-waypoints/README.md +++ b/packages/deprecated/jquery-waypoints/README.md @@ -1,7 +1,7 @@ # jquery-waypoints -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/jquery-waypoints) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/jquery-waypoints) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/jquery-waypoints) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/jquery-waypoints) *** This is a wrapper package for the JQuery Waypoints library. You can use it to add callbacks that fire when the user scrolls to certain elements on a page, for example to implement table of contents highlighting. -See the [JQuery Waypoints docs](http://imakewebthings.com/jquery-waypoints/) for more details. \ No newline at end of file +See the [JQuery Waypoints docs](http://imakewebthings.com/jquery-waypoints/) for more details. diff --git a/packages/deprecated/jshint/.npm/plugin/lintJshint/npm-shrinkwrap.json b/packages/deprecated/jshint/.npm/plugin/lintJshint/npm-shrinkwrap.json index ee44bdaeeec..a7e2c547b58 100644 --- a/packages/deprecated/jshint/.npm/plugin/lintJshint/npm-shrinkwrap.json +++ b/packages/deprecated/jshint/.npm/plugin/lintJshint/npm-shrinkwrap.json @@ -1,5 +1,5 @@ { - "lockfileVersion": 1, + "lockfileVersion": 4, "dependencies": { "balanced-match": { "version": "1.0.2", diff --git a/packages/deprecated/jshint/README.md b/packages/deprecated/jshint/README.md index ea0757e1fc5..1c9738962bd 100644 --- a/packages/deprecated/jshint/README.md +++ b/packages/deprecated/jshint/README.md @@ -1,5 +1,5 @@ # jshint -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/jshint) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/jshint) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/jshint) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/jshint) *** JSHint for Meteor diff --git a/packages/deprecated/jsparse/README.md b/packages/deprecated/jsparse/README.md index 2ccdb1cb84c..12fcf377d6c 100644 --- a/packages/deprecated/jsparse/README.md +++ b/packages/deprecated/jsparse/README.md @@ -1,7 +1,7 @@ # jsparse -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/jsparse) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/jsparse) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/jsparse) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/jsparse) *** This internal Meteor package is now unnecessary and has been deprecated. To continue to use a working version of this package, please pin your package -version to 1.0.10 (e.g. meteor add jsparse@=1.0.10) \ No newline at end of file +version to 1.0.10 (e.g. meteor add jsparse@=1.0.10) diff --git a/packages/deprecated/livedata/README.md b/packages/deprecated/livedata/README.md index c5e4fd6b2d0..2bd20df45a4 100644 --- a/packages/deprecated/livedata/README.md +++ b/packages/deprecated/livedata/README.md @@ -1,5 +1,5 @@ # livedata -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/livedata) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/livedata) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/livedata) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/livedata) *** -This is an internal Meteor package. \ No newline at end of file +This is an internal Meteor package. diff --git a/packages/deprecated/markdown/package.js b/packages/deprecated/markdown/package.js index 9adf511e21a..afeed768226 100644 --- a/packages/deprecated/markdown/package.js +++ b/packages/deprecated/markdown/package.js @@ -2,13 +2,13 @@ Package.describe({ summary: "Markdown-to-HTML processor", - version: "3.0.0-alpha300.19", + version: "3.0.0-beta300.7", deprecated: true, documentation: 'README.md' }); Package.onUse(function (api) { - api.use('ecmascript@0.16.8-alpha300.19'); + api.use('ecmascript@0.16.8-beta300.7'); api.use("templating@1.4.2", "client", {weak: true}); api.mainModule('template-integration.js', 'client'); }); diff --git a/packages/deprecated/meetup/README.md b/packages/deprecated/meetup/README.md index 5f4c0147d90..6a943e5c9b0 100644 --- a/packages/deprecated/meetup/README.md +++ b/packages/deprecated/meetup/README.md @@ -1,5 +1,5 @@ # meetup -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/meetup) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/meetup) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/meetup) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/meetup) *** **Deprecated, use meetup-oauth instead.** diff --git a/packages/deprecated/meteor-developer/README.md b/packages/deprecated/meteor-developer/README.md index ba79687e904..21130abddb7 100644 --- a/packages/deprecated/meteor-developer/README.md +++ b/packages/deprecated/meteor-developer/README.md @@ -1,5 +1,5 @@ # meteor-developer -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/meteor-developer) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/meteor-developer) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/meteor-developer) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/meteor-developer) *** **Deprecated, use meteor-developer-oauth instead.** diff --git a/packages/deprecated/meteor-platform/README.md b/packages/deprecated/meteor-platform/README.md index b1832af8568..e6e450ca42a 100644 --- a/packages/deprecated/meteor-platform/README.md +++ b/packages/deprecated/meteor-platform/README.md @@ -1,5 +1,5 @@ # meteor-platform -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/meteor-platform) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/meteor-platform) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/meteor-platform) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/meteor-platform) *** This package used to be added to every app by `meteor create`, but is now deprecated in favor of `meteor-base` and a carefully chosen set of other packages. diff --git a/packages/deprecated/meteor-platform/package.js b/packages/deprecated/meteor-platform/package.js index 3f2371dfc6d..a0fe586dfad 100644 --- a/packages/deprecated/meteor-platform/package.js +++ b/packages/deprecated/meteor-platform/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "(Deprecated) Include a standard set of Meteor packages in your app", - version: '1.2.6', + version: '1.2.8', deprecated: true, documentation: 'README.md' }); @@ -43,8 +43,6 @@ Package.onUse(function(api) { 'check', // _.isUseful(true) 'underscore', - // $(".usefulToo") - 'jquery', // Life isn't always predictable. 'random', // People like being able to clone objects. diff --git a/packages/deprecated/meyerweb-reset/README.md b/packages/deprecated/meyerweb-reset/README.md index 74c06454b4c..863f7bef685 100644 --- a/packages/deprecated/meyerweb-reset/README.md +++ b/packages/deprecated/meyerweb-reset/README.md @@ -1,7 +1,7 @@ # meyerweb-reset -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/meyerweb-reset) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/meyerweb-reset) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/meyerweb-reset) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/meyerweb-reset) *** This internal Meteor package is now unnecessary and has been deprecated. To continue to use a working version of this package, please pin your package -version to 1.0.7 (e.g. meteor add meyerweb-reset@=1.0.7) \ No newline at end of file +version to 1.0.7 (e.g. meteor add meyerweb-reset@=1.0.7) diff --git a/packages/deprecated/npm-bcrypt/README.md b/packages/deprecated/npm-bcrypt/README.md index 3f4ac59fff4..4f621256c39 100644 --- a/packages/deprecated/npm-bcrypt/README.md +++ b/packages/deprecated/npm-bcrypt/README.md @@ -1,4 +1,4 @@ # npm-bcrypt -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/npm-bcrypt) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/npm-bcrypt) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/npm-bcrypt) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/npm-bcrypt) *** diff --git a/packages/deprecated/preserve-inputs/README.md b/packages/deprecated/preserve-inputs/README.md index b9f29d421f1..1a3118f6a23 100644 --- a/packages/deprecated/preserve-inputs/README.md +++ b/packages/deprecated/preserve-inputs/README.md @@ -1,5 +1,5 @@ # preserve-inputs -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/preserve-inputs) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/preserve-inputs) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/preserve-inputs) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/preserve-inputs) *** -This is an internal Meteor package. \ No newline at end of file +This is an internal Meteor package. diff --git a/packages/deprecated/showdown/README.md b/packages/deprecated/showdown/README.md index e2d39d3b2f5..f5e5a96cb85 100644 --- a/packages/deprecated/showdown/README.md +++ b/packages/deprecated/showdown/README.md @@ -1,5 +1,5 @@ # showdown -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/showdown) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/showdown) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/showdown) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/showdown) *** -This is an internal Meteor package. \ No newline at end of file +This is an internal Meteor package. diff --git a/packages/deprecated/spiderable/README.md b/packages/deprecated/spiderable/README.md index 03b70715649..1060b2d9177 100644 --- a/packages/deprecated/spiderable/README.md +++ b/packages/deprecated/spiderable/README.md @@ -1,5 +1,5 @@ # spiderable -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/spiderable) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/spiderable) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/spiderable) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/spiderable) *** `spiderable` is part of [Webapp](https://github.com/meteor/meteor/tree/master/packages/webapp). It's one possible way to allow web search engines to index a Meteor application. It uses the [AJAX Crawling specification](https://developers.google.com/webmasters/ajax-crawling/) published by Google to serve HTML to compatible spiders (Google, Bing, Yandex, and more). diff --git a/packages/deprecated/spiderable/package.js b/packages/deprecated/spiderable/package.js index 2c91660aa70..c96fa78131a 100644 --- a/packages/deprecated/spiderable/package.js +++ b/packages/deprecated/spiderable/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Makes the application crawlable to web spiders", - version: "1.1.0-alpha300.5", + version: "1.1.0-alpha300.6", deprecated: true, documentation: 'README.md' }); diff --git a/packages/deprecated/spiderable/spiderable_server.js b/packages/deprecated/spiderable/spiderable_server.js index 934d0235a7b..d288e67d945 100644 --- a/packages/deprecated/spiderable/spiderable_server.js +++ b/packages/deprecated/spiderable/spiderable_server.js @@ -56,9 +56,8 @@ Spiderable._urlForPhantom = function (siteAbsoluteUrl, requestUrl) { return urlParser.format(parsedAbsoluteUrl); }; -var PHANTOM_SCRIPT = Assets.getText("phantom_script.js"); - WebApp.handlers.use(function (req, res, next) { + var PHANTOM_SCRIPT = Assets.getTextAsync("phantom_script.js"); // _escaped_fragment_ comes from Google's AJAX crawling spec: // https://developers.google.com/webmasters/ajax-crawling/docs/specification if (/\?.*_escaped_fragment_=/.test(req.url) || diff --git a/packages/deprecated/srp/README.md b/packages/deprecated/srp/README.md index 10570e3063d..15df1c25bf1 100644 --- a/packages/deprecated/srp/README.md +++ b/packages/deprecated/srp/README.md @@ -1,5 +1,5 @@ # srp -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/srp) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/srp) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/srp) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/srp) *** -This is an internal Meteor package. \ No newline at end of file +This is an internal Meteor package. diff --git a/packages/deprecated/standard-app-packages/README.md b/packages/deprecated/standard-app-packages/README.md index 4a584a3324a..418e023b1ce 100644 --- a/packages/deprecated/standard-app-packages/README.md +++ b/packages/deprecated/standard-app-packages/README.md @@ -1,5 +1,5 @@ # standard-app-packages -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/standard-app-packages) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/standard-app-packages) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/standard-app-packages) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/standard-app-packages) *** -This is an internal Meteor package. \ No newline at end of file +This is an internal Meteor package. diff --git a/packages/deprecated/standard-app-packages/package.js b/packages/deprecated/standard-app-packages/package.js index 7f9d527401c..cf5365cb1b6 100644 --- a/packages/deprecated/standard-app-packages/package.js +++ b/packages/deprecated/standard-app-packages/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Moved to meteor-platform", - version: '1.0.9', + version: '1.0.11', deprecated: true, documentation: 'README.md' }); diff --git a/packages/deprecated/startup/README.md b/packages/deprecated/startup/README.md index 838fc22489e..a5a205aab01 100644 --- a/packages/deprecated/startup/README.md +++ b/packages/deprecated/startup/README.md @@ -1,5 +1,5 @@ # startup -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/startup) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/startup) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/startup) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/startup) *** -This is an internal Meteor package. \ No newline at end of file +This is an internal Meteor package. diff --git a/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json index 79fc165bf1d..55fc3418b4a 100644 --- a/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json +++ b/packages/deprecated/stylus/.npm/plugin/compileStylusBatch/npm-shrinkwrap.json @@ -1,5 +1,5 @@ { - "lockfileVersion": 1, + "lockfileVersion": 4, "dependencies": { "amdefine": { "version": "1.0.1", @@ -32,9 +32,9 @@ "integrity": "sha512-fKSWtyNQTclfi1A+s2KU91/r1mfANG1ZibxTdCwJGfV1J9UwcV22plFOm0wkaq4WzqW87zxiAkyp2Ho1Wn1NnA==" }, "caniuse-db": { - "version": "1.0.30001509", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001509.tgz", - "integrity": "sha512-Gf3pFp97loixG5w83NVb09DMI+WzkVXLn4H2abxv7DXxHUyKYbZc5qpEqAQy/mDFO6bAnNQh4hZ8lLeGlPTZQg==" + "version": "1.0.30001620", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001620.tgz", + "integrity": "sha512-dYQIgCcUpy2l/IfiEA6xgNHCgr5jmDWF4i89MRv6DqCiEt4MNJguYsVeVZSxyqWfb8GfhWEZEMkjI3vhIYRrvw==" }, "concat-map": { "version": "0.0.1", diff --git a/packages/deprecated/stylus/README.md b/packages/deprecated/stylus/README.md index 4d5893cbcd6..f539bf10abc 100644 --- a/packages/deprecated/stylus/README.md +++ b/packages/deprecated/stylus/README.md @@ -1,5 +1,5 @@ # stylus -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/stylus) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/stylus) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/stylus) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/stylus) *** **DEPRECATED:** This package is no longer supported/maintained as part of the diff --git a/packages/deprecated/twitter/README.md b/packages/deprecated/twitter/README.md index fa2c64ba7b7..ddcce4cf90f 100644 --- a/packages/deprecated/twitter/README.md +++ b/packages/deprecated/twitter/README.md @@ -1,5 +1,5 @@ # twitter -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/twitter) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/twitter) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/twitter) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/twitter) *** ** Deprecated, use twitter-oauth instead** diff --git a/packages/deprecated/weibo/README.md b/packages/deprecated/weibo/README.md index c79dc408738..6e3f99d86df 100644 --- a/packages/deprecated/weibo/README.md +++ b/packages/deprecated/weibo/README.md @@ -1,5 +1,5 @@ # weibo -[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/weibo) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/weibo) +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/deprecated/weibo) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/deprecated/weibo) *** ** Deprecated, use weibo-oauth instead** diff --git a/packages/dev-error-overlay/package.js b/packages/dev-error-overlay/package.js index 54cfaeaf3ae..7ed17cb4004 100644 --- a/packages/dev-error-overlay/package.js +++ b/packages/dev-error-overlay/package.js @@ -1,5 +1,5 @@ Package.describe({ - version: '0.1.3-alpha300.19', + version: '0.1.3-rc300.2', summary: 'Show build errors in client when using HMR', documentation: 'README.md', devOnly: true diff --git a/packages/diff-sequence/package.js b/packages/diff-sequence/package.js index 487c3c3b0c5..46145033e50 100644 --- a/packages/diff-sequence/package.js +++ b/packages/diff-sequence/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "An implementation of a diff algorithm on arrays and objects.", - version: '1.1.3-alpha300.19', + version: '1.1.3-rc300.2', documentation: null }); diff --git a/packages/disable-oplog/package.js b/packages/disable-oplog/package.js index 9a6439a0f3e..2b18c277a50 100644 --- a/packages/disable-oplog/package.js +++ b/packages/disable-oplog/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Disables oplog tailing", - version: '1.0.8-alpha300.19' + version: '1.0.8-rc300.2', }); // This package is empty; its presence is detected by mongo-livedata. diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index f4bc7b6bd43..5a324c79eb3 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.7.4-alpha300.19", + version: '0.7.4-rc300.2', summary: "Runtime support for Meteor 1.5 dynamic import(...) syntax", documentation: "README.md" }); diff --git a/packages/ecmascript-runtime-client/package.js b/packages/ecmascript-runtime-client/package.js index 047c53faf53..14a57611a1e 100644 --- a/packages/ecmascript-runtime-client/package.js +++ b/packages/ecmascript-runtime-client/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript-runtime-client', - version: '0.12.2-alpha300.19', + version: '0.12.2-rc300.2', summary: 'Polyfills for new ECMAScript 2015 APIs like Map and Set', git: 'https://github.com/meteor/meteor/tree/devel/packages/ecmascript-runtime-client', diff --git a/packages/ecmascript-runtime-server/package.js b/packages/ecmascript-runtime-server/package.js index 503e9f28e5c..9ec2fac12ed 100644 --- a/packages/ecmascript-runtime-server/package.js +++ b/packages/ecmascript-runtime-server/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "ecmascript-runtime-server", - version: "0.11.1-alpha300.19", + version: '0.11.1-rc300.2', summary: "Polyfills for new ECMAScript 2015 APIs like Map and Set", git: "https://github.com/meteor/meteor/tree/devel/packages/ecmascript-runtime-client", documentation: "README.md" diff --git a/packages/ecmascript-runtime/package.js b/packages/ecmascript-runtime/package.js index 0c23c931301..b3f59fd4ec1 100644 --- a/packages/ecmascript-runtime/package.js +++ b/packages/ecmascript-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "ecmascript-runtime", - version: '0.8.2-alpha300.19', + version: '0.8.2-rc300.2', summary: "Polyfills for new ECMAScript 2015 APIs like Map and Set", git: "https://github.com/meteor/ecmascript-runtime", documentation: "README.md" diff --git a/packages/ecmascript/ecmascript.js b/packages/ecmascript/ecmascript.js index d562fc0df11..391e73bd49f 100644 --- a/packages/ecmascript/ecmascript.js +++ b/packages/ecmascript/ecmascript.js @@ -1,12 +1,5 @@ ECMAScript = { - compileForShell(command, cacheOptions) { - const babelOptions = Babel.getDefaultOptions({ - nodeMajorVersion: parseInt(process.versions.node, 10), - compileForShell: true - }); - delete babelOptions.sourceMap; - delete babelOptions.sourceMaps; - babelOptions.ast = false; - return Babel.compile(command, babelOptions, cacheOptions).code; + compileForShell() { + throw new Error('compileForShell was removed in Meteor 3. Use Babel.compileForShell instead from babel-compiler'); } }; diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index 48a24484b97..d37de37ef22 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.16.8-alpha300.19', + version: '0.16.9-rc300.2', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md', }); @@ -18,7 +18,6 @@ Package.registerBuildPlugin({ Package.onUse(function(api) { api.use('isobuild:compiler-plugin@1.0.0'); - api.use('babel-compiler'); api.use('react-fast-refresh'); // The following api.imply calls should match those in diff --git a/packages/ejson/ejson.js b/packages/ejson/ejson.js index 25efbc761da..e83d0992792 100644 --- a/packages/ejson/ejson.js +++ b/packages/ejson/ejson.js @@ -384,11 +384,11 @@ EJSON.fromJSONValue = item => { * @locus Anywhere * @param {EJSON} val A value to stringify. * @param {Object} [options] - * @param {Boolean | Integer | String} options.indent Indents objects and + * @param {Boolean | Integer | String} [options.indent] Indents objects and * arrays for easy readability. When `true`, indents by 2 spaces; when an * integer, indents by that number of spaces; and when a string, uses the * string as the indentation pattern. - * @param {Boolean} options.canonical When `true`, stringifies keys in an + * @param {Boolean} [options.canonical] When `true`, stringifies keys in an * object in sorted order. */ EJSON.stringify = handleError((item, options) => { diff --git a/packages/ejson/package.js b/packages/ejson/package.js index 5db6809ec24..82be66caed5 100644 --- a/packages/ejson/package.js +++ b/packages/ejson/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Extended and Extensible JSON library', - version: '1.1.4-alpha300.19', + version: '1.1.4-rc300.2', }); Package.onUse(function onUse(api) { diff --git a/packages/email/.npm/package/npm-shrinkwrap.json b/packages/email/.npm/package/npm-shrinkwrap.json index 348608b3e47..3873aac1b36 100644 --- a/packages/email/.npm/package/npm-shrinkwrap.json +++ b/packages/email/.npm/package/npm-shrinkwrap.json @@ -2,19 +2,54 @@ "lockfileVersion": 4, "dependencies": { "@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==" + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==" }, "@types/nodemailer": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.7.tgz", - "integrity": "sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==" + "version": "6.4.14", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.14.tgz", + "integrity": "sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==" + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "nodemailer": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.3.tgz", - "integrity": "sha512-faZFufgTMrphYoDjvyVpbpJcYzwyFnbAMmQtj1lVBYAUSm3SOy2fIdd9+Mr4UxPosBa0JRw9bJoIwQn+nswiew==" + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.10.tgz", + "integrity": "sha512-qtoKfGFhvIFW5kLfrkw2R6Nm6Ur4LNUMykyqu6n9BRKJuyQrqEGwdXXUAbwWEKt33dlWUGXb7rzmJP/p4+O+CA==" + }, + "nodemailer-openpgp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nodemailer-openpgp/-/nodemailer-openpgp-2.2.0.tgz", + "integrity": "sha512-e6+pgGVpMEZ2ywHcAtTdKhUCU5HwZI23RFoNUA/mJPytUW369mQqEcHFLUoxEITOLrzeoLjn5wOYFYzSpef+Tg==" + }, + "openpgp": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.9.0.tgz", + "integrity": "sha512-wEI6TAinCAq8ZLZA4oZ3ZtJ2BhhHj+CiPCd8TzE7zCicr0V8tvG5UF76OtddLLOJcK63w3Aj3KiRd+VLMScirQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "stream-buffers": { "version": "3.0.2", diff --git a/packages/email/email.js b/packages/email/email.js index bbecdfe7866..a17b11fcf3d 100644 --- a/packages/email/email.js +++ b/packages/email/email.js @@ -5,6 +5,7 @@ import { Hook } from 'meteor/callback-hook'; import url from 'url'; import nodemailer from 'nodemailer'; import wellKnow from 'nodemailer/lib/well-known'; +import { openpgpEncrypt } from 'nodemailer-openpgp'; export const Email = {}; export const EmailTest = {}; @@ -24,7 +25,7 @@ export const EmailInternals = { const MailComposer = EmailInternals.NpmModules.mailcomposer.module; -const makeTransport = async function (mailUrlString) { +const makeTransport = function (mailUrlString, options) { const mailUrl = new URL(mailUrlString); if (mailUrl.protocol !== 'smtp:' && mailUrl.protocol !== 'smtps:') { @@ -52,11 +53,15 @@ const makeTransport = async function (mailUrlString) { mailUrl.query.pool = 'true'; } - return nodemailer.createTransport(url.format(mailUrl)); + const transport = nodemailer.createTransport(url.format(mailUrl)); + if (options?.encryptionKeys || options?.shouldSign) { + transport.use('stream', openpgpEncrypt(options)); + } + return transport; }; // More info: https://nodemailer.com/smtp/well-known/ -const knownHostsTransport = function (settings = undefined, url = undefined) { +const knownHostsTransport = function (settings = undefined, url = undefined, options) { let service, user, password; const hasSettings = settings && Object.keys(settings).length; @@ -93,41 +98,46 @@ const knownHostsTransport = function (settings = undefined, url = undefined) { ); } - return nodemailer.createTransport({ + const transport = nodemailer.createTransport({ service: settings?.service || service, auth: { user: settings?.user || user, pass: settings?.password || password, }, }); + + if (options?.encryptionKeys || options?.shouldSign) { + transport.use('stream', openpgpEncrypt(options)); + } + return transport; }; EmailTest.knowHostsTransport = knownHostsTransport; -const getTransport = async function () { +const getTransport = function (options) { 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 // process.env.MAIL_URL changes. const url = process.env.MAIL_URL; if ( - this.cacheKey === undefined || - this.cacheKey !== url || - this.cacheKey !== packageSettings.service || - this.cacheKey !== 'settings' + globalThis.cacheKey === undefined || + globalThis.cacheKey !== url || + globalThis.cacheKey !== packageSettings.service || + globalThis.cacheKey !== 'settings' ) { if ( (packageSettings.service && wellKnow(packageSettings.service)) || (url && wellKnow(new URL(url).hostname)) || wellKnow(url?.split(':')[0] || '') ) { - this.cacheKey = packageSettings.service || 'settings'; - this.cache = knownHostsTransport(packageSettings, url); + globalThis.cacheKey = packageSettings.service || 'settings'; + globalThis.cache = knownHostsTransport(packageSettings, url, options); } else { - this.cacheKey = url; - this.cache = url ? await makeTransport(url, packageSettings) : null; + globalThis.cacheKey = url; + globalThis.cache = url ? makeTransport(url, options) : null; } } - return this.cache; + return globalThis.cache; }; let nextDevModeMailId = 0; @@ -203,7 +213,7 @@ Email.customTransport = undefined; * @locus Server * @return {Promise} * @param {Object} options - * @param {String} [options.from] "From:" address (required) + * @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 @@ -250,10 +260,9 @@ Email.sendAsync = async function (options) { } if (mailUrlEnv || mailUrlSettings) { - const transport = await getTransport(); - await transport.sendMail(email); - return; + return getTransport().sendMail(email); } + return devModeSendAsync(email, options); }; @@ -273,7 +282,7 @@ Email.sendAsync = async function (options) { * @locus Server * @return {Promise} * @param {Object} options - * @param {String} [options.from] "From:" address (required) + * @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 @@ -290,7 +299,9 @@ Email.sendAsync = async function (options) { * object representing the message to be sent. Overrides all other options. * You can create a `MailComposer` object via * `new EmailInternals.NpmModules.mailcomposer.module`. - */ + * @param {String} [options.encryptionKeys] An array that holds the public keys used to encrypt. + * @param {String} [options.shouldSign] Enables you to allow or disallow email signing. +*/ Email.send = function(options) { Email.sendAsync(options) .then(() => diff --git a/packages/email/email_tests.js b/packages/email/email_tests.js index 498c7fb065d..c2904d0b6be 100644 --- a/packages/email/email_tests.js +++ b/packages/email/email_tests.js @@ -191,6 +191,32 @@ Tinytest.addAsync( } ); +Tinytest.addAsync( + '[Async] email - with custom encryption', + function (test, onComplete) { + const allPromises = []; + smokeEmailTest((stream) => { + Email.customTransport = (options) => { + test.equal(options.encryptionKeys, ['-----BEGIN PGP PUBLIC KEY BLOCK-----…']); + test.equal(options.shouldSign, true); + }; + allPromises.push( + Email.sendAsync({ + from: 'foo@example.com', + to: 'bar@example.com', + text: '*Cool*, man', + html: 'Cool, man', + encryptionKeys: ['-----BEGIN PGP PUBLIC KEY BLOCK-----…'], + shouldSign: true + }).then(() => { + test.equal(stream.getContentsAsString('utf8'), false); + }) + ); + Promise.all(allPromises).then(() => onComplete()); + }); + } +); + Tinytest.addAsync( 'email - with custom transport long time running', async function (test) { diff --git a/packages/email/package.js b/packages/email/package.js index 4ccef1adb49..5f641739e16 100644 --- a/packages/email/package.js +++ b/packages/email/package.js @@ -1,12 +1,13 @@ Package.describe({ summary: 'Send email messages', - version: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', }); Npm.depends({ - nodemailer: '6.6.3', + nodemailer: '6.9.10', 'stream-buffers': '3.0.2', - '@types/nodemailer': '6.4.7', + '@types/nodemailer': '6.4.14', + 'nodemailer-openpgp' : '2.2.0' }); Package.onUse(function(api) { diff --git a/packages/es5-shim/package.js b/packages/es5-shim/package.js index 104a2972235..d4983927b21 100644 --- a/packages/es5-shim/package.js +++ b/packages/es5-shim/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "es5-shim", - version: "4.8.1-alpha300.19", + version: '4.8.1-rc300.2', summary: "Shims and polyfills to improve ECMAScript 5 support", documentation: "README.md" }); diff --git a/packages/facebook-config-ui/package.js b/packages/facebook-config-ui/package.js index 6210982d7e0..f3a902d3b67 100644 --- a/packages/facebook-config-ui/package.js +++ b/packages/facebook-config-ui/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Blaze configuration templates for Facebook OAuth.", - version: '1.0.4-alpha300.19', + version: '1.0.4-rc300.2', }); Package.onUse(api => { diff --git a/packages/facebook-oauth/CHANGELOG.md b/packages/facebook-oauth/CHANGELOG.md index b492fe1f090..1716adfc0d5 100644 --- a/packages/facebook-oauth/CHANGELOG.md +++ b/packages/facebook-oauth/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog -## 1.12.0 - UNRELEASED +## 1.11.3 - 2023-08-XX +### Changes +- Updated default version of Facebook GraphAPI to v17 + +## 1.11.2 - 2022-12-07 +### Changes +- Updated internal code to use new Meteor async format from Meteor 2.9 + +## 1.11.1 - 2022-11-14 ### Changes - Updated default version of Facebook GraphAPI to v15 diff --git a/packages/facebook-oauth/facebook-oauth_tests.js b/packages/facebook-oauth/facebook-oauth_tests.js new file mode 100644 index 00000000000..c4b4f4aa6b4 --- /dev/null +++ b/packages/facebook-oauth/facebook-oauth_tests.js @@ -0,0 +1,34 @@ +Tinytest.addAsync( + 'facebook-oauth - run service oauth with mocked flow as expected', + async function (test) { + const oauthMock = mockBehaviours(OAuth, { + _fetch: () => Promise.resolve({ json: () => ({ access_token: 'testToken' })}), + }); + + const service = 'facebook'; + const serviceMockConfig = { service }; + const mockConfig = { clientId: "test", secret: "test", loginStyle: "popup" }; + if (Meteor.isServer) { + await ServiceConfiguration.configurations.upsertAsync(serviceMockConfig, { $set: mockConfig }); + const result = await OAuthTest.registeredServices[service].handleOauthRequest({}); + test.isTrue(!!result?.serviceData, 'should return mocked result'); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['_redirectUri','openSecret','_fetch','openSecret','_fetch'], + 'should run mock oauth behaviors', + ); + } else if (Meteor.isClient) { + ServiceConfiguration.configurations.insert({ ...serviceMockConfig, ...mockConfig }); + Facebook.requestCredential({}); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['_loginStyle', '_redirectUri', '_stateParam', 'launchLogin'], + 'should run mock oauth behaviors', + ); + } + + oauthMock.stop(); + + return Promise.resolve(); + }, +); diff --git a/packages/facebook-oauth/facebook_client.js b/packages/facebook-oauth/facebook_client.js index 582d63bf043..eb05c565b6b 100644 --- a/packages/facebook-oauth/facebook_client.js +++ b/packages/facebook-oauth/facebook_client.js @@ -30,7 +30,7 @@ Facebook.requestCredential = (options, credentialRequestCompleteCallback) => { const loginStyle = OAuth._loginStyle('facebook', config, options); - const API_VERSION = Meteor.settings?.public?.packages?.['facebook-oauth']?.apiVersion || '15.0'; + const API_VERSION = Meteor.settings?.public?.packages?.['facebook-oauth']?.apiVersion || '17.0'; let loginUrl = `https://www.facebook.com/v${API_VERSION}/dialog/oauth?client_id=${config.appId}` + diff --git a/packages/facebook-oauth/facebook_server.js b/packages/facebook-oauth/facebook_server.js index d9c824f27f0..a260f7eeec3 100644 --- a/packages/facebook-oauth/facebook_server.js +++ b/packages/facebook-oauth/facebook_server.js @@ -2,7 +2,7 @@ Facebook = {}; import crypto from 'crypto'; import { Accounts } from 'meteor/accounts-base'; -const API_VERSION = Meteor.settings?.public?.packages?.['facebook-oauth']?.apiVersion || '13.0'; +const API_VERSION = Meteor.settings?.public?.packages?.['facebook-oauth']?.apiVersion || '17.0'; Facebook.handleAuthFromAccessToken = async (accessToken, expiresAt) => { // include basic fields from facebook @@ -73,7 +73,7 @@ function getAbsoluteUrlOptions(query) { * @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({ + const config = await ServiceConfiguration.configurations.findOneAsync({ service: 'facebook', }); if (!config) throw new ServiceConfiguration.ConfigError(); @@ -96,6 +96,7 @@ const getTokenResponse = async (query) => { .then((res) => res.json()) .then(data => { const fbAccessToken = data.access_token; + console.log("-> fbAccessToken", fbAccessToken); const fbExpires = data.expires_in; if (!fbAccessToken) { throw new Error("Failed to complete OAuth handshake with facebook " + @@ -117,7 +118,7 @@ const getTokenResponse = async (query) => { }; const getIdentity = async (accessToken, fields) => { - const config = ServiceConfiguration.configurations.findOne({ + const config = await ServiceConfiguration.configurations.findOneAsync({ service: 'facebook', }); if (!config) throw new ServiceConfiguration.ConfigError(); @@ -145,4 +146,3 @@ const getIdentity = async (accessToken, fields) => { Facebook.retrieveCredential = (credentialToken, credentialSecret) => OAuth.retrieveCredential(credentialToken, credentialSecret); - diff --git a/packages/facebook-oauth/package.js b/packages/facebook-oauth/package.js index 8c3aebc31bf..48a102cba5d 100644 --- a/packages/facebook-oauth/package.js +++ b/packages/facebook-oauth/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Facebook OAuth flow", - version: '1.11.3-alpha300.19' + version: '1.11.3-rc300.2', }); Package.onUse(api => { @@ -15,3 +15,9 @@ Package.onUse(api => { api.export('Facebook'); }); + +Package.onTest(function(api) { + api.use('facebook-oauth'); + api.use(['tinytest', 'ecmascript', 'test-helpers', 'oauth', 'oauth2', 'service-configuration']); + api.addFiles('facebook-oauth_tests.js'); +}); diff --git a/packages/facts-base/package.js b/packages/facts-base/package.js index a176ced7712..7364db5802d 100644 --- a/packages/facts-base/package.js +++ b/packages/facts-base/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Publish internal app statistics", - version: '1.0.2-alpha300.19', + version: '1.0.2-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/facts-ui/package.js b/packages/facts-ui/package.js index eb2db95606c..0b474fd3786 100644 --- a/packages/facts-ui/package.js +++ b/packages/facts-ui/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Display internal app statistics", - version: '1.0.2-alpha300.19', + version: '1.0.2-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/fetch/.npm/package/npm-shrinkwrap.json b/packages/fetch/.npm/package/npm-shrinkwrap.json index 04c61cb774c..ec190125042 100644 --- a/packages/fetch/.npm/package/npm-shrinkwrap.json +++ b/packages/fetch/.npm/package/npm-shrinkwrap.json @@ -2,14 +2,29 @@ "lockfileVersion": 4, "dependencies": { "node-fetch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", - "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + "version": "3.6.17", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", + "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" } } } diff --git a/packages/fetch/package.js b/packages/fetch/package.js index 17e20dab98b..04de682ce5b 100644 --- a/packages/fetch/package.js +++ b/packages/fetch/package.js @@ -1,13 +1,13 @@ Package.describe({ name: "fetch", - version: '0.1.4-alpha300.19', + version: '0.1.5-rc300.2', summary: "Isomorphic modern/legacy/Node polyfill for WHATWG fetch()", documentation: "README.md" }); Npm.depends({ - "node-fetch": "2.3.0", - "whatwg-fetch": "2.0.4" + "node-fetch": "2.6.12", + "whatwg-fetch": "3.6.17" }); Package.onUse(function(api) { diff --git a/packages/fetch/server.js b/packages/fetch/server.js index 3574902554a..69cab03b4bb 100644 --- a/packages/fetch/server.js +++ b/packages/fetch/server.js @@ -1,6 +1,6 @@ const fetch = require("node-fetch"); -exports.fetch = fetch; +exports.fetch = fetch.default; exports.Headers = fetch.Headers; exports.Request = fetch.Request; exports.Response = fetch.Response; diff --git a/packages/force-ssl-common/.npm/package/npm-shrinkwrap.json b/packages/force-ssl-common/.npm/package/npm-shrinkwrap.json index 5d5fb446813..cc006ffa58b 100644 --- a/packages/force-ssl-common/.npm/package/npm-shrinkwrap.json +++ b/packages/force-ssl-common/.npm/package/npm-shrinkwrap.json @@ -27,9 +27,9 @@ "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==" }, "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==" }, "commander": { "version": "2.20.3", @@ -47,15 +47,25 @@ "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==" }, "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==" }, "define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==" }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -107,9 +117,9 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==" }, "glob-base": { "version": "0.3.0", @@ -127,14 +137,14 @@ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==" }, "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==" }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "has-symbols": { "version": "1.0.3", @@ -142,14 +152,14 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==" }, "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==" }, "ip": { "version": "0.3.3", @@ -289,9 +299,9 @@ "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==" }, "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==" }, "object-keys": { "version": "1.1.1", @@ -336,9 +346,9 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==" }, "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==" }, "remove-trailing-separator": { "version": "1.1.0", @@ -356,14 +366,14 @@ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" }, "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==" }, "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==" }, "to-file-path": { "version": "1.0.0", diff --git a/packages/force-ssl-common/package.js b/packages/force-ssl-common/package.js index 66a0231d81e..2f78af83b66 100644 --- a/packages/force-ssl-common/package.js +++ b/packages/force-ssl-common/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Internal force-ssl common code.', - version: '1.1.1-alpha300.19' + version: '1.1.1-rc300.2', }); Npm.depends({ diff --git a/packages/force-ssl/package.js b/packages/force-ssl/package.js index 4b75414a551..5e86c887a1b 100644 --- a/packages/force-ssl/package.js +++ b/packages/force-ssl/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Require this application to use HTTPS", - version: "1.1.1-alpha300.19", + version: '1.1.1-rc300.2', prodOnly: true }); diff --git a/packages/geojson-utils/package.js b/packages/geojson-utils/package.js index 35ab6754a44..6f0ec9aa5c1 100644 --- a/packages/geojson-utils/package.js +++ b/packages/geojson-utils/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'GeoJSON utility functions (from https://github.com/maxogden/geojson-js-utils)', - version: '1.0.12-alpha300.19', + version: '1.0.12-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/github-config-ui/package.js b/packages/github-config-ui/package.js index ced75b6765b..9f6f0aa9369 100644 --- a/packages/github-config-ui/package.js +++ b/packages/github-config-ui/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Blaze configuration templates for GitHub OAuth.', - version: '1.0.3-alpha300.19', + version: '1.0.3-rc300.2', }); Package.onUse(api => { diff --git a/packages/github-oauth/github-oauth_tests.js b/packages/github-oauth/github-oauth_tests.js new file mode 100644 index 00000000000..5b79ef1f7be --- /dev/null +++ b/packages/github-oauth/github-oauth_tests.js @@ -0,0 +1,34 @@ +Tinytest.addAsync( + 'github-oauth - run service oauth with mocked flow as expected', + async function (test) { + const oauthMock = mockBehaviours(OAuth, { + _fetch: () => Promise.resolve({ json: () => ([{ access_token: 'testToken', email: { primary: 'email' } }])}), + }); + + const service = 'github'; + const serviceMockConfig = { service }; + const mockConfig = { clientId: "test", secret: "test", loginStyle: "popup" }; + if (Meteor.isServer) { + await ServiceConfiguration.configurations.upsertAsync(serviceMockConfig, { $set: mockConfig }); + const result = await OAuthTest.registeredServices[service].handleOauthRequest({}); + test.isTrue(!!result?.serviceData, 'should return mocked result'); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['_redirectUri','_fetch','_fetch','_fetch','sealSecret'], + 'should run mock oauth behaviors', + ); + } else if (Meteor.isClient) { + ServiceConfiguration.configurations.insert({ ...serviceMockConfig, ...mockConfig }); + Github.requestCredential({}); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['_loginStyle', '_redirectUri', '_stateParam', 'launchLogin'], + 'should run mock oauth behaviors', + ); + } + + oauthMock.stop(); + + return Promise.resolve(); + }, +); diff --git a/packages/github-oauth/github_server.js b/packages/github-oauth/github_server.js index 7b4f36f5f6d..9ca3576cbe6 100644 --- a/packages/github-oauth/github_server.js +++ b/packages/github-oauth/github_server.js @@ -29,7 +29,7 @@ let userAgent = 'Meteor'; if (Meteor.release) userAgent += `/${Meteor.release}`; const getAccessToken = async (query) => { - const config = ServiceConfiguration.configurations.findOne({ + const config = await ServiceConfiguration.configurations.findOneAsync({ service: 'github' }); if (!config) throw new ServiceConfiguration.ConfigError(); @@ -45,10 +45,10 @@ const getAccessToken = async (query) => { config ) }); - const request = await fetch( + const request = await OAuth._fetch( `https://github.com/login/oauth/access_token?${content.toString()}`, + 'POST', { - method: 'POST', headers: { Accept: 'application/json', 'User-Agent': userAgent @@ -76,8 +76,7 @@ const getAccessToken = async (query) => { const getIdentity = async (accessToken) => { try { - const request = await fetch('https://api.github.com/user', { - method: 'GET', + const request = await OAuth._fetch('https://api.github.com/user', 'GET', { headers: { Accept: 'application/json', 'User-Agent': userAgent, @@ -95,8 +94,7 @@ const getIdentity = async (accessToken) => { const getEmails = async (accessToken) => { try { - const request = await fetch('https://api.github.com/user/emails', { - method: 'GET', + const request = await OAuth._fetch('https://api.github.com/user/emails', 'GET', { headers: { 'User-Agent': userAgent, Accept: 'application/json', diff --git a/packages/github-oauth/package.js b/packages/github-oauth/package.js index c9d11bf1288..f2872df1cd1 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.2-alpha300.19' + version: '1.4.2-rc300.3', }); Package.onUse(api => { @@ -9,6 +9,7 @@ Package.onUse(api => { api.use('oauth', ['client', 'server']); api.use('fetch', 'server'); api.use('random', 'client'); + api.use('accounts-base', ['client', 'server']); api.use('service-configuration', ['client', 'server']); api.addFiles('github_client.js', 'client'); @@ -16,3 +17,9 @@ Package.onUse(api => { api.export('Github'); }); + +Package.onTest(function(api) { + api.use('github-oauth'); + api.use(['tinytest', 'ecmascript', 'test-helpers', 'oauth', 'oauth2', 'service-configuration']); + api.addFiles('github-oauth_tests.js'); +}); diff --git a/packages/google-config-ui/package.js b/packages/google-config-ui/package.js index ec768651615..b631c46cc84 100644 --- a/packages/google-config-ui/package.js +++ b/packages/google-config-ui/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Blaze configuration templates for Google OAuth.', - version: '1.0.4-alpha300.19', + version: '1.0.4-rc300.2', }); Package.onUse(api => { diff --git a/packages/google-oauth/google-oauth_tests.js b/packages/google-oauth/google-oauth_tests.js new file mode 100644 index 00000000000..d5bb686bd63 --- /dev/null +++ b/packages/google-oauth/google-oauth_tests.js @@ -0,0 +1,34 @@ +Tinytest.addAsync( + 'google-oauth - run service oauth with mocked flow as expected', + async function (test) { + const oauthMock = mockBehaviours(OAuth, { + _fetch: () => Promise.resolve({ json: () => ({ access_token: 'testToken', scope: '1 2 3' })}), + }); + + const service = 'google'; + const serviceMockConfig = { service }; + const mockConfig = { clientId: "test", secret: "test", loginStyle: "popup" }; + if (Meteor.isServer) { + await ServiceConfiguration.configurations.upsertAsync(serviceMockConfig, { $set: mockConfig }); + const result = await OAuthTest.registeredServices[service].handleOauthRequest({}); + test.isTrue(!!result?.serviceData, 'should return mocked result'); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['openSecret','_redirectUri','_fetch','_fetch','_fetch'], + 'should run mock oauth behaviors', + ); + } else if (Meteor.isClient) { + ServiceConfiguration.configurations.insert({ ...serviceMockConfig, ...mockConfig }); + Google.requestCredential({}); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['_loginStyle', '_redirectUri', '_stateParam', 'launchLogin'], + 'should run mock oauth behaviors', + ); + } + + oauthMock.stop(); + + return Promise.resolve(); + }, +); diff --git a/packages/google-oauth/google_server.js b/packages/google-oauth/google_server.js index f1a302c754e..16654e7535c 100644 --- a/packages/google-oauth/google_server.js +++ b/packages/google-oauth/google_server.js @@ -125,7 +125,7 @@ Accounts.registerLoginHandler(async (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({ + const config = await ServiceConfiguration.configurations.findOneAsync({ service: 'google', }); if (!config) throw new ServiceConfiguration.ConfigError(); @@ -137,8 +137,7 @@ const getTokens = async (query, callback) => { redirect_uri: OAuth._redirectUri('google', config), grant_type: 'authorization_code', }); - const request = await fetch('https://accounts.google.com/o/oauth2/token', { - method: 'POST', + const request = await OAuth._fetch('https://accounts.google.com/o/oauth2/token', 'POST', { headers: { Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded', @@ -174,10 +173,10 @@ const getIdentity = async (accessToken, callback) => { const content = new URLSearchParams({ access_token: accessToken }); let response; try { - const request = await fetch( + const request = await OAuth._fetch( `https://www.googleapis.com/oauth2/v1/userinfo?${content.toString()}`, + 'GET', { - method: 'GET', headers: { Accept: 'application/json' }, } ); @@ -194,10 +193,10 @@ const getScopes = async (accessToken, callback) => { const content = new URLSearchParams({ access_token: accessToken }); let response; try { - const request = await fetch( + const request = await OAuth._fetch( `https://www.googleapis.com/oauth2/v1/tokeninfo?${content.toString()}`, + 'GET', { - method: 'GET', headers: { Accept: 'application/json' }, } ); diff --git a/packages/google-oauth/package.js b/packages/google-oauth/package.js index f9fae1b6b11..8bae6d91633 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.5-alpha300.19", + version: '1.4.5-rc300.3', }); Cordova.depends({ @@ -23,3 +23,9 @@ Package.onUse(api => { api.export('Google'); }); + +Package.onTest(function(api) { + api.use('google-oauth'); + api.use(['tinytest', 'ecmascript', 'test-helpers', 'oauth', 'oauth2', 'service-configuration']); + api.addFiles('google-oauth_tests.js'); +}); diff --git a/packages/hot-code-push/package.js b/packages/hot-code-push/package.js index f44d1243c38..ccff0bfc193 100644 --- a/packages/hot-code-push/package.js +++ b/packages/hot-code-push/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'hot-code-push', - version: '1.0.5-alpha300.19', + version: '1.0.5-rc300.2', // Brief, one-line summary of the package. summary: 'Update the client in place when new code is available.', // URL to the Git repository containing the source code for this package. diff --git a/packages/hot-module-replacement/package.js b/packages/hot-module-replacement/package.js index 28e1a39a2a2..b405ec40a41 100644 --- a/packages/hot-module-replacement/package.js +++ b/packages/hot-module-replacement/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'hot-module-replacement', - version: '0.5.4-alpha300.19', + version: '0.5.4-rc300.2', summary: 'Update code in development without reloading the page', documentation: 'README.md', debugOnly: true, diff --git a/packages/id-map/package.js b/packages/id-map/package.js index 47c3c74a084..7a782b3a4a9 100644 --- a/packages/id-map/package.js +++ b/packages/id-map/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Dictionary data structure allowing non-string keys", - version: '1.2.0-alpha300.19', + version: '1.2.0-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/insecure/package.js b/packages/insecure/package.js index 8d19ccb0d21..8595eb19f21 100644 --- a/packages/insecure/package.js +++ b/packages/insecure/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "(For prototyping only) Allow all database writes from the client", - version: '1.0.8-alpha300.19' + version: '1.0.8-rc300.2', }); // This package is empty; its presence is detected by mongo-livedata. diff --git a/packages/inter-process-messaging/package.js b/packages/inter-process-messaging/package.js index 3408eff69e2..0de1f3a7217 100644 --- a/packages/inter-process-messaging/package.js +++ b/packages/inter-process-messaging/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "inter-process-messaging", - version: "0.1.2-alpha300.19", + version: '0.1.2-rc300.2', summary: "Support for sending messages from the build process to the server process", documentation: "README.md" }); diff --git a/packages/launch-screen/package.js b/packages/launch-screen/package.js index 4e222a7c8f8..e143859ec68 100644 --- a/packages/launch-screen/package.js +++ b/packages/launch-screen/package.js @@ -6,7 +6,7 @@ Package.describe({ // between such packages and the build tool. name: 'launch-screen', summary: 'Default and customizable launch screen on mobile.', - version: '1.3.1-alpha300.19', + version: '2.0.1-rc300.2', }); Cordova.depends({ diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index e130c91f6aa..6b6c3c52dd1 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.2.1-alpha300.19", + version: '1.2.1-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/logging/.npm/package/npm-shrinkwrap.json b/packages/logging/.npm/package/npm-shrinkwrap.json index 1d64f05bd8c..e2ea56dfaea 100644 --- a/packages/logging/.npm/package/npm-shrinkwrap.json +++ b/packages/logging/.npm/package/npm-shrinkwrap.json @@ -12,9 +12,9 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==" + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" }, "color-convert": { "version": "2.0.1", diff --git a/packages/logging/logging.d.ts b/packages/logging/logging.d.ts new file mode 100644 index 00000000000..5f445e692d8 --- /dev/null +++ b/packages/logging/logging.d.ts @@ -0,0 +1,47 @@ +type LogJSONInput = { + message: string; + app?: string; + [index: string]: string | object | number | undefined; +}; + +type LogInput = string | LogJSONInput; + +type formatInput = { + message: string; + time: Date; + level: 'debug' | 'info' | 'warn' | 'error' + timeInexact?: boolean; + file: string; + line: number; + app?: string; + originApp?: string; + program?: string; + satellite?: string; + stderr?: string | Error; +}; + +export declare function Log(input: LogInput, ...optionalParams: any[]): void; + +export declare namespace Log { + var outputFormat: 'json' | 'colored-text'; + function _intercept(count: number): void; + function _suppress(count: number): void; + function _intercepted(): string[]; + function _getCallerDetails(): { line: number; file: string }; + function parse(line: object | string): object + function format(object: formatInput, options: { color: true }): object | string; + function objFromText( + line: string, + override: object + ): { + message: string + level: 'info' + time: Date + timeInexact: true + } + + function debug(input: LogInput, ...optionalParams: any[]): void; + function info(input: LogInput, ...optionalParams: any[]): void; + function warn(input: LogInput, ...optionalParams: any[]): void; + function error(input: LogInput, ...optionalParams: any[]): void; +} diff --git a/packages/logging/logging_browser.js b/packages/logging/logging_browser.js index e7968b72d9c..028ee184b1c 100644 --- a/packages/logging/logging_browser.js +++ b/packages/logging/logging_browser.js @@ -1,4 +1,4 @@ Formatter = {}; Formatter.prettify = function(line, color){ return line; -} +}; diff --git a/packages/logging/logging_server.js b/packages/logging/logging_server.js index 1bd0ce3f680..dc01ce0ceb2 100644 --- a/packages/logging/logging_server.js +++ b/packages/logging/logging_server.js @@ -2,4 +2,4 @@ Formatter = {}; Formatter.prettify = function(line, color){ if(!color) return line; return require("chalk")[color](line); -} +}; diff --git a/packages/logging/package.js b/packages/logging/package.js index 9ab46d920d2..63a368037b1 100644 --- a/packages/logging/package.js +++ b/packages/logging/package.js @@ -1,10 +1,10 @@ Package.describe({ summary: 'Logging facility.', - version: '1.3.3-alpha300.19', + version: '1.3.5-rc300.2', }); Npm.depends({ - 'chalk': '4.1.1', + 'chalk': '4.1.2', '@babel/runtime': '7.20.7' }); @@ -18,11 +18,12 @@ Package.onUse(function (api) { // here due to this package's dependency on // `String.prototype.padRight` which is polyfilled only in // `ecmascript-runtime-client@0.6.2` or newer. - api.use(['ejson', 'ecmascript', 'ecmascript-runtime-client']); + api.use(['ejson', 'ecmascript', 'typescript', 'ecmascript-runtime-client']); api.mainModule('logging.js'); - api.addFiles('logging_server.js', 'server') - api.addFiles('logging_browser.js', 'client') + api.addFiles('logging_server.js', 'server'); + api.addFiles('logging_browser.js', 'client'); api.mainModule('logging_cordova.js', 'web.cordova'); + api.addAssets('logging.d.ts', 'server'); }); Package.onTest(function (api) { diff --git a/packages/logic-solver/.npm/package/.gitignore b/packages/logic-solver/.npm/package/.gitignore new file mode 100644 index 00000000000..3c3629e647f --- /dev/null +++ b/packages/logic-solver/.npm/package/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/logic-solver/.npm/package/README b/packages/logic-solver/.npm/package/README new file mode 100644 index 00000000000..3d492553a43 --- /dev/null +++ b/packages/logic-solver/.npm/package/README @@ -0,0 +1,7 @@ +This directory and the files immediately inside it are automatically generated +when you change this package's NPM dependencies. Commit the files in this +directory (npm-shrinkwrap.json, .gitignore, and this README) to source control +so that others run the same versions of sub-dependencies. + +You should NOT check in the node_modules directory that Meteor automatically +creates; if you are using git, the .gitignore file tells git to ignore it. diff --git a/packages/logic-solver/.npm/package/npm-shrinkwrap.json b/packages/logic-solver/.npm/package/npm-shrinkwrap.json new file mode 100644 index 00000000000..51c79d70fab --- /dev/null +++ b/packages/logic-solver/.npm/package/npm-shrinkwrap.json @@ -0,0 +1,10 @@ +{ + "lockfileVersion": 4, + "dependencies": { + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==" + } + } +} diff --git a/packages/logic-solver/logic.js b/packages/logic-solver/logic.js index 804d4e3c807..e83e46131dc 100644 --- a/packages/logic-solver/logic.js +++ b/packages/logic-solver/logic.js @@ -1,3 +1,5 @@ +var has = require('lodash.has'); + Logic._MiniSat = MiniSat; // Expose for testing and poking around // import the private testers from types.js @@ -92,7 +94,7 @@ Logic._defineFormula = function (constructor, typeName, methods) { constructor.prototype = new Logic.Formula(); constructor.prototype.type = typeName; if (methods) { - _.extend(constructor.prototype, methods); + Object.assign(constructor.prototype, methods); } }; @@ -121,16 +123,16 @@ Logic.Formula.prototype.guid = function () { // Solver data structure, which is the final result of formula // generation and mapping variable names to numbers, before passing // the clauses to MiniSat. -Logic.Clause = function (/*formulaOrArray, ...*/) { - var terms = _.flatten(arguments); +Logic.Clause = function () { + var terms = Array.from(arguments).flat(Infinity); if (assert) assert(terms, isArrayWhere(Logic.isNumTerm)); this.terms = terms; // immutable [NumTerm] }; // Returns a new Clause with the extra term or terms appended -Logic.Clause.prototype.append = function (/*formulaOrArray, ...*/) { - return new Logic.Clause(this.terms.concat(_.flatten(arguments))); +Logic.Clause.prototype.append = function () { + return new Logic.Clause(this.terms.concat(Array.from(arguments).flat(Infinity))); }; var FormulaInfo = function () { @@ -210,12 +212,12 @@ Logic.Termifier = function (solver) { // `$or1` to make the Clause. When the Clause is actually used, it // will trigger generation of the clauses that relate `$or1` to the // operands of the OrFormula. -Logic.Termifier.prototype.clause = function (/*args*/) { +Logic.Termifier.prototype.clause = function () { var self = this; - var formulas = _.flatten(arguments); + var formulas = Array.from(arguments).flat(Infinity); if (assert) assert(formulas, isArrayWhere(isFormulaOrTerm)); - return new Logic.Clause(_.map(formulas, function (f) { + return new Logic.Clause(formulas.map(function (f) { return self.term(f); })); }; @@ -283,7 +285,7 @@ Logic.Solver = function () { // Setting "_createInternals" to true grants the ability to create $ variables. Logic.Solver.prototype.getVarNum = function (vname, noCreate, _createInternals) { var key = ' '+vname; - if (_.has(this._name2num, key)) { + if (has(this._name2num, key)) { return this._name2num[key]; } else if (noCreate) { return 0; @@ -425,7 +427,7 @@ Logic.Solver.prototype._useFormulaTerm = function (t, _addClausesOverride) { if (assert) assert(t, Logic.isNumTerm); var v = (t < 0) ? -t : t; - if (! _.has(self._ungeneratedFormulas, v)) { + if (!has(self._ungeneratedFormulas, v)) { return; } @@ -501,24 +503,23 @@ Logic.Solver.prototype._addClauses = function (array, _extraTerms, _useTermOverride) { if (assert) assert(array, isArrayWhere(Logic.isClause)); var self = this; - _.each(array, function (cls) { + array.forEach(function (cls) { self._addClause(cls, _extraTerms, _useTermOverride); }); }; -Logic.Solver.prototype.require = function (/*formulaOrArray, ...*/) { - this._requireForbidImpl(true, _.flatten(arguments)); +Logic.Solver.prototype.require = function () { + this._requireForbidImpl(true, Array.from(arguments).flat(Infinity)); }; -Logic.Solver.prototype.forbid = function (/*formulaOrArray, ...*/) { - this._requireForbidImpl(false, _.flatten(arguments)); +Logic.Solver.prototype.forbid = function () { + this._requireForbidImpl(false, Array.from(arguments).flat(Infinity)); }; Logic.Solver.prototype._requireForbidImpl = function (isRequire, formulas) { var self = this; if (assert) assert(formulas, isArrayWhere(isFormulaOrTerm)); - - _.each(formulas, function (f) { + formulas.forEach(function (f) { if (f instanceof Logic.NotFormula) { self._requireForbidImpl(!isRequire, [f.operand]); } else if (f instanceof Logic.Formula) { @@ -557,7 +558,7 @@ Logic.Solver.prototype._generateFormula = function (isTrue, formula, _termifier) } else { var ret = formula.generateClauses(isTrue, _termifier || self._termifier); - return _.isArray(ret) ? ret : [ret]; + return Array.isArray(ret) ? ret : [ret]; } } else { // Term var t = self.toNumTerm(formula); @@ -575,7 +576,9 @@ Logic.Solver.prototype._generateFormula = function (isTrue, formula, _termifier) // Get clause data as an array of arrays of integers, // for testing and debugging purposes. Logic.Solver.prototype._clauseData = function () { - var clauses = _.pluck(this.clauses, 'terms'); + var clauses = this.clauses.map(function(clause){ + return clause.terms; + }); if (! this._T_used) { clauses.splice(1, 1); } @@ -592,8 +595,8 @@ Logic.Solver.prototype._clauseData = function () { Logic.Solver.prototype._clauseStrings = function () { var self = this; var clauseData = self._clauseData(); - return _.map(clauseData, function (clause) { - return _.map(clause, function (nterm) { + return clauseData.map(function (clause) { + return clause.map(function (nterm) { var str = self.toNameTerm(nterm); if (/\s/.test(str)) { // write name in quotes for readability. we don't bother @@ -628,9 +631,9 @@ Logic.Solver.prototype._getFormulaInfo = function (formula, _noCreate) { Logic.Solver.prototype._formulaToTerm = function (formula) { var self = this; - if (_.isArray(formula)) { + if (Array.isArray(formula)) { if (assert) assert(formula, isArrayWhere(isFormulaOrTerm)); - return _.map(formula, _.bind(self._formulaToTerm, self)); + return formula.map(self._formulaToTerm.bind(self)); } else { if (assert) assert(formula, isFormulaOrTerm); } @@ -663,15 +666,15 @@ Logic.Solver.prototype._formulaToTerm = function (formula) { } }; -Logic.or = function (/*formulaOrArray, ...*/) { - var args = _.flatten(arguments); - if (args.length === 0) { +Logic.or = function () { + var operands = Array.from(arguments).flat(Infinity); + if (operands.length === 0) { return Logic.FALSE; - } else if (args.length === 1) { - if (assert) assert(args[0], isFormulaOrTerm); - return args[0]; + } else if (operands.length === 1) { + if (assert) assert(operands[0], isFormulaOrTerm); + return operands[0]; } else { - return new Logic.OrFormula(args); + return new Logic.OrFormula(operands); } }; @@ -688,7 +691,7 @@ Logic._defineFormula(Logic.OrFormula, 'or', { } else { // eg -A; -B; -C var result = []; - _.each(this.operands, function (o) { + this.operands.forEach(function (o) { result.push.apply(result, t.generate(false, o)); }); return result; @@ -705,15 +708,15 @@ Logic.NotFormula = function (operand) { // simplified away by the solver itself. Logic._defineFormula(Logic.NotFormula, 'not'); -Logic.and = function (/*formulaOrArray, ...*/) { - var args = _.flatten(arguments); - if (args.length === 0) { +Logic.and = function () { + var flattenedArgs = Array.from(arguments).flat(Infinity); + if (flattenedArgs.length === 0) { return Logic.TRUE; - } else if (args.length === 1) { - if (assert) assert(args[0], isFormulaOrTerm); - return args[0]; + } else if (flattenedArgs.length === 1) { + if (assert) assert(flattenedArgs[0], isFormulaOrTerm); + return flattenedArgs[0]; } else { - return new Logic.AndFormula(args); + return new Logic.AndFormula(flattenedArgs); } }; @@ -727,13 +730,13 @@ Logic._defineFormula(Logic.AndFormula, 'and', { if (isTrue) { // eg A; B; C var result = []; - _.each(this.operands, function (o) { + this.operands.forEach(function (o) { result.push.apply(result, t.generate(true, o)); }); return result; } else { // eg -A v -B v -C - return t.clause(_.map(this.operands, Logic.not)); + return t.clause(this.operands.map(Logic.not)); } } }); @@ -748,15 +751,15 @@ var group = function (array, N) { return ret; }; -Logic.xor = function (/*formulaOrArray, ...*/) { - var args = _.flatten(arguments); - if (args.length === 0) { +Logic.xor = function () { + var flattenedArgs = Array.from(arguments).flat(Infinity); + if (flattenedArgs.length === 0) { return Logic.FALSE; - } else if (args.length === 1) { - if (assert) assert(args[0], isFormulaOrTerm); - return args[0]; + } else if (flattenedArgs.length === 1) { + if (assert) assert(flattenedArgs[0], isFormulaOrTerm); + return flattenedArgs[0]; } else { - return new Logic.XorFormula(args); + return new Logic.XorFormula(flattenedArgs); } }; @@ -773,7 +776,7 @@ Logic._defineFormula(Logic.XorFormula, 'xor', { return t.generate( isTrue, Logic.xor( - _.map(group(this.operands, 3), function (group) { + group(this.operands, 3).map(function (group) { return Logic.xor(group); }))); } else if (isTrue) { // args.length <= 3 @@ -812,12 +815,12 @@ Logic._defineFormula(Logic.XorFormula, 'xor', { } }); -Logic.atMostOne = function (/*formulaOrArray, ...*/) { - var args = _.flatten(arguments); - if (args.length <= 1) { +Logic.atMostOne = function () { + var flattenedArgs = Array.from(arguments).flat(Infinity); + if (flattenedArgs.length <= 1) { return Logic.TRUE; } else { - return new Logic.AtMostOneFormula(args); + return new Logic.AtMostOneFormula(flattenedArgs); } }; @@ -860,13 +863,13 @@ Logic._defineFormula(Logic.AtMostOneFormula, 'atMostOne', { // and each group has at most one "true". Formula generation // automatically generates the right implications. var groups = group(args, 3); - var ors = _.map(groups, function (g) { return Logic.or(g); }); + var ors = groups.map(function (g) { return Logic.or(g); }); if (groups[groups.length - 1].length < 2) { // Remove final group of length 1 so we don't generate // no-op clauses of one sort or another groups.pop(); } - var atMostOnes = _.map(groups, function (g) { + var atMostOnes = groups.map(function (g) { return Logic.atMostOne(g); }); return t.generate(isTrue, Logic.and(Logic.atMostOne(ors), atMostOnes)); @@ -912,15 +915,15 @@ Logic._defineFormula(Logic.EquivFormula, 'equiv', { } }); -Logic.exactlyOne = function (/*formulaOrArray, ...*/) { - var args = _.flatten(arguments); - if (args.length === 0) { +Logic.exactlyOne = function () { + var flattenedArgs = Array.from(arguments).flat(Infinity); + if (flattenedArgs.length === 0) { return Logic.FALSE; - } else if (args.length === 1) { - if (assert) assert(args[0], isFormulaOrTerm); - return args[0]; + } else if (flattenedArgs.length === 1) { + if (assert) assert(arguments[0], isFormulaOrTerm); + return flattenedArgs[0]; } else { - return new Logic.ExactlyOneFormula(args); + return new Logic.ExactlyOneFormula(flattenedArgs); } }; @@ -999,7 +1002,7 @@ var genLTE = function (bits1, bits2, t, notEqual) { // now B.length >= A.length // Let xors[i] be (A[i] xor B[i]), or just // B[i] if A is too short. - var xors = _.map(B, function (b, i) { + var xors = B.map(function (b, i) { if (i < A.length) { return Logic.xor(A[i], b); } else { @@ -1203,12 +1206,15 @@ var binaryWeightedSum = function (varsByWeight) { if (assert) assert(varsByWeight, isArrayWhere(isArrayWhere(isFormulaOrTerm))); // initialize buckets to a two-level clone of varsByWeight - var buckets = _.map(varsByWeight, _.clone); + var buckets = varsByWeight.map(function(vars) { + return Array.from(vars).flat() + }); + var lowestWeight = 0; // index of the first non-empty array var output = []; while (lowestWeight < buckets.length) { var bucket = buckets[lowestWeight]; - if (! bucket.length) { + if (!bucket.length) { output.push(Logic.FALSE); lowestWeight++; } else if (bucket.length === 1) { @@ -1270,11 +1276,11 @@ Logic.weightedSum = function (formulas, weights) { } if (typeof weights === 'number') { - weights = _.map(formulas, function () { return weights; }); + weights = formulas.map(function () { return weights; }); } var binaryWeighted = []; - _.each(formulas, function (f, i) { + formulas.forEach(function (f, i) { var w = weights[i]; var whichBit = 0; while (w) { @@ -1289,14 +1295,14 @@ Logic.weightedSum = function (formulas, weights) { return new Logic.Bits(binaryWeightedSum(binaryWeighted)); }; -Logic.sum = function (/*formulaOrBitsOrArray, ...*/) { - var things = _.flatten(arguments); +Logic.sum = function () { + var things = Array.from(arguments).flat(Infinity); if (assert) assert(things, isArrayWhere(isFormulaOrTermOrBits)); var binaryWeighted = []; - _.each(things, function (x) { + things.forEach(function (x) { if (x instanceof Logic.Bits) { - _.each(x.bits, function (b, i) { + x.bits.forEach(function (b, i) { pushToNth(binaryWeighted, i, b); }); } else { @@ -1398,7 +1404,7 @@ Logic.Solution = function (_solver, _assignment) { // save a snapshot of which formulas have variables designated // for them, but where we haven't generated clauses that constrain // those variables in both the positive and the negative direction. - self._ungeneratedFormulas = _.clone(_solver._ungeneratedFormulas); + self._ungeneratedFormulas = Object.assign({}, _solver._ungeneratedFormulas); self._formulaValueCache = {}; self._termifier = new Logic.Termifier(self._solver); @@ -1487,7 +1493,7 @@ Logic.Solution.prototype.evaluate = function (formulaOrBits) { if (formulaOrBits instanceof Logic.Bits) { // Evaluate to an integer var ret = 0; - _.each(formulaOrBits.bits, function (f, i) { + formulaOrBits.bits.forEach(function (f, i) { if (self.evaluate(f)) { ret += 1 << i; } @@ -1509,7 +1515,7 @@ Logic.Solution.prototype.evaluate = function (formulaOrBits) { var value; var info = solver._getFormulaInfo(formula, true); if (info && info.varNum && info.varNum < assignment.length && - ! _.has(self._ungeneratedFormulas, info.varNum)) { + !has(self._ungeneratedFormulas, info.varNum)) { // as an optimization, read the value of the formula directly // from a variable if the formula's clauses were completely // generated at the time of solving. (We must be careful, @@ -1520,8 +1526,8 @@ Logic.Solution.prototype.evaluate = function (formulaOrBits) { value = assignment[info.varNum]; } else { var clauses = solver._generateFormula(true, formula, self._termifier); - var value = _.all(clauses, function (cls) { - return _.any(cls.terms, function (t) { + var value = clauses.every(function (cls) { + return cls.terms.some(function (t) { return self.evaluate(t); }); }); diff --git a/packages/logic-solver/logic_tests.js b/packages/logic-solver/logic_tests.js index b9c66b09233..7a4452996f4 100644 --- a/packages/logic-solver/logic_tests.js +++ b/packages/logic-solver/logic_tests.js @@ -1299,13 +1299,13 @@ Tinytest.add("logic-solver - eight queens", function (test) { Logic._disablingTypeChecks(function () { var solver = new Logic.Solver; - var nums = _.range(1, 9); // 1..8 - _.each(nums, function (x) { + var nums = Array.from({length: 8}, (_, i) => i + 1); // 1..8 + nums.forEach(function (x) { // one per row x, one per column x - solver.require(Logic.exactlyOne(_.map(nums, function (y) { + solver.require(Logic.exactlyOne(nums.map(function (y) { return boardSquare(x, y); }))); - solver.require(Logic.exactlyOne(_.map(nums, function (y) { + solver.require(Logic.exactlyOne(nums.map(function (y) { return boardSquare(y, x); }))); }); @@ -1336,7 +1336,7 @@ Tinytest.add("logic-solver - eight queens", function (test) { test.equal(solution.length, 8); test.isTrue(/^([1-8],[1-8] ){7}[1-8],[1-8]$/.test(solution.join(' '))); var assertEightDifferent = function (transformFunc) { - test.equal(_.uniq(_.map(solution, transformFunc)).length, 8); + test.equal([...new Set(solution.map(transformFunc))].length, 8); }; // queens occur in eight different rows, eight different columns assertEightDifferent(function (queen) { return queen.charAt(0); }); @@ -1414,7 +1414,7 @@ Tinytest.add("logic-solver - Sudoku", function (test) { } var solution = solver.solve().getTrueVars(); - var solutionString = _.map(solution, function (v) { + var solutionString = solution.map(function (v) { return String(Number(v.slice(-1)) + 1); }).join('').match(/.{9}/g).join('\n'); test.equal(solutionString, [ @@ -1508,8 +1508,8 @@ Tinytest.addAsync("logic-solver - toy packages", async function (test) { var solver = new Logic.Solver(); - _.each(allPackageVersions, function (versions, pkg) { - versions = _.map(versions, function (v) { + Object.entries(allPackageVersions).forEach(function ([pkg, versions]) { + versions = versions.map(function (v) { return pkg + "@" + v; }); // e.g. atMostOne(["foo@1.0.0", "foo@1.0.1", "foo@2.0.0"]) @@ -1518,16 +1518,16 @@ Tinytest.addAsync("logic-solver - toy packages", async function (test) { solver.require(Logic.equiv(pkg, Logic.or(versions))); }); - _.each(dependencies, function (depMap, packageVersion) { - _.each(depMap, function (compatibleVersions, package2) { + Object.entries(dependencies).forEach(function ([packageVersion, depMap]) { + Object.entries(depMap).forEach(function ([package2, compatibleVersions]) { // e.g. implies("bar@1.2.4", "foo") solver.require(Logic.implies(packageVersion, package2)); // Now ban all incompatible versions of package2 if // we select this packageVersion. // NOTE: This is not the best way to express constraints. It's // not what we do in the real package constraint solver. - _.each(allPackageVersions[package2], function (v) { - if (! _.contains(compatibleVersions, v)) { + allPackageVersions[package2].forEach(function (v) { + if (! compatibleVersions.includes(v)) { solver.require(Logic.implies(packageVersion, Logic.not(package2 + "@" + v))); } @@ -1544,7 +1544,7 @@ Tinytest.addAsync("logic-solver - toy packages", async function (test) { var terms = []; var weightVectors = []; var vectorLength = null; - _.each(costVectorMap, function (vector, key) { + Object.entries(costVectorMap).forEach(function ([key, vector]) { terms.push(key); weightVectors.push(vector); if (vectorLength === null) { @@ -1558,7 +1558,9 @@ Tinytest.addAsync("logic-solver - toy packages", async function (test) { }); for (var i = 0; i < vectorLength; i++) { - var weights = _.pluck(weightVectors, i); + var weights = weightVectors.map(function(vector){ + return vector[i] + }); solution = await solver.minimizeWeightedSum(solution, terms, weights); } @@ -1572,7 +1574,7 @@ Tinytest.addAsync("logic-solver - toy packages", async function (test) { return solution; // null } else { // only return variables like "foo@1.0.0", not "foo" - return _.filter(solution.getTrueVars(), function (v) { + return solution.getTrueVars().filter(function (v) { return v.indexOf('@') >= 0; }); } @@ -1704,7 +1706,7 @@ Tinytest.addAsync("logic-solver - maximize", async function (test) { // as possible to 19 without going over. var costWeights = [2, 5, 10, 11, 15]; // name variables after the weights - var costTerms = _.map(costWeights, function (w) { + var costTerms = costWeights.map(function (w) { return "#"+w; }); var ws = Logic.weightedSum(costTerms, costWeights); diff --git a/packages/logic-solver/minisat_wrapper.js b/packages/logic-solver/minisat_wrapper.js index 18a8baead0f..497e7fe5636 100644 --- a/packages/logic-solver/minisat_wrapper.js +++ b/packages/logic-solver/minisat_wrapper.js @@ -67,7 +67,7 @@ MiniSat.prototype.addClause = function (terms) { this._clauses.push(terms); return this._native.savingStack(function (native, C) { var termsPtr = C.allocate((terms.length+1)*4, 'i32', C.ALLOC_STACK); - _.each(terms, function (t, i) { + terms.forEach(function (t, i) { C.setValue(termsPtr + i*4, t, 'i32'); }); C.setValue(termsPtr + terms.length*4, 0, 'i32'); // 0-terminate diff --git a/packages/logic-solver/package.js b/packages/logic-solver/package.js index a565c815ff5..f0048fb434e 100644 --- a/packages/logic-solver/package.js +++ b/packages/logic-solver/package.js @@ -1,11 +1,15 @@ Package.describe({ summary: "General satisfiability solver for logic problems", - version: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', +}); + +Npm.depends({ + 'lodash.has': '4.5.2' }); Package.onUse(function (api) { api.export('Logic'); - api.use('underscore'); + api.use('ecmascript'); api.addFiles(['minisat.js', 'minisat_wrapper.js', 'types.js', @@ -14,7 +18,7 @@ Package.onUse(function (api) { }); Package.onTest(function (api) { - api.use(['tinytest', 'check', 'underscore']); + api.use(['tinytest', 'check']); api.use('logic-solver'); // logic-solver is totally meant for the client too, but not old diff --git a/packages/logic-solver/types.js b/packages/logic-solver/types.js index 5d993bbbc28..748281c108e 100644 --- a/packages/logic-solver/types.js +++ b/packages/logic-solver/types.js @@ -84,7 +84,7 @@ Logic._isArrayWhere = function (tester) { description += ' of ' + tester.description; } return withDescription(description, function (x) { - if (! _.isArray(x)) { + if (! Array.isArray(x)) { return false; } else { for (var i = 0; i < x.length; i++) { diff --git a/packages/meetup-config-ui/package.js b/packages/meetup-config-ui/package.js index 9e0c1456db6..5f010c578d9 100644 --- a/packages/meetup-config-ui/package.js +++ b/packages/meetup-config-ui/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Blaze configuration templates for the Meetup OAuth flow.', - version: '1.0.3-alpha300.19', + version: '1.0.3-rc300.2', }); Package.onUse(api => { diff --git a/packages/meetup-oauth/meetup-oauth_tests.js b/packages/meetup-oauth/meetup-oauth_tests.js new file mode 100644 index 00000000000..a4677598497 --- /dev/null +++ b/packages/meetup-oauth/meetup-oauth_tests.js @@ -0,0 +1,34 @@ +Tinytest.addAsync( + 'meetup-oauth - run service oauth with mocked flow as expected', + async function (test) { + const oauthMock = mockBehaviours(OAuth, { + _fetch: () => Promise.resolve({ json: () => ({ access_token: 'testToken' })}), + }); + + const service = 'meetup'; + const serviceMockConfig = { service }; + const mockConfig = { clientId: "test", secret: "test", loginStyle: "popup" }; + if (Meteor.isServer) { + await ServiceConfiguration.configurations.upsertAsync(serviceMockConfig, { $set: mockConfig }); + const result = await OAuthTest.registeredServices[service].handleOauthRequest({}); + test.isTrue(!!result?.serviceData, 'should return mocked result'); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['openSecret','_redirectUri','_addValuesToQueryParams','_fetch','_addValuesToQueryParams','_fetch'], + 'should run mock oauth behaviors', + ); + } else if (Meteor.isClient) { + ServiceConfiguration.configurations.insert({ ...serviceMockConfig, ...mockConfig }); + Meetup.requestCredential({}); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['_loginStyle', '_redirectUri', '_stateParam', 'launchLogin'], + 'should run mock oauth behaviors', + ); + } + + oauthMock.stop(); + + return Promise.resolve(); + }, +); diff --git a/packages/meetup-oauth/meetup_server.js b/packages/meetup-oauth/meetup_server.js index bfc465c7b31..a4e92d1a23d 100644 --- a/packages/meetup-oauth/meetup_server.js +++ b/packages/meetup-oauth/meetup_server.js @@ -34,7 +34,7 @@ OAuth.registerService('meetup', 2, null, async query => { }); const getAccessToken = async query => { - const config = ServiceConfiguration.configurations.findOne({service: 'meetup'}); + const config = await ServiceConfiguration.configurations.findOneAsync({service: 'meetup'}); if (!config) throw new ServiceConfiguration.ConfigError(); diff --git a/packages/meetup-oauth/package.js b/packages/meetup-oauth/package.js index 9522c1016a4..5f429bded99 100644 --- a/packages/meetup-oauth/package.js +++ b/packages/meetup-oauth/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Meetup OAuth flow', - version: '1.1.3-alpha300.19' + version: '1.1.3-rc300.2', }); Package.onUse(api => { @@ -15,3 +15,9 @@ Package.onUse(api => { api.export('Meetup'); }); + +Package.onTest(function(api) { + api.use('meetup-oauth'); + api.use(['tinytest', 'ecmascript', 'test-helpers', 'oauth', 'oauth2', 'service-configuration']); + api.addFiles('meetup-oauth_tests.js'); +}); diff --git a/packages/meteor-base/package.js b/packages/meteor-base/package.js index 4205c18f213..3960753c6b1 100644 --- a/packages/meteor-base/package.js +++ b/packages/meteor-base/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'meteor-base', - version: '1.5.2-alpha300.19', + version: '1.5.2-rc300.2', // Brief, one-line summary of the package. summary: 'Packages that every Meteor app needs', // By default, Meteor will default to using README.md for documentation. diff --git a/packages/meteor-developer-config-ui/package.js b/packages/meteor-developer-config-ui/package.js index f7d194a5766..4fef578a754 100644 --- a/packages/meteor-developer-config-ui/package.js +++ b/packages/meteor-developer-config-ui/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Blaze configuration templates for the Meteor developer accounts OAuth.', - version: '1.0.3-alpha300.19', + version: '1.0.3-rc300.2', }); Package.onUse(api => { diff --git a/packages/meteor-developer-oauth/meteor-developer-oauth_tests.js b/packages/meteor-developer-oauth/meteor-developer-oauth_tests.js new file mode 100644 index 00000000000..8a19ceb117e --- /dev/null +++ b/packages/meteor-developer-oauth/meteor-developer-oauth_tests.js @@ -0,0 +1,34 @@ +Tinytest.addAsync( + 'meteor-developer-oauth - run service oauth with mocked flow as expected', + async function (test) { + const oauthMock = mockBehaviours(OAuth, { + _fetch: () => Promise.resolve({ json: () => ({ access_token: 'testToken' })}), + }); + + const service = 'meteor-developer'; + const serviceMockConfig = { service }; + const mockConfig = { clientId: "test", secret: "test", loginStyle: "popup" }; + if (Meteor.isServer) { + await ServiceConfiguration.configurations.upsertAsync(serviceMockConfig, { $set: mockConfig }); + const result = await OAuthTest.registeredServices[service].handleOauthRequest({}); + test.isTrue(!!result?.serviceData, 'should return mocked result'); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['openSecret','_redirectUri','_addValuesToQueryParams','_fetch','_fetch','sealSecret'], + 'should run mock oauth behaviors', + ); + } else if (Meteor.isClient) { + ServiceConfiguration.configurations.insert({ ...serviceMockConfig, ...mockConfig }); + MeteorDeveloperAccounts.requestCredential({}); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['_loginStyle','_stateParam','_redirectUri','launchLogin'], + 'should run mock oauth behaviors', + ); + } + + oauthMock.stop(); + + return Promise.resolve(); + }, +); diff --git a/packages/meteor-developer-oauth/meteor_developer_server.js b/packages/meteor-developer-oauth/meteor_developer_server.js index 57dd193ae10..8a1da154baa 100644 --- a/packages/meteor-developer-oauth/meteor_developer_server.js +++ b/packages/meteor-developer-oauth/meteor_developer_server.js @@ -29,7 +29,7 @@ OAuth.registerService("meteor-developer", 2, null, async query => { // - refreshToken, if this is the first authorization request and we got a // refresh token from the server const getTokens = async (query) => { - const config = ServiceConfiguration.configurations.findOne({ + const config = await ServiceConfiguration.configurations.findOneAsync({ service: 'meteor-developer', }); if (!config) { diff --git a/packages/meteor-developer-oauth/package.js b/packages/meteor-developer-oauth/package.js index a5da72daf67..706dd690755 100644 --- a/packages/meteor-developer-oauth/package.js +++ b/packages/meteor-developer-oauth/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Meteor developer accounts OAuth flow', - version: '1.3.3-alpha300.19' + version: '1.3.3-rc300.2', }); Package.onUse(api => { @@ -15,3 +15,9 @@ Package.onUse(api => { api.export('MeteorDeveloperAccounts'); }); + +Package.onTest(function(api) { + api.use('meteor-developer-oauth'); + api.use(['tinytest', 'ecmascript', 'test-helpers', 'oauth', 'oauth2', 'service-configuration']); + api.addFiles('meteor-developer-oauth_tests.js'); +}); diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index 98695bddf11..b04e1ee791c 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: '3.0.0-alpha.19', + version: '3.0.0-rc.2', }); Package.includeTool(); diff --git a/packages/meteor/asl-helpers-client.js b/packages/meteor/asl-helpers-client.js index 6b43ec2336c..5c3cba14af6 100644 --- a/packages/meteor/asl-helpers-client.js +++ b/packages/meteor/asl-helpers-client.js @@ -11,3 +11,7 @@ Meteor.isFibersDisabled = true; Meteor._isPromise = function (r) { return r && typeof r.then === "function"; }; + +Meteor._runFresh = function (fn) { + return fn(); +}; diff --git a/packages/meteor/asl-helpers.js b/packages/meteor/asl-helpers.js index 440a5416856..6cd110c7ea3 100644 --- a/packages/meteor/asl-helpers.js +++ b/packages/meteor/asl-helpers.js @@ -1,29 +1,66 @@ -const getAslStore = () => (Meteor.isServer && global?.asyncLocalStorage?.getStore()) || {}; -const getValueFromAslStore = key => getAslStore()[key]; -const updateAslStore = (key, value) => getAslStore()[key] = value; +// In Meteor versions with fibers, __meteor_bootstrap__.isFibersDisabled +// is always undefined. +Meteor.isFibersDisabled = typeof __meteor_bootstrap__ === 'object' && + __meteor_bootstrap__.isFibersDisabled !== undefined; +Meteor._isFibersEnabled = !Meteor.isFibersDisabled; +function getAsl() { + if (!Meteor.isFibersDisabled) { + throw new Error('Can not use async hooks when fibers are enabled'); + } -// From 3.0 onwards, fibers is disabled by default. -Meteor.isFibersDisabled = __meteor_bootstrap__ && __meteor_bootstrap__.isFibersDisabled !== false; -Meteor._isFibersEnabled = !Meteor.isFibersDisabled; + if (!global.asyncLocalStorage) { + // lazily create asyncLocalStorage since this might run in older Meteor + // versions that are incompatible with async hooks + var AsyncLocalStorage = Npm.require('async_hooks').AsyncLocalStorage; + global.asyncLocalStorage = new AsyncLocalStorage(); + } + + return global.asyncLocalStorage; +} +function getAslStore() { + if (!Meteor.isServer) { + return {}; + } + + var asyncLocalStorage = getAsl(); + return asyncLocalStorage.getStore() || {}; +} + +function getValueFromAslStore(key) { + return getAslStore()[key]; +} + +function updateAslStore(key, value) { + return getAslStore()[key] = value; +} + +function runFresh(fn) { + var asyncLocalStorage = getAsl(); + return asyncLocalStorage.run({}, fn); +} + +Meteor._getAsl = getAsl; Meteor._getAslStore = getAslStore; Meteor._getValueFromAslStore = getValueFromAslStore; Meteor._updateAslStore = updateAslStore; -if (Meteor.isServer && !global.asyncLocalStorage) { - const { AsyncLocalStorage } = Npm.require('async_hooks'); - global.asyncLocalStorage = new AsyncLocalStorage(); -} +Meteor._runFresh = runFresh; + +Meteor._runAsync = function (fn, ctx, store) { + if (store === undefined) { + store = {}; + } + var asyncLocalStorage = getAsl(); -Meteor._runAsync = (fn, ctx, store = {}) => { - return global.asyncLocalStorage.run( - store || Meteor._getAslStore(), - () => { - return fn.call(ctx); - } - ); + return asyncLocalStorage.run( + store || Meteor._getAslStore(), + function () { + return fn.call(ctx); + } + ); }; -Meteor._isPromise = (r) => { - return r && typeof r.then === 'function'; +Meteor._isPromise = function (r) { + return r && typeof r.then === 'function'; }; diff --git a/packages/meteor/async_helpers.js b/packages/meteor/async_helpers.js index 289ae20a0c1..fc1175d9c09 100644 --- a/packages/meteor/async_helpers.js +++ b/packages/meteor/async_helpers.js @@ -1,26 +1,27 @@ Meteor._noYieldsAllowed = function (f) { - const result = f(); + var result = f(); if (Meteor._isPromise(result)) { throw new Error("function is a promise when calling Meteor._noYieldsAllowed"); } return result }; -class FakeDoubleEndedQueue { - constructor() { - this.queue = []; - } - push(task) { - this.queue.push(task); - } - shift() { - return this.queue.shift(); - } - isEmpty() { - return this.queue.length === 0; - } +function FakeDoubleEndedQueue () { + this.queue = []; } +FakeDoubleEndedQueue.prototype.push = function (task) { + this.queue.push(task); +}; + +FakeDoubleEndedQueue.prototype.shift = function () { + return this.queue.shift(); +}; + +FakeDoubleEndedQueue.prototype.isEmpty = function () { + return this.queue.length === 0; +}; + Meteor._DoubleEndedQueue = Meteor.isServer ? Npm.require('denque') : FakeDoubleEndedQueue; // Meteor._SynchronousQueue is a queue which runs task functions serially. @@ -40,17 +41,16 @@ Meteor._DoubleEndedQueue = Meteor.isServer ? Npm.require('denque') : FakeDoubleE // XXX could maybe use the npm 'schlock' module instead, which would // also support multiple concurrent "read" tasks // -class AsynchronousQueue { - constructor() { - this._taskHandles = new Meteor._DoubleEndedQueue(); - this._runningOrRunScheduled = false; - // This is true if we're currently draining. While we're draining, a further - // drain is a noop, to prevent infinite loops. "drain" is a heuristic type - // operation, that has a meaning like unto "what a naive person would expect - // when modifying a table from an observe" - this._draining = false; - } - +function AsynchronousQueue () { + this._taskHandles = new Meteor._DoubleEndedQueue(); + this._runningOrRunScheduled = false; + // This is true if we're currently draining. While we're draining, a further + // drain is a noop, to prevent infinite loops. "drain" is a heuristic type + // operation, that has a meaning like unto "what a naive person would expect + // when modifying a table from an observe" + this._draining = false; +} +Object.assign(AsynchronousQueue.prototype, { queueTask(task) { const self = this; self._taskHandles.push({ @@ -58,7 +58,7 @@ class AsynchronousQueue { name: task.name }); self._scheduleRun(); - } + }, async _scheduleRun() { // Already running or scheduled? Do nothing. @@ -71,7 +71,7 @@ class AsynchronousQueue { const promise = new Promise(r => resolve = r); const runImmediateHandle = (fn) => { if (Meteor.isServer) { - setImmediate(fn); + Meteor._runFresh(() => setImmediate(fn)) return; } setTimeout(fn, 0); @@ -80,7 +80,7 @@ class AsynchronousQueue { this._run().finally(resolve); }); return promise; - } + }, async _run() { if (!this._runningOrRunScheduled) @@ -117,23 +117,23 @@ class AsynchronousQueue { taskHandle.resolver(); } } - } + }, async runTask(task) { let resolver; const promise = new Promise( (resolve, reject) => - (resolver = (res, rej) => { - if (rej) { - reject(rej); - return; - } - resolve(res); - }) + (resolver = (res, rej) => { + if (rej) { + reject(rej); + return; + } + resolve(res); + }) ); const handle = { - task: Meteor.bindEnvironment(task, function(e) { + task: Meteor.bindEnvironment(task, function (e) { Meteor._debug('Exception from task', e); throw e; }), @@ -143,11 +143,11 @@ class AsynchronousQueue { this._taskHandles.push(handle); await this._scheduleRun(); return promise; - } + }, flush() { - return this.runTask(() => {}); - } + return this.runTask(() => { }); + }, async drain() { if (this._draining) @@ -159,7 +159,7 @@ class AsynchronousQueue { } this._draining = false; } -} +}); Meteor._AsynchronousQueue = AsynchronousQueue; diff --git a/packages/meteor/debug.js b/packages/meteor/debug.js index 8bb4fdb0a52..bf8837a4e8f 100644 --- a/packages/meteor/debug.js +++ b/packages/meteor/debug.js @@ -1,3 +1,19 @@ +if (Meteor.isServer) { + if (typeof __meteor_runtime_config__ === 'object') { + __meteor_runtime_config__.debug = + !!process.env.NODE_INSPECTOR_IPC || + !!process.env.VSCODE_INSPECTOR_OPTIONS || + process.execArgv.some(function(_arg) { + return /^--(inspect|debug)(-brk)?(=\d+)?$/i.test(_arg); + }); + } +} + +Meteor.isDebug = Meteor.isClient + ? typeof window === 'object' && !!window.__meteor_runtime_config__.debug + : typeof __meteor_runtime_config__ === 'object' && + !!__meteor_runtime_config__.debug; + var suppress = 0; // replacement for console.log. This is a temporary API. We should @@ -61,4 +77,3 @@ Meteor._suppress_log = function (count) { Meteor._suppressed_log_expected = function () { return suppress !== 0; }; - diff --git a/packages/meteor/dynamics_browser.js b/packages/meteor/dynamics_browser.js index 13133c27762..2c2b0375fe1 100644 --- a/packages/meteor/dynamics_browser.js +++ b/packages/meteor/dynamics_browser.js @@ -36,12 +36,28 @@ EVp.getOrNullIfOutsideFiber = function () { */ EVp.withValue = function (value, func) { var saved = currentValues[this.slot]; + try { currentValues[this.slot] = value; + var ret = func(); + var isPromise = Meteor._isPromise(ret); + + if (isPromise) { + var self = this; + return ret.then(function (res) { + currentValues[self.slot] = saved; + return res + }); + } + } catch (e) { + throw e; } finally { - currentValues[this.slot] = saved; + if (!isPromise) { + currentValues[this.slot] = saved; + } } + return ret; }; diff --git a/packages/meteor/dynamics_nodejs.js b/packages/meteor/dynamics_nodejs.js index d6f1e8ea1dd..699fa967594 100644 --- a/packages/meteor/dynamics_nodejs.js +++ b/packages/meteor/dynamics_nodejs.js @@ -3,8 +3,9 @@ let nextSlot = 0; let callAsyncMethodRunning = false; const CURRENT_VALUE_KEY_NAME = "currentValue"; -const SLOT_CALL_KEY = "slotCall"; +const UPPER_CALL_DYNAMICS_KEY_NAME = "upperCallDynamics"; +const SLOT_CALL_KEY = "slotCall"; /** * @memberOf Meteor * @summary Constructor for EnvironmentVariable @@ -26,7 +27,9 @@ class EnvironmentVariableAsync { */ get() { if (this.slot !== Meteor._getValueFromAslStore(SLOT_CALL_KEY)) { - return; + const dynamics = Meteor._getValueFromAslStore(UPPER_CALL_DYNAMICS_KEY_NAME) || {}; + + return dynamics[this.slot]; } return Meteor._getValueFromAslStore(CURRENT_VALUE_KEY_NAME); } @@ -41,27 +44,35 @@ class EnvironmentVariableAsync { * @method withValue * @param {any} value The value to set for the duration of the function call * @param {Function} func The function to call with the new value of the - * @param {Object} [options] Optional additional options + * @param {Object} [options] Optional additional properties for adding in [asl](https://nodejs.org/api/async_context.html#class-asynclocalstorage) * @returns {Promise} The return value of the function */ withValue(value, func, options = {}) { + const self = this; + const slotCall = self.slot; + const dynamics = Object.assign( + {}, + Meteor._getValueFromAslStore(UPPER_CALL_DYNAMICS_KEY_NAME) || {} + ); + + if (slotCall != null) { + dynamics[slotCall] = value; + } + return Meteor._runAsync( - async () => { - let ret; - try { - Meteor._updateAslStore(CURRENT_VALUE_KEY_NAME, value); - ret = await func(); - } finally { - Meteor._updateAslStore(CURRENT_VALUE_KEY_NAME, undefined); - } - return ret; + function () { + Meteor._updateAslStore(CURRENT_VALUE_KEY_NAME, value); + Meteor._updateAslStore(UPPER_CALL_DYNAMICS_KEY_NAME, dynamics); + return func(); }, - this, - { - callId: `${this.slot}-${Math.random()}`, - [SLOT_CALL_KEY]: this.slot, - ...options, - } + self, + Object.assign( + { + callId: `${this.slot}-${Math.random()}`, + [SLOT_CALL_KEY]: this.slot, + }, + options, + ), ); } @@ -121,10 +132,10 @@ Meteor.EnvironmentVariable = EnvironmentVariableAsync; /** * @summary Stores the current Meteor environment variables, and wraps the * function to run with the environment variables restored. On the server, the - * function is wrapped within a fiber. + * function is wrapped within Async Local Storage. * * This function has two reasons: - * 1. Return the function to be executed on the MeteorJS context, having it assinged in the async localstorage. + * 1. Return the function to be executed on the MeteorJS context, having it assigned in Async Local Storage. * 2. Better error handling, the error message will be more clear. * @locus Anywhere * @memberOf Meteor @@ -177,6 +188,6 @@ Meteor.bindEnvironment = (func, onException, _this) => { return runWithEnvironment(); } - return global.asyncLocalStorage.run({}, runWithEnvironment); + return Meteor._getAsl().run({}, runWithEnvironment); }; }; diff --git a/packages/meteor/dynamics_test.js b/packages/meteor/dynamics_test.js index dacbb042943..8e682943732 100644 --- a/packages/meteor/dynamics_test.js +++ b/packages/meteor/dynamics_test.js @@ -16,6 +16,75 @@ Tinytest.add("environment - dynamic variables", function (test) { test.equal(CurrentFoo.get(), undefined); }); +if (Meteor.isServer) { + Tinytest.addAsync( + "environment - dynamic variables with two context (server)", + async function (test) { + // Ensure "0" as the dynamic context spread properly + // https://github.com/meteor/meteor/pull/13089 + const context0 = new Meteor.EnvironmentVariable(); + context0.slot = 0; + + const context1 = new Meteor.EnvironmentVariable(); + const context2 = new Meteor.EnvironmentVariable(); + + return context0.withValue(0, async () => { + test.equal(context1.get(), undefined); + await context1.withValue(42, async () => { + test.equal(context2.get(), undefined); + await context2.withValue(1, async () => { + await context2.withValue(2, async () => { + test.equal(context2.get(), 2); + test.equal(context0.get(), 0); + }); + test.equal(context1.get(), 42); + test.equal(context2.get(), 1); + test.equal(context0.get(), 0); + }); + test.equal(context1.get(), 42); + test.equal(context2.get(), undefined); + test.equal(context0.get(), 0); + }); + test.equal(context0.get(), 0); + }); + } + ); +} else { + // Basically the same test as the server one, but without async/await + // as we don't handle async on the client in this case + // due to the idea that we need to keep new EcmaScript features doesn't compile in older browsers + Tinytest.add( + "environment - dynamic variables with two context (client)", + function (test) { + // Ensure "0" as the dynamic context spread properly + // https://github.com/meteor/meteor/pull/13089 + const context0 = new Meteor.EnvironmentVariable(); + context0.slot = 0; + + const context1 = new Meteor.EnvironmentVariable(); + const context2 = new Meteor.EnvironmentVariable(); + context0.withValue(0, async () => { + test.equal(context1.get(), undefined); + context1.withValue(42, () => { + test.equal(context2.get(), undefined); + context2.withValue(1, () => { + context2.withValue(2, () => { + test.equal(context2.get(), 2); + test.equal(context0.get(), 0); + }); + test.equal(context1.get(), 42); + test.equal(context2.get(), 1); + test.equal(context0.get(), 0); + }); + test.equal(context1.get(), 42); + test.equal(context2.get(), undefined); + test.equal(context0.get(), 0); + }); + test.equal(context0.get(), 0); + }); + } + ); +} Tinytest.addAsync("environment - bindEnvironment", async function (test) { var raised_f; @@ -38,7 +107,7 @@ Tinytest.addAsync("environment - bindEnvironment", async function (test) { test.equal(raised_f, null); test.equal(await f(true), undefined); - test.equal(raised_f, "test"); + test.equal(raised_f, "test", 'raised_f should be "test"'); }; // At top level @@ -48,9 +117,9 @@ Tinytest.addAsync("environment - bindEnvironment", async function (test) { // Inside a withValue - await CurrentFoo.withValue(22, function () { + await CurrentFoo.withValue(22, async function () { test.equal(CurrentFoo.get(), 22); - test_f(); + await test_f(); test.equal(CurrentFoo.get(), 22); }); @@ -109,3 +178,54 @@ Tinytest.addAsync("environment - bare bindEnvironment", setTimeout(f, 0); }); }); + +/** + * This won't work on the client due to the absence of ALS/AH + */ +if (Meteor.isServer) { + Tinytest.addAsync('environment - preserve ev value async/await', async function (test) { + let val1 = null; + let val2 = null; + + let ev1 = new Meteor.EnvironmentVariable(); + + async function runAsyncFunction() { + await test.sleep(10) + val2 = ev1.get(); + } + + ev1.withValue({ name: 'test' }, async () => { + runAsyncFunction(); + + val1 = ev1.get(); + }); + + await test.sleep(20) + + test.equal(val1, { name: 'test' }, 'val1 should be equal to { name: "test" }'); + test.equal(val2, { name: 'test' }, 'val2 should be equal to val1'); + }) + + Tinytest.addAsync('environment - should not access ev after it finishes', async function (test) { + const context1 = new Meteor.EnvironmentVariable(); + const context2 = new Meteor.EnvironmentVariable(); + + await context1.withValue({ idd: 123 }, async () => { + await context2.withValue({ idd: 456 }, async () => { + await context2.withValue({ idd: 789 }, async () => { + test.equal(context2.get(), { idd: 789 }, 'context2 should be 789'); + }) + test.equal(context2.get(), { idd: 456 }, 'context2 should be 456'); + }) + + test.equal(context1.get(), { idd: 123 }, 'context1 should be 123'); + test.equal(context2.get(), undefined, 'context2 should be undefined'); + }); + }) +} + +Tinytest.add('environment - consistent ev value', function (test) { + let ev1 = new Meteor.EnvironmentVariable(); + const ret = ev1.withValue(10, () => 5); + test.equal(ret, 5); +}) \ No newline at end of file diff --git a/packages/meteor/emitter-promise.js b/packages/meteor/emitter-promise.js index 5db1bc60978..1cb7bd10d68 100644 --- a/packages/meteor/emitter-promise.js +++ b/packages/meteor/emitter-promise.js @@ -1,7 +1,7 @@ -const { EventEmitter } = Npm.require('node:events'); +const { EventEmitter } = Npm.require('events'); const DEFAULT_TIMEOUT = - Meteor.settings?.EMITTER_PROMISE_DEFAULT_TIMEOUT || 3000; + Meteor.settings && Meteor.settings.EMITTER_PROMISE_DEFAULT_TIMEOUT || 3000; /** * diff --git a/packages/meteor/errors.js b/packages/meteor/errors.js index 01a9d50d234..6c6f1028c4a 100644 --- a/packages/meteor/errors.js +++ b/packages/meteor/errors.js @@ -42,23 +42,7 @@ Meteor.makeErrorType = function (name, constructor) { * @param {String} error A string code uniquely identifying this kind of error. * This string should be used by callers of the method to determine the * appropriate action to take, instead of attempting to parse the reason - * or details fields. For example: - * - * ``` - * // on the server, pick a code unique to this error - * // the reason field should be a useful debug message - * throw new Meteor.Error("logged-out", - * "The user must be logged in to post a comment."); - * - * // on the client - * Meteor.call("methodName", function (error) { - * // identify the error - * if (error && error.error === "logged-out") { - * // show a nice error message - * Session.set("errorMessage", "Please log in to post a comment."); - * } - * }); - * ``` + * or details fields. * * For legacy reasons, some built-in Meteor functions such as `check` throw * errors with a number in this field. diff --git a/packages/meteor/helpers.js b/packages/meteor/helpers.js index e85bbecfca7..ac6b801d837 100644 --- a/packages/meteor/helpers.js +++ b/packages/meteor/helpers.js @@ -70,11 +70,13 @@ Meteor._delete = function (obj /*, arguments */) { /** - * Takes a function that has a callback argument as the last one and promissify it. + * @memberOf Meteor + * @locus Anywhere + * @summary 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 + * @param {Function} fn + * @param {Object} [context] + * @param {Boolean} [errorFirst] - If the callback follows the errorFirst style, default to true * @returns {function(...[*]): Promise} */ Meteor.promisify = function (fn, context, errorFirst) { diff --git a/packages/meteor/meteor.d.ts b/packages/meteor/meteor.d.ts index 8ebc07618b4..94f4a9753fc 100644 --- a/packages/meteor/meteor.d.ts +++ b/packages/meteor/meteor.d.ts @@ -19,6 +19,15 @@ export namespace Meteor { * of Meteor. */ var release: string; + + var meteorRelease: string; + + interface ErrorConstructor { + new (...args: any[]): Error; + errorType: string; + } + + function makeErrorType(name: string, constructor: Function): ErrorConstructor; /** Global props **/ /** Settings **/ @@ -60,6 +69,9 @@ export namespace Meteor { function user(options?: { fields?: Mongo.FieldSpecifier | undefined; }): User | null; + function userAsync(options?: { + fields?: Mongo.FieldSpecifier | undefined; + }): Promise; function userId(): string | null; var users: Mongo.Collection; @@ -159,7 +171,13 @@ export namespace Meteor { */ function callAsync(name: string, ...args: any[]): Promise; - interface MethodApplyOptions { + interface MethodApplyOptions< + Result extends + | EJSONable + | EJSONable[] + | EJSONableProperty + | EJSONableProperty[] + > { /** * (Client only) If true, don't send this method until all previous method calls have completed, and don't send any subsequent method calls until this one is completed. */ @@ -203,7 +221,7 @@ export namespace Meteor { >( name: string, args: ReadonlyArray, - options?: MethodApplyOptions, + options?: MethodApplyOptions, asyncCallback?: ( error: global_Error | Meteor.Error | undefined, result?: Result @@ -226,7 +244,7 @@ export namespace Meteor { >( name: string, args: ReadonlyArray, - options?: MethodApplyOptions, + options?: MethodApplyOptions, asyncCallback?: ( error: global_Error | Meteor.Error | undefined, result?: Result diff --git a/packages/meteor/package.js b/packages/meteor/package.js index 1bea5cc18b4..d3b2507414a 100644 --- a/packages/meteor/package.js +++ b/packages/meteor/package.js @@ -2,7 +2,7 @@ Package.describe({ summary: "Core Meteor environment", - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Package.registerBuildPlugin({ diff --git a/packages/meteor/url_common.js b/packages/meteor/url_common.js index faff1526d96..1f8c4d06b9c 100644 --- a/packages/meteor/url_common.js +++ b/packages/meteor/url_common.js @@ -43,10 +43,10 @@ Meteor.absoluteUrl = function (path, options) { !/http:\/\/127\.0\.0\.1[:\/]/.test(url)) // or 127.0.0.1 url = url.replace(/^http:/, 'https:'); - var localhostRegex = /^http:\/\/localhost([:\/].*)/; - if (localhostRegex.test(url) || options.replaceLocalhost) - url = url.replace(localhostRegex, 'http://127.0.0.1$1'); - + if (options.replaceLocalhost) + { + url = url.replace( /^http:\/\/localhost([:\/].*)/, 'http://127.0.0.1$1'); + } return url; }; diff --git a/packages/meteor/url_tests.js b/packages/meteor/url_tests.js index 6ef56c041b4..c2e9b38bc25 100644 --- a/packages/meteor/url_tests.js +++ b/packages/meteor/url_tests.js @@ -30,14 +30,14 @@ Tinytest.add("absolute-url - basics", function(test) { rootUrl: prefix + "localhost", secure: true, }), - "http://127.0.0.1/foo" + "http://localhost/foo" ); test.equal( Meteor.absoluteUrl("foo", { rootUrl: prefix + "localhost:3000", secure: true, }), - "http://127.0.0.1:3000/foo" + "http://localhost:3000/foo" ); test.equal( Meteor.absoluteUrl("foo", { diff --git a/packages/minifier-css/package.js b/packages/minifier-css/package.js index 0eb79cce99e..e96be5e86e9 100644 --- a/packages/minifier-css/package.js +++ b/packages/minifier-css/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'CSS minifier', - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Npm.depends({ diff --git a/packages/minifier-js/.npm/package/npm-shrinkwrap.json b/packages/minifier-js/.npm/package/npm-shrinkwrap.json index 8b8c53e04b1..a2a009b0568 100644 --- a/packages/minifier-js/.npm/package/npm-shrinkwrap.json +++ b/packages/minifier-js/.npm/package/npm-shrinkwrap.json @@ -2,24 +2,24 @@ "lockfileVersion": 4, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==" + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==" }, "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" }, "@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==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" }, "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==" }, "@jridgewell/sourcemap-codec": { "version": "1.4.15", @@ -27,14 +27,14 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==" + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==" }, "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==" + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" }, "buffer-from": { "version": "1.1.2", @@ -57,9 +57,9 @@ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==" + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==" } } } diff --git a/packages/minifier-js/package.js b/packages/minifier-js/package.js index 77e0cd29da7..ea0dd78f0a0 100644 --- a/packages/minifier-js/package.js +++ b/packages/minifier-js/package.js @@ -1,10 +1,10 @@ Package.describe({ summary: "JavaScript minifier", - version: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', }); Npm.depends({ - terser: "5.14.2" + terser: "5.31.0" }); Package.onUse(function (api) { diff --git a/packages/minimongo/cursor.js b/packages/minimongo/cursor.js index 4db04d97348..bfdecc49f8e 100644 --- a/packages/minimongo/cursor.js +++ b/packages/minimongo/cursor.js @@ -216,6 +216,16 @@ export default class Cursor { return LocalCollection._observeFromObserveChanges(this, options); } + /** + * @summary Watch a query. Receive callbacks as the result set changes. + * @locus Anywhere + * @memberOf Mongo.Cursor + * @instance + */ + observeAsync(options) { + return new Promise(resolve => resolve(this.observe(options))); + } + /** * @summary Watch a query. Receive callbacks as the result set changes. Only * the differences between the old and new documents are passed to @@ -373,6 +383,23 @@ export default class Cursor { return handle; } + /** + * @summary Watch a query. Receive callbacks as the result set changes. Only + * the differences between the old and new documents are passed to + * the callbacks. + * @locus Anywhere + * @memberOf Mongo.Cursor + * @instance + * @param {Object} callbacks Functions to call to deliver the result set as it + * changes + */ + observeChangesAsync(options) { + return new Promise((resolve) => { + const handle = this.observeChanges(options); + handle.isReadyPromise.then(() => resolve(handle)); + }); + } + // XXX Maybe we need a version of observe that just calls a callback if // anything changed. _depend(changers, _allow_unordered) { diff --git a/packages/minimongo/local_collection.js b/packages/minimongo/local_collection.js index 4366d656455..590a6e96587 100644 --- a/packages/minimongo/local_collection.js +++ b/packages/minimongo/local_collection.js @@ -660,6 +660,22 @@ export default class LocalCollection { this._observeQueue.drain(); + + // If we are doing an upsert, and we didn't modify any documents yet, then + // it's time to do an insert. Figure out what document we are inserting, and + // generate an id for it. + let insertedId; + if (updateCount === 0 && options.upsert) { + const doc = LocalCollection._createUpsertDocument(selector, mod); + if (!doc._id && options.insertedId) { + doc._id = options.insertedId; + } + + insertedId = this.insert(doc); + updateCount = 1; + } + + return this.finishUpdate({ options, updateCount, @@ -2413,4 +2429,3 @@ function findModTarget(doc, keyparts, options = {}) { // notreached } - diff --git a/packages/minimongo/minimongo_tests_client.js b/packages/minimongo/minimongo_tests_client.js index 4cb98be4f42..7b996c6eb94 100644 --- a/packages/minimongo/minimongo_tests_client.js +++ b/packages/minimongo/minimongo_tests_client.js @@ -212,6 +212,21 @@ Tinytest.addAsync('minimongo - basics', async test => { test.equal(after.d, undefined); }); + +Tinytest.addAsync('minimongo - upsert', async test => { + const c = new LocalCollection(); + + await c.upsertAsync({ name: 'doc' }, { name: 'doc' }); + + test.equal(c.find({}).count(), 1); + + await c.removeAsync({}); + + c.upsert({ name: 'doc' }, { name: 'doc' }); + test.equal(c.find({}).count(), 1); +}); + + Tinytest.add('minimongo - error - no options', test => { try { throw MinimongoError('Not fun to have errors'); @@ -2211,7 +2226,7 @@ Tinytest.add('minimongo - array sort', test => { c.insert({up: 3, down: 3, selected: 2, a: {x: 2.5}}); c.insert({up: 4, down: 0, selected: 3, a: {x: 5}}); - // Test that the the documents in "cursor" contain values with the name + // Test that the documents in "cursor" contain values with the name // "field" running from 0 to the max value of that name in the collection. const testCursorMatchesField = (cursor, field) => { const fieldValues = []; @@ -2243,7 +2258,7 @@ Tinytest.add('minimongo - nested array sort', test => { c.insert({ ab0x: 7, ab0x_g: 7, g_ab0x: 7, cdx: 4, cdx_cdy: 4, cdy_cdx: 6, n: 7 , a: { b: [{ x: 5 }] }, c: { d: [{ y: 2}, { y: 3}] }, g: 5 }); c.insert({ ab0x: 8, ab0x_g: 8, g_ab0x: 8, cdx: 5, cdx_cdy: 5, cdy_cdx: 7, n: 8 , a: { b: [{ x: 6 }, { x: 7 }] }, c: { d: [{ y: 2}, { x: 1.5, y: 2}] }, g: 6 }); - // Test that the the documents in "cursor" contain values with the name + // Test that the documents in "cursor" contain values with the name // "field" running from 0 to the max value of that name in the collection. const testCursorMatchesField = (cursor, field) => { const fieldValues = []; @@ -3983,3 +3998,17 @@ Tinytest.add('minimongo - cannot $rename with null bytes', test => { collection.update({ _id: id }, { $rename: { a: '\0a', c: 'c\0' } }); }, "The 'to' field for $rename cannot contain an embedded null byte"); }); + +Tinytest.addAsync('minimongo - asyncIterator', async (test) => { + const collection = new LocalCollection(); + + collection.insert({ _id: 'a' }); + collection.insert({ _id: 'b' }); + + let itemIds = []; + for await (const item of collection.find()) { + itemIds.push(item._id); + } + test.equal(itemIds.length, 2); + test.equal(itemIds, ['a', 'b']); +}); diff --git a/packages/minimongo/package.js b/packages/minimongo/package.js index 1bbfd4f4177..79aae45b772 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: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Package.onUse(api => { diff --git a/packages/mobile-experience/package.js b/packages/mobile-experience/package.js index f0ddafde0c7..7128c87df8b 100644 --- a/packages/mobile-experience/package.js +++ b/packages/mobile-experience/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'mobile-experience', - version: '1.1.1-alpha300.19', + version: '1.1.2-rc300.2', summary: 'Packages for a great mobile user experience', documentation: 'README.md' }); diff --git a/packages/mobile-status-bar/package.js b/packages/mobile-status-bar/package.js index 034d914557b..c4c0e40a3f1 100644 --- a/packages/mobile-status-bar/package.js +++ b/packages/mobile-status-bar/package.js @@ -1,7 +1,7 @@ Package.describe({ name: 'mobile-status-bar', summary: "Good defaults for the mobile status bar", - version: "1.1.1-alpha300.19", + version: '1.1.1-rc300.2', }); Cordova.depends({ diff --git a/packages/modern-browsers/modern-tests.js b/packages/modern-browsers/modern-tests.js index 38711df3cac..eaac7549184 100644 --- a/packages/modern-browsers/modern-tests.js +++ b/packages/modern-browsers/modern-tests.js @@ -29,4 +29,11 @@ Tinytest.add('modern-browsers - versions - basic', function (test) { minor: 5, patch: 2, })); + + test.isTrue(isModern({ + name: "appleMail", + major: 605, + minor: 1, + patch: 15, + })); }); diff --git a/packages/modern-browsers/modern.js b/packages/modern-browsers/modern.js index 14476284d39..19ff2734ae0 100644 --- a/packages/modern-browsers/modern.js +++ b/packages/modern-browsers/modern.js @@ -33,6 +33,9 @@ const browserAliases = { // The webapp package converts browser names to camel case, so // mobile_safari and mobileSafari should be synonymous. mobile_safari: ['mobileSafari', 'mobileSafariUI', 'mobileSafariUI/WKWebView'], + + // Embedded WebViews on iPads will be reported as Apple Mail + safari: ['appleMail'], }; // Expand the given minimum versions by reusing chrome versions for diff --git a/packages/modern-browsers/package.js b/packages/modern-browsers/package.js index 9514e502b5b..aeeb569ff26 100644 --- a/packages/modern-browsers/package.js +++ b/packages/modern-browsers/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'modern-browsers', - version: '0.1.10-alpha300.19', + version: '0.1.11-rc300.2', summary: 'API for defining the boundary between modern and legacy ' + 'JavaScript clients', diff --git a/packages/modules-runtime-hot/package.js b/packages/modules-runtime-hot/package.js index adac7011f09..7d9ca8e6abf 100644 --- a/packages/modules-runtime-hot/package.js +++ b/packages/modules-runtime-hot/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'modules-runtime-hot', - version: '0.14.3-alpha300.19', + version: '0.14.3-rc300.2', summary: 'Patches modules-runtime to support Hot Module Replacement', git: 'https://github.com/benjamn/install', documentation: 'README.md', diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 4608eae1469..b7156feb236 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules-runtime", - version: '0.13.2-alpha300.19', + version: '0.13.2-rc300.2', summary: "CommonJS module system", git: "https://github.com/benjamn/install", documentation: "README.md" diff --git a/packages/modules/.npm/package/npm-shrinkwrap.json b/packages/modules/.npm/package/npm-shrinkwrap.json index 26ac3a098a4..43e5553de89 100644 --- a/packages/modules/.npm/package/npm-shrinkwrap.json +++ b/packages/modules/.npm/package/npm-shrinkwrap.json @@ -4,7 +4,7 @@ "@meteorjs/reify": { "version": "0.24.0", "resolved": "git+ssh://git@github.com/meteor/reify.git#cf61c57c6c4fefcbf164bf63d3c12fda1924b3d2", - "integrity": "sha512-VCvq454Two3oLtBHrkWx6OC1lO6jepYOCC9PhlcHcQCDC2R8mlDTmox0XvW2rCTVOth0qEIbdxKeKxa8WkD7eA==" + "integrity": "sha512-NN0E7fURAY9XrtgkmP1XqV6fMSwKHIjENOE6V5AqWXU0wynLlXb+l5NhMC72hYwbtT73R9E35dDR1lqBKQSFdg==" }, "@types/estree": { "version": "1.0.5", @@ -12,9 +12,9 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==" + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" }, "estree-walker": { "version": "2.0.2", diff --git a/packages/modules/package.js b/packages/modules/package.js index a4901f2aed5..0c15bb0437b 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: '0.19.1-alpha300.19', + version: '0.20.1-rc300.2', summary: "CommonJS module system", documentation: "README.md" }); diff --git a/packages/mongo-dev-server/package.js b/packages/mongo-dev-server/package.js index 4359c0e0812..d97625acd3a 100644 --- a/packages/mongo-dev-server/package.js +++ b/packages/mongo-dev-server/package.js @@ -3,7 +3,7 @@ Package.describe({ documentation: 'README.md', name: 'mongo-dev-server', summary: 'Start MongoDB alongside Meteor, in development mode.', - version: '1.1.1-alpha300.19', + version: '1.1.1-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/mongo-id/package.js b/packages/mongo-id/package.js index 0c5d1516ab5..12d74ee916c 100644 --- a/packages/mongo-id/package.js +++ b/packages/mongo-id/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'JS simulation of MongoDB ObjectIDs', - version: '1.0.9-alpha300.19', + version: '1.0.9-rc300.2', documentation: null }); diff --git a/packages/mongo-livedata/package.js b/packages/mongo-livedata/package.js index b0d440d44b8..0a148134007 100644 --- a/packages/mongo-livedata/package.js +++ b/packages/mongo-livedata/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Moved to the 'mongo' package", - version: '1.0.13-alpha300.19' + version: '1.0.13-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/mongo/allow_tests.js b/packages/mongo/allow_tests.js index a57c195ab89..d1afae97108 100644 --- a/packages/mongo/allow_tests.js +++ b/packages/mongo/allow_tests.js @@ -240,9 +240,7 @@ if (Meteor.isClient) { fullName, {idGeneration: idGeneration, transform: transform}); collection.callClearMethod = async function () { - await Meteor.callAsync('clear-collection-' + fullName, { - returnStubValue: true, - }); + await Meteor.callAsync('clear-collection-' + fullName); }; collection.unnoncedName = name + idGeneration; return collection; @@ -688,7 +686,6 @@ if (Meteor.isClient) { // ... but if we did, the server would reject it too. await Meteor.callAsync( '/' + collection._name + '/updateAsync', - { returnStubValue: true }, { updated: { $exists: false } }, { $set: { updated: true } } ).catch(async function(err, res) { @@ -718,7 +715,6 @@ if (Meteor.isClient) { // ... but if we did, the server would reject it too. await Meteor.callAsync( '/' + collection._name + '/removeAsync', - { returnStubValue: true }, { updated: true, } diff --git a/packages/mongo/collection.js b/packages/mongo/collection.js index 0131b7e167a..252e9538bfb 100644 --- a/packages/mongo/collection.js +++ b/packages/mongo/collection.js @@ -20,7 +20,7 @@ Mongo = {}; * @class * @param {String} name The name of the collection. If null, creates an unmanaged (unsynchronized) local collection. * @param {Object} [options] - * @param {Object} options.connection The server connection that will manage this collection. Uses the default connection if not specified. Pass the return value of calling [`DDP.connect`](#ddp_connect) to specify a different server. Pass `null` to specify no connection. Unmanaged (`name` is null) collections cannot specify a connection. + * @param {Object} options.connection The server connection that will manage this collection. Uses the default connection if not specified. Pass the return value of calling [`DDP.connect`](#DDP-connect) to specify a different server. Pass `null` to specify no connection. Unmanaged (`name` is null) collections cannot specify a connection. * @param {String} options.idGeneration The method of generating the `_id` fields of new documents in this collection. Possible values: - **`'STRING'`**: random strings @@ -89,6 +89,8 @@ Mongo.Collection = function Collection(name, options) { this._transform = LocalCollection.wrapTransform(options.transform); + this.resolverType = options.resolverType; + if (!name || options.connection === null) // note: nameless collections never have a connection this._connection = null; @@ -753,7 +755,7 @@ Object.assign(Mongo.Collection.prototype, { return this._insert(doc, callback); }, - async _insertAsync(doc, options = {}) { + _insertAsync(doc, options = {}) { // Make sure we were passed a document to insert if (!doc) { throw new Error('insert requires an argument'); @@ -810,19 +812,17 @@ Object.assign(Mongo.Collection.prototype, { }; if (this._isRemoteCollection()) { - const result = await this._callMutatorMethodAsync('insertAsync', [doc], options); - - return chooseReturnValueFromCollectionResult(result); + const promise = this._callMutatorMethodAsync('insertAsync', [doc], options); + promise.then(chooseReturnValueFromCollectionResult); + promise.stubPromise = promise.stubPromise.then(chooseReturnValueFromCollectionResult); + promise.serverPromise = promise.serverPromise.then(chooseReturnValueFromCollectionResult); + return promise; } // it's my collection. descend into the collection object // and propagate any exception. - try { - const result = await this._collection.insertAsync(doc); - return chooseReturnValueFromCollectionResult(result); - } catch (e) { - throw e; - } + return this._collection.insertAsync(doc) + .then(chooseReturnValueFromCollectionResult); }, /** @@ -850,7 +850,7 @@ Object.assign(Mongo.Collection.prototype, { * @param {Boolean} options.upsert True to insert a document if no matching documents are found. * @param {Array} options.arrayFilters Optional. Used in combination with MongoDB [filtered positional operator](https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/) to specify which elements to modify in an array field. */ - async updateAsync(selector, modifier, ...optionsAndCallback) { + updateAsync(selector, modifier, ...optionsAndCallback) { // We've already popped off the callback, so we are left with an array // of one or zero items @@ -889,7 +889,7 @@ Object.assign(Mongo.Collection.prototype, { // If the user provided a callback and the collection implements this // operation asynchronously, then queryRet will be undefined, and the // result will be returned through the callback instead. - //console.log({callback, options, selector, modifier, coll: this._collection}); + return this._collection.updateAsync( selector, modifier, @@ -981,7 +981,7 @@ Object.assign(Mongo.Collection.prototype, { * @instance * @param {MongoSelector} selector Specifies which documents to remove */ - async removeAsync(selector, options = {}) { + removeAsync(selector, options = {}) { selector = Mongo.Collection._rewriteSelector(selector); if (this._isRemoteCollection()) { @@ -1225,7 +1225,7 @@ function wrapCallback(callback, convertResult) { } /** - * @summary Create a Mongo-style `ObjectID`. If you don't specify a `hexString`, the `ObjectID` will generated randomly (not using MongoDB's ID construction rules). + * @summary Create a Mongo-style `ObjectID`. If you don't specify a `hexString`, the `ObjectID` will be generated randomly (not using MongoDB's ID construction rules). * @locus Anywhere * @class * @param {String} [hexString] Optional. The 24-character hexadecimal contents of the ObjectID to create @@ -1268,4 +1268,3 @@ function popCallbackFromArgs(args) { return args.pop(); } } - diff --git a/packages/mongo/collection_tests.js b/packages/mongo/collection_tests.js index b8084aa783c..46f422c9b4b 100644 --- a/packages/mongo/collection_tests.js +++ b/packages/mongo/collection_tests.js @@ -224,7 +224,7 @@ Tinytest.addAsync('collection - calling find with an invalid readPreference', Tinytest.addAsync('collection - inserting a document with a binary should return a document with a binary', async function(test) { if (Meteor.isServer) { - const collection = new Mongo.Collection('testBinary1'); + const collection = new Mongo.Collection('testBinary1' + test.id); const _id = Random.id(); await collection.insertAsync({ _id, @@ -246,7 +246,7 @@ Tinytest.addAsync('collection - inserting a document with a binary should return Tinytest.addAsync('collection - inserting a document with a binary (sub type 0) should return a document with a uint8array', async function(test) { if (Meteor.isServer) { - const collection = new Mongo.Collection('testBinary8'); + const collection = new Mongo.Collection('testBinary8' + test.id); const _id = Random.id(); await collection.insertAsync({ _id, @@ -268,7 +268,7 @@ Tinytest.addAsync('collection - inserting a document with a binary (sub type 0) Tinytest.addAsync('collection - updating a document with a binary should return a document with a binary', async function(test) { if (Meteor.isServer) { - const collection = new Mongo.Collection('testBinary2'); + const collection = new Mongo.Collection('testBinary2' + test.id); const _id = Random.id(); await collection.insertAsync({ _id @@ -291,7 +291,7 @@ Tinytest.addAsync('collection - updating a document with a binary should return Tinytest.addAsync('collection - updating a document with a binary (sub type 0) should return a document with a uint8array', async function(test) { if (Meteor.isServer) { - const collection = new Mongo.Collection('testBinary7'); + const collection = new Mongo.Collection('testBinary7' + test.id); const _id = Random.id(); await collection.insertAsync({ _id @@ -314,7 +314,7 @@ Tinytest.addAsync('collection - updating a document with a binary (sub type 0) s Tinytest.addAsync('collection - inserting a document with a uint8array should return a document with a uint8array', async function(test) { if (Meteor.isServer) { - const collection = new Mongo.Collection('testBinary3'); + const collection = new Mongo.Collection('testBinary3' + test.id); const _id = Random.id(); await collection.insertAsync({ _id, @@ -336,7 +336,7 @@ Tinytest.addAsync('collection - inserting a document with a uint8array should re Tinytest.addAsync('collection - updating a document with a uint8array should return a document with a uint8array', async function(test) { if (Meteor.isServer) { - const collection = new Mongo.Collection('testBinary4'); + const collection = new Mongo.Collection('testBinary4' + test.id); const _id = Random.id(); await collection.insertAsync({ _id @@ -362,7 +362,7 @@ Tinytest.addAsync('collection - updating a document with a uint8array should ret Tinytest.addAsync('collection - finding with a query with a uint8array field should return the correct document', async function(test) { if (Meteor.isServer) { - const collection = new Mongo.Collection('testBinary5'); + const collection = new Mongo.Collection('testBinary5' + test.id); const _id = Random.id(); await collection.insertAsync({ _id, @@ -382,7 +382,7 @@ Tinytest.addAsync('collection - finding with a query with a uint8array field sho Tinytest.addAsync('collection - finding with a query with a binary field should return the correct document', async function(test) { if (Meteor.isServer) { - const collection = new Mongo.Collection('testBinary6'); + const collection = new Mongo.Collection('testBinary6' + test.id); const _id = Random.id(); await collection.insertAsync({ _id, @@ -475,5 +475,4 @@ Meteor.isServer && Tinytest.addAsync('collection - simple add', async function(t id = await collection.insertAsync({a: 2}); test.equal((await collection.findOneAsync(id)).a, 2); await collection.removeAsync({}); -}) - +}); diff --git a/packages/mongo/mongo.d.ts b/packages/mongo/mongo.d.ts index 72199e0267e..61abd53458c 100644 --- a/packages/mongo/mongo.d.ts +++ b/packages/mongo/mongo.d.ts @@ -107,6 +107,11 @@ export namespace Mongo { byteSize?: number, maxDocuments?: number ): Promise; + + /** + * @deprecated on server since 2.8. Check migration guide {@link https://guide.meteor.com/2.8-migration} + * @see createIndexAsync + */ createIndex( indexSpec: NpmModuleMongodb.IndexSpecification, options?: NpmModuleMongodb.CreateIndexesOptions @@ -150,11 +155,15 @@ export namespace Mongo { ): Cursor>; /** * Finds the first document that matches the selector, as ordered by sort and skip options. Returns `undefined` if no matching document is found. + * @deprecated on server since 2.8. Check migration guide {@link https://guide.meteor.com/2.8-migration} + * @see findOneAsync * @param selector A query describing the documents to find */ findOne(selector?: Selector | ObjectID | string): U | undefined; /** * Finds the first document that matches the selector, as ordered by sort and skip options. Returns `undefined` if no matching document is found. + * @deprecated on server since 2.8. Check migration guide {@link https://guide.meteor.com/2.8-migration} + * @see findOneAsync * @param selector A query describing the documents to find */ findOne, 'limit'>>( @@ -189,6 +198,8 @@ export namespace Mongo { estimatedDocumentCount(options?: NpmModuleMongodb.EstimatedDocumentCountOptions): Promise; /** * Insert a document in the collection. Returns its unique _id. + * @deprecated on server since 2.8. Check migration guide {@link https://guide.meteor.com/2.8-migration} + * @see insertAsync * @param doc The document to insert. May not yet have an _id attribute, in which case Meteor will generate one for you. * @param callback If present, called with an error object as the first argument and, if no error, the _id as the second. */ @@ -211,6 +222,8 @@ export namespace Mongo { rawDatabase(): NpmModuleMongodb.Db; /** * Remove documents from the collection + * @deprecated on server since 2.8. Check migration guide {@link https://guide.meteor.com/2.8-migration} + * @see removeAsync * @param selector Specifies which documents to remove * @param callback If present, called with an error object as its argument. */ @@ -229,6 +242,8 @@ export namespace Mongo { ): Promise; /** * Modify one or more documents in the collection. Returns the number of matched documents. + * @deprecated on server since 2.8. Check migration guide {@link https://guide.meteor.com/2.8-migration} + * @see updateAsync * @param selector Specifies which documents to modify * @param modifier Specifies how to modify the documents * @param callback If present, called with an error object as the first argument and, if no error, the number of affected documents as the second. @@ -274,6 +289,8 @@ export namespace Mongo { /** * Modify one or more documents in the collection, or insert one if no matching documents were found. Returns an object with keys `numberAffected` (the number of documents modified) and * `insertedId` (the unique _id of the document that was inserted, if any). + * @deprecated on server since 2.8. Check migration guide {@link https://guide.meteor.com/2.8-migration} + * @see upsertAsync * @param selector Specifies which documents to modify * @param modifier Specifies how to modify the documents * @param callback If present, called with an error object as the first argument and, if no error, the number of affected documents as the second. @@ -316,6 +333,10 @@ export namespace Mongo { options?: NpmModuleMongodb.CreateIndexesOptions ): void; _dropCollection(): Promise; + /** + * @deprecated on server since 2.8. Check migration guide {@link https://guide.meteor.com/2.8-migration} + * @see dropIndexAsync + */ _dropIndex(indexName: string): void; } @@ -409,6 +430,11 @@ export namespace Mongo { * @param callbacks Functions to call to deliver the result set as it changes */ observe(callbacks: ObserveCallbacks): Meteor.LiveQueryHandle; + /** + * Watch a query. Receive callbacks as the result set changes. + * @param callbacks Functions to call to deliver the result set as it changes + */ + observeAsync(callbacks: ObserveCallbacks): Promise; /** * Watch a query. Receive callbacks as the result set changes. Only the differences between the old and new documents are passed to the callbacks. * @param callbacks Functions to call to deliver the result set as it changes @@ -419,6 +445,15 @@ export namespace Mongo { ): Meteor.LiveQueryHandle; [Symbol.iterator](): Iterator; [Symbol.asyncIterator](): AsyncIterator; + /** + * Watch a query. Receive callbacks as the result set changes. Only the differences between the old and new documents are passed to the callbacks. + * @param callbacks Functions to call to deliver the result set as it changes + * @param options { nonMutatingCallbacks: boolean } + */ + observeChangesAsync( + callbacks: ObserveChangesCallbacks, + options?: { nonMutatingCallbacks?: boolean | undefined } + ): Promise; } var ObjectID: ObjectIDStatic; diff --git a/packages/mongo/mongo_driver.js b/packages/mongo/mongo_driver.js index 8fc3644b861..e6e91b6b6bf 100644 --- a/packages/mongo/mongo_driver.js +++ b/packages/mongo/mongo_driver.js @@ -175,6 +175,9 @@ MongoConnection = function (url, options) { // set it for replSet, it will be ignored if we're not using a replSet. mongoOptions.maxPoolSize = options.maxPoolSize; } + if (_.has(options, 'minPoolSize')) { + mongoOptions.minPoolSize = options.minPoolSize; + } // Transform options like "tlsCAFileAsset": "filename.pem" into // "tlsCAFile": "//filename.pem" @@ -238,6 +241,11 @@ MongoConnection.prototype.close = function () { return this._close(); }; +MongoConnection.prototype._setOplogHandle = function(oplogHandle) { + this._oplogHandle = oplogHandle; + return this; +}; + // Returns the Mongo Collection object; may yield. MongoConnection.prototype.rawCollection = function (collectionName) { var self = this; @@ -722,6 +730,13 @@ var simulateUpsertWithInsertedId = async function (collection, selector, mod, op MongoConnection.prototype.upsertAsync = async function (collectionName, selector, mod, options) { var self = this; + + + if (typeof options === "function" && ! callback) { + callback = options; + options = {}; + } + return self.updateAsync(collectionName, selector, mod, _.extend({}, options, { upsert: true, @@ -920,7 +935,6 @@ Cursor.prototype.getTransform = function () { // When you call Meteor.publish() with a function that returns a Cursor, we need // to transmute it into the equivalent subscription. This is the function that // does that. - Cursor.prototype._publishCursor = function (sub) { var self = this; var collection = self._cursorDescription.collectionName; @@ -940,6 +954,10 @@ Cursor.prototype.observe = function (callbacks) { return LocalCollection._observeFromObserveChanges(self, callbacks); }; +Cursor.prototype.observeAsync = function (callbacks) { + return new Promise(resolve => resolve(this.observe(callbacks))); +}; + Cursor.prototype.observeChanges = function (callbacks, options = {}) { var self = this; var methods = [ @@ -965,6 +983,10 @@ Cursor.prototype.observeChanges = function (callbacks, options = {}) { self._cursorDescription, ordered, callbacks, options.nonMutatingCallbacks); }; +Cursor.prototype.observeChangesAsync = async function (callbacks, options = {}) { + return this.observeChanges(callbacks, options); +}; + MongoConnection.prototype._createSynchronousCursor = function( cursorDescription, options) { var self = this; @@ -1040,8 +1062,14 @@ class AsynchronousCursor { this._visitedIds = new LocalCollection._IdMap; } - [Symbol.iterator]() { - return this._cursor[Symbol.iterator](); + [Symbol.asyncIterator]() { + var cursor = this; + return { + async next() { + const value = await cursor._nextObjectPromise(); + return { done: !value, value }; + }, + }; } // Returns a Promise for the next object from the underlying cursor (before @@ -1429,10 +1457,13 @@ MongoConnection.prototype.tail = function (cursorDescription, docCallback, timeo }; }; +const oplogCollectionWarnings = []; + Object.assign(MongoConnection.prototype, { _observeChanges: async function ( cursorDescription, ordered, callbacks, nonMutatingCallbacks) { var self = this; + const collectionName = cursorDescription.collectionName; if (cursorDescription.options.tailable) { return self._observeChangesTailable(cursorDescription, ordered, callbacks); @@ -1475,7 +1506,8 @@ Object.assign(MongoConnection.prototype, { nonMutatingCallbacks, ); - if (firstHandle) { + const oplogOptions = self?._oplogHandle?._oplogOptions || {}; + const { includeCollections, excludeCollections } = oplogOptions;if (firstHandle) { var matcher, sorter; var canUseOplog = _.all([ function () { @@ -1483,7 +1515,24 @@ Object.assign(MongoConnection.prototype, { // want unordered callbacks, and to not want a callback on the polls // that won't happen. return self._oplogHandle && !ordered && - !callbacks._testOnlyPollCallback; + !callbacks._testOnlyPollCallback;}, function () { + // We also need to check, if the collection of this Cursor is actually being "watched" by the Oplog handle + // if not, we have to fallback to long polling + if (excludeCollections?.length && excludeCollections.includes(collectionName)) { + if (!oplogCollectionWarnings.includes(collectionName)) { + console.warn(`Meteor.settings.packages.mongo.oplogExcludeCollections includes the collection ${collectionName} - your subscriptions will only use long polling!`); + oplogCollectionWarnings.push(collectionName); // we only want to show the warnings once per collection! + } + return false; + } + if (includeCollections?.length && !includeCollections.includes(collectionName)) { + if (!oplogCollectionWarnings.includes(collectionName)) { + console.warn(`Meteor.settings.packages.mongo.oplogIncludeCollections does not include the collection ${collectionName} - your subscriptions will only use long polling!`); + oplogCollectionWarnings.push(collectionName); // we only want to show the warnings once per collection! + } + return false; + } + return true; }, function () { // We need to be able to compile the selector. Fall back to polling for // some newfangled $selector that minimongo doesn't support yet. @@ -1547,9 +1596,9 @@ Object.assign(MongoConnection.prototype, { // listenCallback is the same kind of (notification, complete) callback passed // to InvalidationCrossbar.listen. -listenAll = function (cursorDescription, listenCallback) { - var listeners = []; - forEachTrigger(cursorDescription, function (trigger) { +listenAll = async function (cursorDescription, listenCallback) { + const listeners = []; + await forEachTrigger(cursorDescription, function (trigger) { listeners.push(DDPServer._InvalidationCrossbar.listen( trigger, listenCallback)); }); @@ -1563,20 +1612,20 @@ listenAll = function (cursorDescription, listenCallback) { }; }; -forEachTrigger = function (cursorDescription, triggerCallback) { - var key = {collection: cursorDescription.collectionName}; - var specificIds = LocalCollection._idsMatchedBySelector( +forEachTrigger = async function (cursorDescription, triggerCallback) { + const key = {collection: cursorDescription.collectionName}; + const specificIds = LocalCollection._idsMatchedBySelector( cursorDescription.selector); if (specificIds) { - _.each(specificIds, function (id) { - triggerCallback(_.extend({id: id}, key)); - }); - triggerCallback(_.extend({dropCollection: true, id: null}, key)); + for (const id of specificIds) { + await triggerCallback(_.extend({id: id}, key)); + } + await triggerCallback(_.extend({dropCollection: true, id: null}, key)); } else { - triggerCallback(key); + await triggerCallback(key); } // Everyone cares about the database being dropped. - triggerCallback({ dropDatabase: true }); + await triggerCallback({ dropDatabase: true }); }; // observeChanges for tailable cursors on capped collections. diff --git a/packages/mongo/mongo_livedata_tests.js b/packages/mongo/mongo_livedata_tests.js index 98814138f25..0eaa9135fa2 100644 --- a/packages/mongo/mongo_livedata_tests.js +++ b/packages/mongo/mongo_livedata_tests.js @@ -239,14 +239,10 @@ _.each( [ 'MONGO', 'STRING'], function(idGeneration) { const callOp = async function(callback) { try { - let result; if (op === 'updateAsync') { - result = await ftc[op](arg, arg2); + await ftc[op](arg, arg2); } else { - result = await ftc[op](arg); - } - if (result?.stubValuePromise) { - await result.stubValuePromise; + await ftc[op](arg); } } catch (e) { callback(e); @@ -266,7 +262,6 @@ _.each( [ 'MONGO', 'STRING'], function(idGeneration) { // This would log to console in normal operation. Meteor._suppress_log(1); - await callOp(); } } } catch (e) {} @@ -1667,7 +1662,7 @@ _.each( [ 'MONGO', 'STRING'], function(idGeneration) { const testWidget = { name: 'Widget name', }; - const insertDetails = await coll.upsertAsync(testWidget._id, testWidget, { returnStubValue: true }); + const insertDetails = await coll.upsertAsync(testWidget._id, testWidget); test.equal( await coll.findOneAsync(insertDetails.insertedId), Object.assign({ _id: insertDetails.insertedId }, testWidget) @@ -2825,7 +2820,7 @@ testAsyncMulti("mongo-livedata - specified _id", [ // Consistent id generation tests async function collectionInsert (test, expect, coll, index) { const id = await coll.insertAsync({name: "foo"}); - const o = await coll.findOneAsync(id); + const o = await coll.findOneAsync(id) || {}; test.isTrue(_.isObject(o)); test.equal(o.name, 'foo'); } @@ -2860,7 +2855,6 @@ async function collectionUpsertExisting(test, expect, coll, index) { async function functionCallsInsert(test, expect, coll, index) { const ids = await Meteor.callAsync( 'insertObjects', - { returnStubValue: Meteor.isClient }, coll._name, { name: 'foo' }, 1, @@ -2881,7 +2875,6 @@ async function functionCallsUpsert(test, expect, coll, index) { const upsertId = '123456' + index; const result = await Meteor.callAsync( 'upsertObject', - { returnStubValue: Meteor.isClient }, coll._name, upsertId, { @@ -2905,7 +2898,6 @@ async function functionCallsUpsertExisting(test, expect, coll, index) { const result = await Meteor.callAsync( 'upsertObject', - { returnStubValue: Meteor.isClient }, coll._name, id, { @@ -2923,7 +2915,6 @@ async function functionCallsUpsertExisting(test, expect, coll, index) { async function functionCalls3Inserts(test, expect, coll, index) { const ids = await Meteor.callAsync( 'insertObjects', - { returnStubValue: Meteor.isClient }, coll._name, { name: 'foo' }, 3 @@ -2944,7 +2935,6 @@ async function functionCalls3Inserts(test, expect, coll, index) { async function functionChainInsert(test, expect, coll, index) { const ids = await Meteor.callAsync( 'doMeteorCall', - { returnStubValue: Meteor.isClient }, 'insertObjects', coll._name, { name: 'foo' }, @@ -2966,7 +2956,6 @@ async function functionChainInsert(test, expect, coll, index) { async function functionChain2Insert(test, expect, coll, index) { const ids = await Meteor.callAsync( 'doMeteorCall', - { returnStubValue: Meteor.isClient }, 'doMeteorCall', 'insertObjects', coll._name, @@ -2990,7 +2979,6 @@ async function functionChain2Upsert(test, expect, coll, index) { const upsertId = '123456' + index; const result = await Meteor.callAsync( 'doMeteorCall', - { returnStubValue: Meteor.isClient }, 'doMeteorCall', 'upsertObject', coll._name, @@ -3031,7 +3019,7 @@ _.each( ' collections, idGeneration=' + idGeneration, [ - function(test) { + function(test, expect) { var collectionOptions = { idGeneration: idGeneration }; var cleanups = (this.cleanups = []); @@ -3043,7 +3031,7 @@ _.each( collectionName, collectionOptions ); - Meteor.subscribe('c-' + collectionName); + Meteor.subscribe('c-' + collectionName, expect()); cleanups.push(async function(expect) { await Meteor.callAsync( 'dropInsecureCollection', @@ -3706,12 +3694,12 @@ EJSON.addType('someCustomType', function (json) { }); testAsyncMulti('mongo-livedata - oplog - update EJSON', [ - async function(test) { + async function(test, expect) { var self = this; var collectionName = 'ejson' + Random.id(); if (Meteor.isClient) { - Meteor.call('createInsecureCollection', collectionName); - Meteor.subscribe('c-' + collectionName); + await Meteor.callAsync('createInsecureCollection', collectionName); + Meteor.subscribe('c-' + collectionName, expect()); } self.collection = new Mongo.Collection(collectionName); @@ -3724,7 +3712,6 @@ testAsyncMulti('mongo-livedata - oplog - update EJSON', [ oi: self.objId, custom: new TestCustomType('a', 'b'), }, - { returnServerResultPromise: true } ); }, async function(test, expect) { @@ -4046,12 +4033,12 @@ if (Meteor.isClient) { var self = this; self.nonce = Random.id(); const r = await Meteor.callAsync('fenceOnBeforeFireError1', self.nonce); - test.isTrue(await r.stubValuePromise); + test.isTrue(r); }, async function(test, expect) { var self = this; const r = await Meteor.callAsync('fenceOnBeforeFireError2', self.nonce); - test.isTrue(await r.stubValuePromise); + test.isTrue(r); }, ]); } else { @@ -4272,3 +4259,267 @@ if (Meteor.isServer) { }); }); } + +if (Meteor.isServer) { + Tinytest.addAsync('mongo-livedata - asyncIterator', async function(test) { + const Collection = new Mongo.Collection(`asynciterator_test_${test.runId()}`); + + await Collection.insertAsync({ _id: 'a' }); + await Collection.insertAsync({ _id: 'b' }); + + let itemIds = []; + for await (const item of Collection.find()) { + itemIds.push(item._id); + } + test.equal(itemIds.length, 2); + test.equal(itemIds, ['a', 'b']); + }); +} + +Tinytest.addAsync( + 'mongo-livedata - maintained isomorphism on collection operations for both client and server', + async function (test) { + const Collection = new Mongo.Collection( + `maintained_col_op_iso${test.runId()}`, + { resolverType: 'stub' } + ); + + await Collection.insertAsync({ _id: 'a' }); + await Collection.insertAsync({ _id: 'b' }); + + let items = await Collection.find().fetchAsync(); + let itemIds = items.map(_item => _item._id); + + test.equal(itemIds, ['a', 'b']); + + await Collection.updateAsync({ _id: 'a' }, { $set: { num: 1 } }); + await Collection.updateAsync({ _id: 'b' }, { $set: { num: 2 } }); + + items = await Collection.find().fetchAsync(); + itemIds = items.map(_item => _item.num); + + test.equal(itemIds, [1, 2]); + + await Collection.removeAsync({ _id: 'a' }); + await Collection.removeAsync({ _id: 'b' }); + + items = await Collection.find().fetchAsync(); + + test.equal(items, []); + }, +); + +testAsyncMulti( + 'mongo-livedata - collection async operations data persistence', + [ + async function (test) { + // Using remote collection + const Collection = new Mongo.Collection( + `remoteop_persistence${test.runId()}`, + { + resolverType: Meteor.isClient ? 'stub' : 'server', + }, + ); + + await Collection.insertAsync({ _id: 'a' }); + await Collection.updateAsync({ _id: 'a' }, { $set: { num: 1 } }); + const insertedId = await Collection.insertAsync({ num: 2 }); + + let items = await Collection.find().fetchAsync(); + let itemIds = items.map(_item => _item._id); + test.equal(itemIds, ['a', insertedId]); // temporary data accessible + + const aItem = items[0]; + const insertedItem = items[1]; + test.equal(aItem?.num, 1); + test.equal(insertedItem?.num, 2); + + await Collection.removeAsync({ _id: insertedId }); + + items = await Collection.find().fetchAsync(); + itemIds = items.map(_item => _item._id); + + test.equal(itemIds, ['a']); // temporary data accessible + + if (Meteor.isClient) { + return waitUntil(async () => { + items = await Collection.find().fetchAsync(); + itemIds = items.map(_item => _item._id); + return itemIds?.length === []?.length; // data IS NOT persisted + }, { description: 'data IS NOT persisted'}); + } + + return Promise.resolve(); + }, + async function (test) { + // Using local collection + const Collection = new Mongo.Collection( + `localop_persistence${test.runId()}`, + ); + + await Collection._collection.insertAsync({ _id: 'a' }); + await Collection._collection.updateAsync( + { _id: 'a' }, + { $set: { num: 1 } }, + ); + const insertedId = await Collection._collection.insertAsync({ num: 2 }); + + let items = await Collection.find().fetchAsync(); + let itemIds = items.map(_item => _item._id); + test.equal(itemIds, ['a', insertedId]); // temporary data accessible + + const aItem = items[0]; + const insertedItem = items[1]; + test.equal(aItem?.num, 1); + test.equal(insertedItem?.num, 2); + + await Collection._collection.removeAsync({ _id: insertedId }); + + items = await Collection.find().fetchAsync(); + itemIds = items.map(_item => _item._id); + + test.equal(itemIds, ['a']); // temporary data accessible + + if (Meteor.isClient) { + return waitUntil(async () => { + items = await Collection.find().fetchAsync(); + itemIds = items.map(_item => _item._id); + return itemIds?.length === 1 && itemIds[0] === 'a'; // data is persisted + }, { description: 'data is persisted'}); + } + + return Promise.resolve(); + }, + async function (test) { + // Using methods + const Collection = new Mongo.Collection( + `methodop_persistence${test.runId()}`, + ); + Collection.allow({ + insertAsync() { + return true; + }, + insert() { + return true; + }, + }); + + Meteor.methods({ + [`insertMethodPersistence${test.runId()}`]: async () => { + await Collection.insertAsync({ _id: 'a' }); + }, + }); + + const promise = Meteor.callAsync( + `insertMethodPersistence${test.runId()}`, + ); + + let items; + let itemIds; + if (Meteor.isServer) { + await promise; + + items = await Collection.find().fetchAsync(); + itemIds = items.map(_item => _item._id); + + test.equal(itemIds, ['a']); // temporary data accessible + } + + if (Meteor.isClient) { + await promise.stubPromise; + + items = await Collection.find().fetchAsync(); + itemIds = items.map(_item => _item._id); + + test.equal(itemIds, ['a']); // temporary data accessible + + try { + await promise.serverPromise; + } catch (e) { + // error as no insert method enabled on server + return waitUntil(async () => { + items = await Collection.find().fetchAsync(); + itemIds = items.map(_item => _item._id); + return itemIds?.length === []?.length ; // data IS NOT persisted + }, { description: 'data IS NOT persisted'}); + } + } else { + return Promise.resolve(); + } + }, + ], +); + +testAsyncMulti( + "mongo-livedata - support observeChangesAsync and observeAsync to keep isomorphism on client and server", + [ + async (test) => { + const Collection = new Mongo.Collection( + `observe_changes_async${test.runId()}`, + { resolverType: 'stub' } + ); + const id = 'a'; + await Collection.insertAsync({ _id: id, foo: { bar: 123 } }); + + return new Promise(async (resolve) => { + const obs = await Collection.find(id).observeChangesAsync({ + async changed(_id, fields) { + await obs.stop(); + resolve(); + test.equal(_id, id); + test.equal(fields?.foo?.bar, 456); + }, + }); + await Collection.updateAsync(id, { $set: { 'foo.bar': 456 } }); + }); + }, + async (test) => { + const Collection = new Mongo.Collection(`observe_async${test.runId()}`, { + resolverType: 'stub', + }); + const id = 'a'; + await Collection.insertAsync({ _id: id, foo: { bar: 123 } }); + + return new Promise(async (resolve) => { + const obs = await Collection.find(id).observeAsync({ + async changed(newDocument) { + await obs.stop(); + test.equal(newDocument._id, id); + test.equal(newDocument?.foo?.bar, 456); + resolve(); + }, + }); + await Collection.updateAsync(id, { $set: { 'foo.bar': 456 } }); + }); + }, + ] +); + + +Meteor.methods({ + [`methodThrowException`]: async () => { + if (Meteor.isClient) { + throw new Meteor.Error('Throw on client'); + } + }, +}); + +Tinytest.addAsync( + 'mongo-livedata - both stub and server promise throw exceptions when client errors', + async function (test) { + const promise = Meteor.callAsync('methodThrowException'); + if (Meteor.isClient) { + try { + await promise.stubPromise; + } catch (err) { + test.equal(err.error, 'Throw on client'); + } + + try { + await promise.serverPromise; + } catch (err) { + test.equal(err.error, 'Throw on client'); + } + } + }, +); diff --git a/packages/mongo/oplog_observe_driver.js b/packages/mongo/oplog_observe_driver.js index 8a9cf111e93..77160e40e2e 100644 --- a/packages/mongo/oplog_observe_driver.js +++ b/packages/mongo/oplog_observe_driver.js @@ -1,4 +1,5 @@ import { oplogV2V1Converter } from "./oplog_v2_converter"; +import { check, Match } from 'meteor/check'; var PHASE = { QUERYING: "QUERYING", @@ -28,7 +29,7 @@ var currentId = 0; // callbacks (and a ready() invocation) to the ObserveMultiplexer, and you stop // it by calling the stop() method. OplogObserveDriver = function (options) { - var self = this; + const self = this; self._usesOplog = true; // tests look at this self._id = currentId; @@ -42,10 +43,10 @@ OplogObserveDriver = function (options) { throw Error("OplogObserveDriver only supports unordered observeChanges"); } - var sorter = options.sorter; + const sorter = options.sorter; // We don't support $near and other geo-queries so it's OK to initialize the // comparator only once in the constructor. - var comparator = sorter && sorter.getComparator(); + const comparator = sorter && sorter.getComparator(); if (options.cursorDescription.options.limit) { // There are several properties ordered driver implements: @@ -57,7 +58,7 @@ OplogObserveDriver = function (options) { // into published set. // - _published - Max Heap (also implements IdMap methods) - var heapOptions = { IdMap: LocalCollection._IdMap }; + const heapOptions = { IdMap: LocalCollection._IdMap }; self._limit = self._cursorDescription.options.limit; self._comparator = comparator; self._sorter = sorter; @@ -79,6 +80,12 @@ OplogObserveDriver = function (options) { self._stopped = false; self._stopHandles = []; + self._addStopHandles = function (newStopHandles) { + const expectedPattern = Match.ObjectIncluding({ stop: Function }); + // Single item or array + check(newStopHandles, Match.OneOf([expectedPattern], expectedPattern)); + self._stopHandles.push(newStopHandles); + } Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact( "mongo-livedata", "observe-drivers-oplog", 1); @@ -88,7 +95,7 @@ OplogObserveDriver = function (options) { self._matcher = options.matcher; // we are now using projection, not fields in the cursor description even if you pass {fields} // in the cursor construction - var projection = self._cursorDescription.options.fields || self._cursorDescription.options.projection || {}; + const projection = self._cursorDescription.options.fields || self._cursorDescription.options.projection || {}; self._projectionFn = LocalCollection._compileProjection(projection); // Projection function, result of combining important fields for selector and // existing fields projection @@ -105,90 +112,94 @@ OplogObserveDriver = function (options) { self._requeryWhenDoneThisQuery = false; self._writesToCommitWhenWeReachSteady = []; - // If the oplog handle tells us that it skipped some entries (because it got - // behind, say), re-poll. - self._stopHandles.push(self._mongoHandle._oplogHandle.onSkippedEntries( - finishIfNeedToPollQuery(function () { - return self._needToPollQuery(); - }) - )); - - forEachTrigger(self._cursorDescription, function (trigger) { - self._stopHandles.push(self._mongoHandle._oplogHandle.onOplogEntry( - trigger, function (notification) { - finishIfNeedToPollQuery(function () { - var op = notification.op; - if (notification.dropCollection || notification.dropDatabase) { - // Note: this call is not allowed to block on anything (especially - // on waiting for oplog entries to catch up) because that will block - // onOplogEntry! - return self._needToPollQuery(); - } else { - // All other operators should be handled depending on phase - if (self._phase === PHASE.QUERYING) { - return self._handleOplogEntryQuerying(op); - } else { - return self._handleOplogEntrySteadyOrFetching(op); - } - } - })(); - } - )); - }); - - // XXX ordering w.r.t. everything else? - self._stopHandles.push(listenAll( - self._cursorDescription, function () { - // If we're not in a pre-fire write fence, we don't have to do anything. - var fence = DDPServer._getCurrentFence(); - if (!fence || fence.fired) - return; - - if (fence._oplogObserveDrivers) { - fence._oplogObserveDrivers[self._id] = self; - return; - } - - fence._oplogObserveDrivers = {}; - fence._oplogObserveDrivers[self._id] = self; - fence.onBeforeFire(async function () { - var drivers = fence._oplogObserveDrivers; - delete fence._oplogObserveDrivers; - // This fence cannot fire until we've caught up to "this point" in the - // oplog, and all observers made it back to the steady state. - await self._mongoHandle._oplogHandle.waitUntilCaughtUp(); - - for (const driver of Object.values(drivers)) { - if (driver._stopped) - continue; - - var write = await fence.beginWrite(); - if (driver._phase === PHASE.STEADY) { - // Make sure that all of the callbacks have made it through the - // multiplexer and been delivered to ObserveHandles before committing - // writes. - await driver._multiplexer.onFlush(write.committed); - } else { - driver._writesToCommitWhenWeReachSteady.push(write); - } - } - }); - } - )); - - // When Mongo fails over, we need to repoll the query, in case we processed an - // oplog entry that got rolled back. - self._stopHandles.push(self._mongoHandle._onFailover(finishIfNeedToPollQuery( - function () { - return self._needToPollQuery(); - }))); -}; + }; _.extend(OplogObserveDriver.prototype, { - _init: function() { + _init: async function() { const self = this; + + // If the oplog handle tells us that it skipped some entries (because it got + // behind, say), re-poll. + self._addStopHandles(self._mongoHandle._oplogHandle.onSkippedEntries( + finishIfNeedToPollQuery(function () { + return self._needToPollQuery(); + }) + )); + + await forEachTrigger(self._cursorDescription, async function (trigger) { + self._addStopHandles(await self._mongoHandle._oplogHandle.onOplogEntry( + trigger, function (notification) { + finishIfNeedToPollQuery(function () { + const op = notification.op; + if (notification.dropCollection || notification.dropDatabase) { + // Note: this call is not allowed to block on anything (especially + // on waiting for oplog entries to catch up) because that will block + // onOplogEntry! + return self._needToPollQuery(); + } else { + // All other operators should be handled depending on phase + if (self._phase === PHASE.QUERYING) { + return self._handleOplogEntryQuerying(op); + } else { + return self._handleOplogEntrySteadyOrFetching(op); + } + } + })(); + } + )); + }); + + // XXX ordering w.r.t. everything else? + self._addStopHandles(await listenAll( + self._cursorDescription, function () { + // If we're not in a pre-fire write fence, we don't have to do anything. + const fence = DDPServer._getCurrentFence(); + if (!fence || fence.fired) + return; + + if (fence._oplogObserveDrivers) { + fence._oplogObserveDrivers[self._id] = self; + return; + } + + fence._oplogObserveDrivers = {}; + fence._oplogObserveDrivers[self._id] = self; + + fence.onBeforeFire(async function () { + const drivers = fence._oplogObserveDrivers; + delete fence._oplogObserveDrivers; + + // This fence cannot fire until we've caught up to "this point" in the + // oplog, and all observers made it back to the steady state. + await self._mongoHandle._oplogHandle.waitUntilCaughtUp(); + + for (const driver of Object.values(drivers)) { + if (driver._stopped) + continue; + + const write = await fence.beginWrite(); + if (driver._phase === PHASE.STEADY) { + // Make sure that all of the callbacks have made it through the + // multiplexer and been delivered to ObserveHandles before committing + // writes. + await driver._multiplexer.onFlush(write.committed); + } else { + driver._writesToCommitWhenWeReachSteady.push(write); + } + } + }); + } + )); + + // When Mongo fails over, we need to repoll the query, in case we processed an + // oplog entry that got rolled back. + self._addStopHandles(self._mongoHandle._onFailover(finishIfNeedToPollQuery( + function () { + return self._needToPollQuery(); + }))); + // Give _observeChanges a chance to add the new ObserveHandle to our // multiplexer, so that the added calls get streamed. return self._runInitialQuery(); diff --git a/packages/mongo/oplog_tailing.js b/packages/mongo/oplog_tailing.js index 5f61d06681c..d1d99e46daf 100644 --- a/packages/mongo/oplog_tailing.js +++ b/packages/mongo/oplog_tailing.js @@ -27,6 +27,7 @@ OplogHandle = function (oplogUrl, dbName) { self._oplogLastEntryConnection = null; self._oplogTailConnection = null; + self._oplogOptions = null; self._stopped = false; self._tailHandle = null; self._readyPromiseResolver = null; @@ -77,10 +78,12 @@ OplogHandle = function (oplogUrl, dbName) { self._entryQueue = new Meteor._DoubleEndedQueue(); self._workerActive = false; - const shouldAwait = self._startTailing(); + self._startTrailingPromise = self._startTailing(); //TODO[fibers] Why wait? }; +MongoInternals.OplogHandle = OplogHandle; + Object.assign(OplogHandle.prototype, { stop: async function () { var self = this; @@ -189,7 +192,7 @@ Object.assign(OplogHandle.prototype, { // currently visible. // XXX become convinced that this is actually safe even if oplogConnection // is some kind of pool - waitUntilCaughtUp: function () { + waitUntilCaughtUp: async function () { return this._waitUntilCaughtUp(); }, @@ -214,12 +217,12 @@ Object.assign(OplogHandle.prototype, { // The tail connection will only ever be running a single tail command, so // it only needs to make one underlying TCP connection. self._oplogTailConnection = new MongoConnection( - self._oplogUrl, {maxPoolSize: 1}); + self._oplogUrl, {maxPoolSize: 1, minPoolSize: 1}); // XXX better docs, but: it's to get monotonic results // XXX is it safe to say "if there's an in flight query, just use its // results"? I don't think so but should consider that self._oplogLastEntryConnection = new MongoConnection( - self._oplogUrl, {maxPoolSize: 1}); + self._oplogUrl, {maxPoolSize: 1, minPoolSize: 1}); // Now, make sure that there actually is a repl set here. If not, oplog @@ -257,6 +260,40 @@ Object.assign(OplogHandle.prototype, { self._lastProcessedTS = lastOplogEntry.ts; } + // These 2 settings allow you to either only watch certain collections (oplogIncludeCollections), or exclude some collections you don't want to watch for oplog updates (oplogExcludeCollections) + // Usage: + // settings.json = { + // "packages": { + // "mongo": { + // "oplogExcludeCollections": ["products", "prices"] // This would exclude both collections "products" and "prices" from any oplog tailing. + // Beware! This means, that no subscriptions on these 2 collections will update anymore! + // } + // } + // } + const includeCollections = Meteor.settings?.packages?.mongo?.oplogIncludeCollections; + const excludeCollections = Meteor.settings?.packages?.mongo?.oplogExcludeCollections; + if (includeCollections?.length && excludeCollections?.length) { + throw new Error("Can't use both mongo oplog settings oplogIncludeCollections and oplogExcludeCollections at the same time."); + } + if (excludeCollections?.length) { + oplogSelector.ns = { + $regex: oplogSelector.ns, + $nin: excludeCollections.map((collName) => `${self._dbName}.${collName}`) + } + self._oplogOptions = { excludeCollections }; + } + else if (includeCollections?.length) { + oplogSelector = { $and: [ + { $or: [ + { ns: /^admin\.\$cmd/ }, + { ns: { $in: includeCollections.map((collName) => `${self._dbName}.${collName}`) } } + ] }, + { $or: oplogSelector.$or }, // the initial $or to select only certain operations (op) + { ts: oplogSelector.ts } + ] }; + self._oplogOptions = { includeCollections }; + } + var cursorDescription = new CursorDescription( OPLOG_COLLECTION, oplogSelector, {tailable: true}); diff --git a/packages/mongo/oplog_tests.js b/packages/mongo/oplog_tests.js index 455dd9f57eb..55643c0922e 100644 --- a/packages/mongo/oplog_tests.js +++ b/packages/mongo/oplog_tests.js @@ -1,4 +1,5 @@ -var OplogCollection = new Mongo.Collection("oplog-" + Random.id()); +var randomId = Random.id(); +var OplogCollection = new Mongo.Collection("oplog-" + randomId); Tinytest.addAsync('mongo-livedata - oplog - cursorSupported', async function( test @@ -177,6 +178,116 @@ process.env.MONGO_OPLOG_URL && }, ]); +const defaultOplogHandle = MongoInternals.defaultRemoteCollectionDriver().mongo._oplogHandle; +let previousMongoPackageSettings = {}; + +async function oplogOptionsTest({ + test, + includeCollectionName, + excludeCollectionName, + mongoPackageSettings = {} +}) { + try { + previousMongoPackageSettings = { ...(Meteor.settings?.packages?.mongo || {}) }; + if (!Meteor.settings.packages) Meteor.settings.packages = {}; + Meteor.settings.packages.mongo = mongoPackageSettings; + + const myOplogHandle = new MongoInternals.OplogHandle(process.env.MONGO_OPLOG_URL, 'meteor'); + await myOplogHandle._startTrailingPromise; + MongoInternals.defaultRemoteCollectionDriver().mongo._setOplogHandle(myOplogHandle); + + const IncludeCollection = new Mongo.Collection(includeCollectionName); + const ExcludeCollection = new Mongo.Collection(excludeCollectionName); + + const shouldBeTracked = new Promise((resolve) => { + IncludeCollection.find({ include: 'yes' }).observeChanges({ + added(id, fields) { resolve(true) } + }); + }); + const shouldBeIgnored = new Promise((resolve, reject) => { + ExcludeCollection.find({ include: 'no' }).observeChanges({ + added(id, fields) { + // should NOT fire, because this is an excluded collection: + reject(false); + } + }); + // we give it just 2 seconds until we resolve this promise: + setTimeout(() => { + resolve(true); + }, 2000); + }); + + // do the inserts: + await IncludeCollection.rawCollection().insertOne({ include: 'yes', foo: 'bar' }); + await ExcludeCollection.rawCollection().insertOne({ include: 'no', foo: 'bar' }); + + test.equal(await shouldBeTracked, true); + test.equal(await shouldBeIgnored, true); + } finally { + // Reset: + Meteor.settings.packages.mongo = { ...previousMongoPackageSettings }; + MongoInternals.defaultRemoteCollectionDriver().mongo._setOplogHandle(defaultOplogHandle); + } +} + +process.env.MONGO_OPLOG_URL && Tinytest.addAsync( + 'mongo-livedata - oplog - oplogSettings - oplogExcludeCollections', + async test => { + const collectionNameA = "oplog-a-" + Random.id(); + const collectionNameB = "oplog-b-" + Random.id(); + const mongoPackageSettings = { + oplogExcludeCollections: [collectionNameB] + }; + await oplogOptionsTest({ + test, + includeCollectionName: collectionNameA, + excludeCollectionName: collectionNameB, + mongoPackageSettings + }); + } +); + +process.env.MONGO_OPLOG_URL && Tinytest.addAsync( + 'mongo-livedata - oplog - oplogSettings - oplogIncludeCollections', + async test => { + const collectionNameA = "oplog-a-" + Random.id(); + const collectionNameB = "oplog-b-" + Random.id(); + const mongoPackageSettings = { + oplogIncludeCollections: [collectionNameB] + }; + await oplogOptionsTest({ + test, + includeCollectionName: collectionNameB, + excludeCollectionName: collectionNameA, + mongoPackageSettings + }); + } +); + +process.env.MONGO_OPLOG_URL && Tinytest.addAsync( + 'mongo-livedata - oplog - oplogSettings - oplogExcludeCollections & oplogIncludeCollections', + async test => { + // should fail, because we don't allow including and excluding at the same time! + const collectionNameA = "oplog-a-" + Random.id(); + const collectionNameB = "oplog-b-" + Random.id(); + const mongoPackageSettings = { + oplogIncludeCollections: [collectionNameA], + oplogExcludeCollections: [collectionNameB] + }; + try { + await oplogOptionsTest({ + test, + includeCollectionName: collectionNameA, + excludeCollectionName: collectionNameB, + mongoPackageSettings + }); + test.fail(); + } catch (err) { + test.expect_fail(); + } + } +); + // TODO this is commented for now, but we need to find out the cause // PR: https://github.com/meteor/meteor/pull/12057 // Meteor.isServer && Tinytest.addAsync( diff --git a/packages/mongo/oplog_v2_converter.js b/packages/mongo/oplog_v2_converter.js index 43c6e64411f..6cb6b4c7268 100644 --- a/packages/mongo/oplog_v2_converter.js +++ b/packages/mongo/oplog_v2_converter.js @@ -47,7 +47,8 @@ function isArrayOperator(operator) { } function flattenObjectInto(target, source, prefix) { - if (Array.isArray(source) || typeof source !== 'object' || source === null) { + if (Array.isArray(source) || typeof source !== 'object' || source === null || + source instanceof Mongo.ObjectID) { target[prefix] = source; } else { const entries = Object.entries(source); diff --git a/packages/mongo/oplog_v2_converter_tests.js b/packages/mongo/oplog_v2_converter_tests.js index 79bcbada93c..89c95c55876 100644 --- a/packages/mongo/oplog_v2_converter_tests.js +++ b/packages/mongo/oplog_v2_converter_tests.js @@ -77,6 +77,10 @@ const cases = [ { $v: 2, diff: { u: { params: { e: { _str: '5f953cde8ceca90030bdb86f' } } } } }, { $v: 2, $set: { params: { e: { _str: '5f953cde8ceca90030bdb86f' } } } }, ], + [ + { $v: 2, diff: { i: { id: new Mongo.ObjectID('ffffffffffffffffffffffff') } } }, + { $v: 2, $set: { id: new Mongo.ObjectID('ffffffffffffffffffffffff') } }, + ], [ { $v: 2, diff --git a/packages/mongo/package.js b/packages/mongo/package.js index cdc7454e63b..ff895d1cb01 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: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Npm.depends({ diff --git a/packages/mongo/polling_observe_driver.js b/packages/mongo/polling_observe_driver.js index 3948a345faf..13da97b3c0f 100644 --- a/packages/mongo/polling_observe_driver.js +++ b/packages/mongo/polling_observe_driver.js @@ -2,7 +2,8 @@ var POLLING_THROTTLE_MS = +process.env.METEOR_POLLING_THROTTLE_MS || 50; var POLLING_INTERVAL_MS = +process.env.METEOR_POLLING_INTERVAL_MS || 10 * 1000; PollingObserveDriver = function (options) { - var self = this; + const self = this; + self._options = options; self._cursorDescription = options.cursorDescription; self._mongoHandle = options.mongoHandle; @@ -37,47 +38,51 @@ PollingObserveDriver = function (options) { // XXX figure out if we still need a queue self._taskQueue = new Meteor._AsynchronousQueue(); - var listenersHandle = listenAll( - self._cursorDescription, function (notification) { - // When someone does a transaction that might affect us, schedule a poll - // of the database. If that transaction happens inside of a write fence, - // block the fence until we've polled and notified observers. - var fence = DDPServer._getCurrentFence(); - if (fence) - self._pendingWrites.push(fence.beginWrite()); - // Ensure a poll is scheduled... but if we already know that one is, - // don't hit the throttled _ensurePollIsScheduled function (which might - // lead to us calling it unnecessarily in ms). - if (self._pollsScheduledButNotStarted === 0) - self._ensurePollIsScheduled(); - } - ); - self._stopCallbacks.push(async function () { await listenersHandle.stop(); }); - - // every once and a while, poll even if we don't think we're dirty, for - // eventual consistency with database writes from outside the Meteor - // universe. - // - // For testing, there's an undocumented callback argument to observeChanges - // which disables time-based polling and gets called at the beginning of each - // poll. - if (options._testOnlyPollCallback) { - self._testOnlyPollCallback = options._testOnlyPollCallback; - } else { - var pollingInterval = - self._cursorDescription.options.pollingIntervalMs || - self._cursorDescription.options._pollingInterval || // COMPAT with 1.2 - POLLING_INTERVAL_MS; - var intervalHandle = Meteor.setInterval( - _.bind(self._ensurePollIsScheduled, self), pollingInterval); - self._stopCallbacks.push(function () { - Meteor.clearInterval(intervalHandle); - }); - } + }; _.extend(PollingObserveDriver.prototype, { _init: async function () { + const self = this; + const options = self._options; + const listenersHandle = await listenAll( + self._cursorDescription, function (notification) { + // When someone does a transaction that might affect us, schedule a poll + // of the database. If that transaction happens inside of a write fence, + // block the fence until we've polled and notified observers. + const fence = DDPServer._getCurrentFence(); + if (fence) + self._pendingWrites.push(fence.beginWrite()); + // Ensure a poll is scheduled... but if we already know that one is, + // don't hit the throttled _ensurePollIsScheduled function (which might + // lead to us calling it unnecessarily in ms). + if (self._pollsScheduledButNotStarted === 0) + self._ensurePollIsScheduled(); + } + ); + self._stopCallbacks.push(async function () { await listenersHandle.stop(); }); + + // every once and a while, poll even if we don't think we're dirty, for + // eventual consistency with database writes from outside the Meteor + // universe. + // + // For testing, there's an undocumented callback argument to observeChanges + // which disables time-based polling and gets called at the beginning of each + // poll. + if (options._testOnlyPollCallback) { + self._testOnlyPollCallback = options._testOnlyPollCallback; + } else { + const pollingInterval = + self._cursorDescription.options.pollingIntervalMs || + self._cursorDescription.options._pollingInterval || // COMPAT with 1.2 + POLLING_INTERVAL_MS; + const intervalHandle = Meteor.setInterval( + _.bind(self._ensurePollIsScheduled, self), pollingInterval); + self._stopCallbacks.push(function () { + Meteor.clearInterval(intervalHandle); + }); + } + // Make sure we actually poll soon! await this._unthrottledEnsurePollIsScheduled(); diff --git a/packages/non-core/blaze b/packages/non-core/blaze index 05f879ccf59..6cda4d23e30 160000 --- a/packages/non-core/blaze +++ b/packages/non-core/blaze @@ -1 +1 @@ -Subproject commit 05f879ccf5923bb99178ffb594563fbb65983653 +Subproject commit 6cda4d23e30c94bc99b497fd8fadfdb0d22cbed2 diff --git a/packages/non-core/less/.versions b/packages/non-core/less/.versions index 703024e52f8..848b711c599 100644 --- a/packages/non-core/less/.versions +++ b/packages/non-core/less/.versions @@ -1,55 +1,58 @@ -allow-deny@1.1.0 -babel-compiler@7.6.2 -babel-runtime@1.5.0 -base64@1.0.12 -binary-heap@1.0.11 -blaze@2.3.4 -boilerplate-generator@1.7.1 -caching-compiler@1.2.2 -callback-hook@1.3.1 -check@1.3.2 -ddp@1.4.0 -ddp-client@2.5.0 -ddp-common@1.4.0 -ddp-server@2.4.0 -diff-sequence@1.1.1 -dynamic-import@0.7.1 -ecmascript@0.15.2 -ecmascript-runtime@0.7.0 -ecmascript-runtime-client@0.11.1 -ecmascript-runtime-server@0.10.1 -ejson@1.1.1 -fetch@0.1.1 -geojson-utils@1.0.10 -htmljs@1.1.1 -id-map@1.1.1 -inter-process-messaging@0.1.1 -less@4.0.0 -local-test:less@4.0.0 -logging@1.2.0 -meteor@1.9.3 -minimongo@1.7.0 -modern-browsers@0.1.5 -modules@0.16.0 -modules-runtime@0.12.0 -mongo@1.12.0 -mongo-decimal@0.1.2 -mongo-dev-server@1.1.0 -mongo-id@1.0.8 -npm-mongo@3.9.0 -observe-sequence@1.0.19 -ordered-dict@1.1.0 -promise@0.12.0 -random@1.2.1 -react-fast-refresh@0.1.1 -reactive-var@1.0.12 -reload@1.3.1 -retry@1.1.0 -routepolicy@1.1.1 -socket-stream-client@0.4.0 -test-helpers@1.2.0 -tinytest@1.1.1 -tracker@1.2.1 -underscore@1.0.11 -webapp@1.11.1 -webapp-hashing@1.1.0 +allow-deny@2.0.0-beta300.6 +babel-compiler@7.11.0-beta300.6 +babel-runtime@1.5.2-beta300.6 +base64@1.0.13-beta300.6 +binary-heap@1.0.12-beta300.6 +blaze@3.0.0-alpha300.17 +boilerplate-generator@2.0.0-beta300.6 +caching-compiler@2.0.0-beta300.6 +callback-hook@1.6.0-beta300.6 +check@1.3.3-beta300.6 +core-runtime@1.0.0-beta300.6 +ddp@1.4.2-beta300.6 +ddp-client@3.0.0-beta300.6 +ddp-common@1.4.1-beta300.6 +ddp-server@3.0.0-beta300.6 +diff-sequence@1.1.3-beta300.6 +dynamic-import@0.7.4-beta300.6 +ecmascript@0.16.8-beta300.6 +ecmascript-runtime@0.8.2-beta300.6 +ecmascript-runtime-client@0.12.2-beta300.6 +ecmascript-runtime-server@0.11.1-beta300.6 +ejson@1.1.4-beta300.6 +facts-base@1.0.2-beta300.6 +fetch@0.1.4-beta300.6 +geojson-utils@1.0.12-beta300.6 +htmljs@2.0.0-alpha300.17 +id-map@1.2.0-beta300.6 +inter-process-messaging@0.1.2-beta300.6 +less@4.1.1-beta300.6 +local-test:less@4.1.1-beta300.6 +logging@1.3.3-beta300.6 +meteor@2.0.0-beta300.6 +minimongo@2.0.0-beta300.6 +modern-browsers@0.1.10-beta300.6 +modules@0.19.1-beta300.6 +modules-runtime@0.13.2-beta300.6 +mongo@2.0.0-beta300.6 +mongo-decimal@0.1.4-beta300.6 +mongo-dev-server@1.1.1-beta300.6 +mongo-id@1.0.9-beta300.6 +npm-mongo@4.16.1-beta300.6 +observe-sequence@2.0.0-alpha300.17 +ordered-dict@1.2.0-beta300.6 +promise@1.0.0-beta300.6 +random@1.2.2-beta300.6 +react-fast-refresh@0.2.8-beta300.6 +reactive-var@1.0.13-beta300.6 +reload@1.3.2-beta300.6 +retry@1.1.1-beta300.6 +routepolicy@1.1.2-beta300.6 +socket-stream-client@0.5.2-beta300.6 +test-helpers@2.0.0-beta300.6 +tinytest@2.0.0-beta300.6 +tracker@1.3.3-beta300.6 +typescript@5.3.3-beta300.6 +underscore@1.0.14-beta300.6 +webapp@2.0.0-beta300.6 +webapp-hashing@1.1.2-beta300.6 diff --git a/packages/non-core/less/package.js b/packages/non-core/less/package.js index 301c179f5cb..97199d48fc9 100644 --- a/packages/non-core/less/package.js +++ b/packages/non-core/less/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'less', - version: '4.0.0', + version: '4.1.1-beta300.6', summary: 'Leaner CSS language', documentation: 'README.md' }); @@ -8,8 +8,8 @@ Package.describe({ Package.registerBuildPlugin({ name: "compileLessBatch", use: [ - "caching-compiler@2.0.0-alpha300.17", - "ecmascript@0.16.8-alpha300.17", + "caching-compiler@2.0.0-beta300.6", + "ecmascript@0.16.8-beta300.6", ], sources: [ 'plugin/compile-less.js' diff --git a/packages/non-core/mongo-decimal/.versions b/packages/non-core/mongo-decimal/.versions index 53acef0564d..bdf63647d32 100644 --- a/packages/non-core/mongo-decimal/.versions +++ b/packages/non-core/mongo-decimal/.versions @@ -1,51 +1,52 @@ -allow-deny@2.0.0-alpha300.15 -babel-compiler@7.11.0-alpha300.15 -babel-runtime@1.5.2-alpha300.15 -base64@1.0.12 -binary-heap@1.0.12-alpha300.15 -boilerplate-generator@2.0.0-alpha300.15 -callback-hook@1.6.0-alpha300.15 -check@1.3.3-alpha300.15 -core-runtime@1.0.0-alpha300.15 -ddp@1.4.2-alpha300.15 -ddp-client@3.0.0-alpha300.15 -ddp-common@1.4.1-alpha300.15 -ddp-server@3.0.0-alpha300.15 -diff-sequence@1.1.3-alpha300.15 -dynamic-import@0.7.4-alpha300.15 -ecmascript@0.16.8-alpha300.15 -ecmascript-runtime@0.8.2-alpha300.15 -ecmascript-runtime-client@0.12.2-alpha300.15 -ecmascript-runtime-server@0.11.1-alpha300.15 -ejson@1.1.4-alpha300.15 -facts-base@1.0.2-alpha300.15 -fetch@0.1.4-alpha300.15 -geojson-utils@1.0.12-alpha300.15 -id-map@1.2.0-alpha300.15 -insecure@1.0.8-alpha300.15 -inter-process-messaging@0.1.2-alpha300.15 -local-test:mongo-decimal@0.1.4-alpha300.15 -logging@1.3.3-alpha300.15 -meteor@2.0.0-alpha300.15 -minimongo@2.0.0-alpha300.15 -modern-browsers@0.1.10-alpha300.15 -modules@0.19.1-alpha300.15 -modules-runtime@0.13.2-alpha300.15 -mongo@2.0.0-alpha300.15 -mongo-decimal@0.1.4-alpha300.15 -mongo-dev-server@1.1.1-alpha.12 -mongo-id@1.0.8 -npm-mongo@4.16.1-alpha300.15 -ordered-dict@1.2.0-alpha300.15 -promise@1.0.0-alpha300.15 -random@1.2.2-alpha300.15 -react-fast-refresh@0.2.8-alpha300.15 -reload@1.3.2-alpha300.15 -retry@1.1.1-alpha300.15 -routepolicy@1.1.2-alpha300.15 -socket-stream-client@0.5.2-alpha300.15 -tinytest@2.0.0-alpha300.15 -tracker@1.3.3-alpha300.15 -underscore@1.0.14-alpha300.15 -webapp@2.0.0-alpha300.15 -webapp-hashing@1.1.2-alpha300.15 +allow-deny@2.0.0-beta300.7 +babel-compiler@7.11.0-beta300.7 +babel-runtime@1.5.2-beta300.7 +base64@1.0.13-beta300.7 +binary-heap@1.0.12-beta300.7 +boilerplate-generator@2.0.0-beta300.7 +callback-hook@1.6.0-beta300.7 +check@1.3.3-beta300.7 +core-runtime@1.0.0-beta300.7 +ddp@1.4.2-beta300.7 +ddp-client@3.0.0-beta300.7 +ddp-common@1.4.1-beta300.7 +ddp-server@3.0.0-beta300.7 +diff-sequence@1.1.3-beta300.7 +dynamic-import@0.7.4-beta300.7 +ecmascript@0.16.8-beta300.7 +ecmascript-runtime@0.8.2-beta300.7 +ecmascript-runtime-client@0.12.2-beta300.7 +ecmascript-runtime-server@0.11.1-beta300.7 +ejson@1.1.4-beta300.7 +facts-base@1.0.2-beta300.7 +fetch@0.1.4-beta300.7 +geojson-utils@1.0.12-beta300.7 +id-map@1.2.0-beta300.7 +insecure@1.0.8-beta300.7 +inter-process-messaging@0.1.2-beta300.7 +local-test:mongo-decimal@0.1.4-beta300.7 +logging@1.3.3-beta300.7 +meteor@2.0.0-beta300.7 +minimongo@2.0.0-beta300.7 +modern-browsers@0.1.10-beta300.7 +modules@0.19.1-beta300.7 +modules-runtime@0.13.2-beta300.7 +mongo@2.0.0-beta300.7 +mongo-decimal@0.1.4-beta300.7 +mongo-dev-server@1.1.1-beta300.7 +mongo-id@1.0.9-beta300.7 +npm-mongo@4.16.1-beta300.7 +ordered-dict@1.2.0-beta300.7 +promise@1.0.0-beta300.7 +random@1.2.2-beta300.7 +react-fast-refresh@0.2.8-beta300.7 +reload@1.3.2-beta300.7 +retry@1.1.1-beta300.7 +routepolicy@1.1.2-beta300.7 +socket-stream-client@0.5.2-beta300.7 +tinytest@2.0.0-beta300.7 +tracker@1.3.3-beta300.7 +typescript@5.4.3-beta300.7 +underscore@1.0.14-beta300.7 +webapp@2.0.0-beta300.7 +webapp-hashing@1.1.2-beta300.7 diff --git a/packages/non-core/mongo-decimal/package.js b/packages/non-core/mongo-decimal/package.js index 10d82a1e529..09ebd96da05 100644 --- a/packages/non-core/mongo-decimal/package.js +++ b/packages/non-core/mongo-decimal/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "JS simulation of MongoDB Decimal128 type", - version: '0.1.4-alpha300.19', + version: '0.1.4-beta300.7', }); Npm.depends({ @@ -8,8 +8,8 @@ Npm.depends({ }); Package.onUse(function (api) { - api.use('ecmascript@0.16.8-alpha300.19'); - api.use('ejson@1.1.4-alpha300.19'); + api.use('ecmascript@0.16.8-beta300.7'); + api.use('ejson@1.1.4-beta300.7'); api.mainModule('decimal.js'); api.export('Decimal'); }); diff --git a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json index fa69cb3036f..58142c13f8a 100644 --- a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json +++ b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json @@ -1,18 +1,6 @@ { "lockfileVersion": 4, "dependencies": { - "@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, "@aws-crypto/ie11-detection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", @@ -74,339 +62,339 @@ } }, "@aws-sdk/client-cognito-identity": { - "version": "3.450.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.450.0.tgz", - "integrity": "sha512-CO04SicNOQApzmoRbR3y9xACeh8j2xichrotlRYdYj8Yf/9XUyyTDEBoMpaXe3jmAlD+Q6+fOW86MckTVMFKww==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.577.0.tgz", + "integrity": "sha512-y1fHORHoufrzj2GcnY52g4ykemFpT0Hu9e9kYa6yR0weQ0WalcG7WcnMNasXMcjr9fDjNze7ZCTuWJSI+HwkTQ==" }, "@aws-sdk/client-sso": { - "version": "3.450.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.450.0.tgz", - "integrity": "sha512-xutima6DhrTLMyBc1nmLhWXarvrqbH1zizrQpG7cLdwfqHEOi3thR3SWu+pUC4XN9kiXQUb2HUMcv/vdqmknkQ==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.577.0.tgz", + "integrity": "sha512-BwujdXrydlk6UEyPmewm5GqG4nkQ6OVyRhS/SyZP/6UKSFv2/sf391Cmz0hN0itUTH1rR4XeLln8XCOtarkrzg==" + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.577.0.tgz", + "integrity": "sha512-njmKSPDWueWWYVFpFcZ2P3fI6/pdQVDa0FgCyYZhOnJLgEHZIcBBg1AsnkVWacBuLopp9XVt2m+7hO6ugY1/1g==" }, "@aws-sdk/client-sts": { - "version": "3.450.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.450.0.tgz", - "integrity": "sha512-pHZ/3NHHtK5YbjYrh2jT8eePSYSunyvcIhdASMqYVg3Enw/BxA0IKL8bZ/slolhqR1sAQx4sKRAO7dZK418Q6w==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.577.0.tgz", + "integrity": "sha512-509Kklimva1XVlhGbpTpeX3kOP6ORpm44twJxDHpa9TURbmoaxj7veWlnLCbDorxDTrbsDghvYZshvcLsojVpg==" }, "@aws-sdk/core": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", - "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==" + "version": "3.576.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.576.0.tgz", + "integrity": "sha512-KDvDlbeipSTIf+ffKtTg1m419TK7s9mZSWC8bvuZ9qx6/sjQFOXIKOVqyuli6DnfxGbvRcwoRuY99OcCH1N/0w==" }, "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.450.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.450.0.tgz", - "integrity": "sha512-XBcifT9L1WLu6/WluOcmH04jHYtZGNnygrD1WMd6Y5JlW+JctUHfmevFHQ5IO48rJA8qV/Sl87yvL37EcVSZjA==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.577.0.tgz", + "integrity": "sha512-y5yo4RKQSIQEOGLMLziLh0MZ+CxLs2QmTRjh8PkL8ovy12FPyou9Ptr7hIDD5SnCsiItJful5qbmj9e2QSmozw==" }, "@aws-sdk/credential-provider-env": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.449.0.tgz", - "integrity": "sha512-SwO9XQcBoyA0XrsSmgnMqCnR99wIyp+BjGhvzDU+Wetib7QPt++E2slJkLM/iCNc6YiqiHZtHsvXapSV7RzBJw==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.577.0.tgz", + "integrity": "sha512-Jxu255j0gToMGEiqufP8ZtKI8HW90lOLjwJ3LrdlD/NLsAY0tOQf1fWc53u28hWmmNGMxmCrL2p66IOgMDhDUw==" }, "@aws-sdk/credential-provider-http": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.449.0.tgz", - "integrity": "sha512-oIcww6Xsyux3LZVQr89Ps2FkULwCe3ZDUxzlyQNGD7gsMxJRD/fUBffpv+7ZmXUVoN8ZthlxuPwjpP568JVBJw==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.577.0.tgz", + "integrity": "sha512-n++yhCp67b9+ZRGEdY1jhamB5E/O+QsIDOPSuRmdaSGMCOd82oUEKPgIVEU1bkqxDsBxgiEWuvtfhK6sNiDS0A==" }, "@aws-sdk/credential-provider-ini": { - "version": "3.450.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.450.0.tgz", - "integrity": "sha512-quil0bUH43irhEtHBBpnleVQd1ZBX9kDVf8HziK/LIhujTmHDAoDODnjhUczdJU6srMJgAJi1oVTaVek5emh9Q==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.577.0.tgz", + "integrity": "sha512-q7lHPtv6BjRvChUE3m0tIaEZKxPTaZ1B3lKxGYsFl3VLAu5N8yGCUKwuA1izf4ucT+LyKscVGqK6VDZx1ev3nw==" }, "@aws-sdk/credential-provider-node": { - "version": "3.450.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.450.0.tgz", - "integrity": "sha512-d4tQklhvsydNCer5Axd2sNptqqdalE78esDk0zA/cYaj56GniKqk3HLJLgb/wdv2/Ho6/4DhWeM5W4LaJNRivA==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.577.0.tgz", + "integrity": "sha512-epZ1HOMsrXBNczc0HQpv0VMjqAEpc09DUA7Rg3gUJfn8umhML7A7bXnUyqPA+S54q397UYg1leQKdSn23OiwQQ==" }, "@aws-sdk/credential-provider-process": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.449.0.tgz", - "integrity": "sha512-IofhAgpwdSnaEg9H0dhydac07GCQ55Mc5oRzdzp/tm0Rl0MqnGdIvN8wYsxAeVhEi9pBSNla4eRiTu3LY6Z5+A==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.577.0.tgz", + "integrity": "sha512-Gin6BWtOiXxIgITrJ3Nwc+Y2P1uVT6huYR4EcbA/DJUPWyO0n9y5UFLewPvVbLkRn15JeEqErBLUrHclkiOKtw==" }, "@aws-sdk/credential-provider-sso": { - "version": "3.450.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.450.0.tgz", - "integrity": "sha512-zzr9s5bG38TRn82eJXzG1/AglDihrcINn9TBfwOL8OBl0J6MF7EPAS92VpOuYs09H70MOWSZkmzEftq1urwC0g==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.577.0.tgz", + "integrity": "sha512-iVm5SQvS7EgZTJsRaqUOmDQpBQPPPat42SCbWFvFQOLrl8qewq8OP94hFS5w2mP62zngeYzqhJnDel79HXbxew==" }, "@aws-sdk/credential-provider-web-identity": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.449.0.tgz", - "integrity": "sha512-BdqATzdqg39z2VXnEH7I6dzuX/Di6F/4C8FyiiJYx2+VciYdqt6GPprlpGdpngtWct/f8pA/LxQysNBVuwU/RA==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.577.0.tgz", + "integrity": "sha512-ZGHGNRaCtJJmszb9UTnC7izNCtRUttdPlLdMkh41KPS32vfdrBDHs1JrpbZijItRj1xKuOXsiYSXLAaHGcLh8Q==" }, "@aws-sdk/credential-providers": { - "version": "3.450.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.450.0.tgz", - "integrity": "sha512-AWLYcwxNEsTX4hZBqq4cQsVuhVkYIwZP4DDaTAUoK6tR/WqmOFImuNB8DSPRGTEljdg+Q0qIWhMUGDWSKeJffw==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.577.0.tgz", + "integrity": "sha512-/fzdyyAetJxTPH8f2bh1UkcN48dScLb6LjBj9+wX2BHyKSZUal7+TqPTyme4f3pj1I1EeKhDIYKldR8YyMPIAg==" }, "@aws-sdk/middleware-host-header": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.449.0.tgz", - "integrity": "sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.577.0.tgz", + "integrity": "sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg==" }, "@aws-sdk/middleware-logger": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.449.0.tgz", - "integrity": "sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.577.0.tgz", + "integrity": "sha512-aPFGpGjTZcJYk+24bg7jT4XdIp42mFXSuPt49lw5KygefLyJM/sB0bKKqPYYivW0rcuZ9brQ58eZUNthrzYAvg==" }, "@aws-sdk/middleware-recursion-detection": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.449.0.tgz", - "integrity": "sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q==" - }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.449.0.tgz", - "integrity": "sha512-a+mknJkS9jDiDoHg2sFW24B0f6MgT2zs/oF6zMFvVmImvUHjbhSgBzYStE+Phl/uM1zwp1lJfbuO+I+5tVwZEw==" - }, - "@aws-sdk/middleware-signing": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.449.0.tgz", - "integrity": "sha512-L33efrgdDDY3myjLwraeS2tzUlebaZL6WS7ooACsOwkB9mRs6UQRpSpT90HbcSAjwLaa+xGqaxTA0biAuRjT5A==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.577.0.tgz", + "integrity": "sha512-pn3ZVEd2iobKJlR3H+bDilHjgRnNrQ6HMmK9ZzZw89Ckn3Dcbv48xOv4RJvu0aU8SDLl/SNCxppKjeLDTPGBNA==" }, "@aws-sdk/middleware-user-agent": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.449.0.tgz", - "integrity": "sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.577.0.tgz", + "integrity": "sha512-P55HAXgwmiHHpFx5JEPvOnAbfhN7v6sWv9PBQs+z2tC7QiBcPS0cdJR6PfV7J1n4VPK52/OnrK3l9VxdQ7Ms0g==" }, "@aws-sdk/region-config-resolver": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", - "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.577.0.tgz", + "integrity": "sha512-4ChCFACNwzqx/xjg3zgFcW8Ali6R9C95cFECKWT/7CUM1D0MGvkclSH2cLarmHCmJgU6onKkJroFtWp0kHhgyg==" }, "@aws-sdk/token-providers": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.449.0.tgz", - "integrity": "sha512-Tgu6Z/l75uFuNQpKIidbn1gc5bI7OKmGdH5+E/ZAc58XYvxYs9N77HjhrhAGvYQEnXY6gRm26/WSeHAAh5wlgQ==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.577.0.tgz", + "integrity": "sha512-0CkIZpcC3DNQJQ1hDjm2bdSy/Xjs7Ny5YvSsacasGOkNfk+FdkiQy6N67bZX3Zbc9KIx+Nz4bu3iDeNSNplnnQ==" }, "@aws-sdk/types": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", - "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.577.0.tgz", + "integrity": "sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA==" }, "@aws-sdk/util-endpoints": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.449.0.tgz", - "integrity": "sha512-hWGM/e+BnbCExXLaIEa6gRb0JW3+XGfcHgRqWkAxsKCaxQuXVIPUA3HyifimxTZDKmTbGZcyWfxCnKGS7I19rw==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.577.0.tgz", + "integrity": "sha512-FjuUz1Kdy4Zly2q/c58tpdqHd6z7iOdU/caYzoc8jwgAHBDBbIJNQLCU9hXJnPV2M8pWxQDyIZsoVwtmvErPzw==" }, "@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==" + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", + "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==" }, "@aws-sdk/util-user-agent-browser": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.449.0.tgz", - "integrity": "sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.577.0.tgz", + "integrity": "sha512-zEAzHgR6HWpZOH7xFgeJLc6/CzMcx4nxeQolZxVZoB5pPaJd3CjyRhZN0xXeZB0XIRCWmb4yJBgyiugXLNMkLA==" }, "@aws-sdk/util-user-agent-node": { - "version": "3.449.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.449.0.tgz", - "integrity": "sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw==" + "version": "3.577.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.577.0.tgz", + "integrity": "sha512-XqvtFjbSMtycZTWVwDe8DRWovuoMbA54nhUoZwVU6rW9OSD6NZWGR512BUGHFaWzW0Wg8++Dj10FrKTG2XtqfA==" }, "@aws-sdk/util-utf8-browser": { "version": "3.259.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==" }, + "@mongodb-js/saslprep": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz", + "integrity": "sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==" + }, "@smithy/abort-controller": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.13.tgz", - "integrity": "sha512-eeOPD+GF9BzF/Mjy3PICLePx4l0f3rG/nQegQHRLTloN5p1lSJJNZsyn+FzDnW8P2AduragZqJdtKNCxXozB1Q==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-p6GlFGBt9K4MYLu72YuJ523NVR4A8oHlC5M2JO6OmQqN8kAc/uh1JqLE+FizTokrSJGg0CSvC+BrsmGzKtsZKA==" }, "@smithy/config-resolver": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.18.tgz", - "integrity": "sha512-761sJSgNbvsqcsKW6/WZbrZr4H+0Vp/QKKqwyrxCPwD8BsiPEXNHyYnqNgaeK9xRWYswjon0Uxbpe3DWQo0j/g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.0.tgz", + "integrity": "sha512-2GzOfADwYLQugYkKQhIyZyQlM05K+tMKvRnc6eFfZcpJGRfKoMUMYdPlBKmqHwQFXQKBrGV6cxL9oymWgDzvFw==" }, - "@smithy/credential-provider-imds": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.1.tgz", - "integrity": "sha512-gw5G3FjWC6sNz8zpOJgPpH5HGKrpoVFQpToNAwLwJVyI/LJ2jDJRjSKEsM6XI25aRpYjMSE/Qptxx305gN1vHw==" + "@smithy/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.0.1.tgz", + "integrity": "sha512-rcMkjvwxH/bER+oZUPR0yTA0ELD6m3A+d92+CFkdF6HJFCBB1bXo7P5pm21L66XwTN01B6bUhSCQ7cymWRD8zg==" }, - "@smithy/eventstream-codec": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.13.tgz", - "integrity": "sha512-CExbelIYp+DxAHG8RIs0l9QL7ElqhG4ym9BNoSpkPa4ptBQfzJdep3LbOSVJIE2VUdBAeObdeL6EDB3Jo85n3g==" + "@smithy/credential-provider-imds": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.0.0.tgz", + "integrity": "sha512-lfmBiFQcA3FsDAPxNfY0L7CawcWtbyWsBOHo34nF095728JLkBX4Y9q/VPPE2r7fqMVK+drmDigqE2/SSQeVRA==" }, "@smithy/fetch-http-handler": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.6.tgz", - "integrity": "sha512-PStY3XO1Ksjwn3wMKye5U6m6zxXpXrXZYqLy/IeCbh3nM9QB3Jgw/B0PUSLUWKdXg4U8qgEu300e3ZoBvZLsDg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.0.1.tgz", + "integrity": "sha512-uaH74i5BDj+rBwoQaXioKpI0SHBJFtOVwzrCpxZxphOW0ki5jhj7dXvDMYM2IJem8TpdFvS2iC08sjOblfFGFg==" }, "@smithy/hash-node": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.15.tgz", - "integrity": "sha512-t/qjEJZu/G46A22PAk1k/IiJZT4ncRkG5GOCNWN9HPPy5rCcSZUbh7gwp7CGKgJJ7ATMMg+0Td7i9o1lQTwOfQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.0.tgz", + "integrity": "sha512-84qXstNemP3XS5jcof0el6+bDfjzuvhJPQTEfro3lgtbCtKgzPm3MgiS6ehXVPjeQ5+JS0HqmTz8f/RYfzHVxw==" }, "@smithy/invalid-dependency": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.13.tgz", - "integrity": "sha512-XsGYhVhvEikX1Yz0kyIoLssJf2Rs6E0U2w2YuKdT4jSra5A/g8V2oLROC1s56NldbgnpesTYB2z55KCHHbKyjw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.0.tgz", + "integrity": "sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==" }, "@smithy/is-array-buffer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", - "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==" }, "@smithy/middleware-content-length": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.15.tgz", - "integrity": "sha512-xH4kRBw01gJgWiU+/mNTrnyFXeozpZHw39gLb3JKGsFDVmSrJZ8/tRqu27tU/ki1gKkxr2wApu+dEYjI3QwV1Q==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.0.tgz", + "integrity": "sha512-3C4s4d/iGobgCtk2tnWW6+zSTOBg1PRAm2vtWZLdriwTroFbbWNSr3lcyzHdrQHnEXYCC5K52EbpfodaIUY8sg==" }, "@smithy/middleware-endpoint": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.0.tgz", - "integrity": "sha512-tddRmaig5URk2106PVMiNX6mc5BnKIKajHHDxb7K0J5MLdcuQluHMGnjkv18iY9s9O0tF+gAcPd/pDXA5L9DZw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.0.tgz", + "integrity": "sha512-aXOAWztw/5qAfp0NcA2OWpv6ZI/E+Dh9mByif7i91D/0iyYNUcKvskmXiowKESFkuZ7PIMd3VOR4fTibZDs2OQ==" }, "@smithy/middleware-retry": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.20.tgz", - "integrity": "sha512-X2yrF/SHDk2WDd8LflRNS955rlzQ9daz9UWSp15wW8KtzoTXg3bhHM78HbK1cjr48/FWERSJKh9AvRUUGlIawg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.1.tgz", + "integrity": "sha512-hBhSEuL841FhJBK/19WpaGk5YWSzFk/P2UaVjANGKRv3eYNO8Y1lANWgqnuPWjOyCEWMPr58vELFDWpxvRKANw==" }, "@smithy/middleware-serde": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.13.tgz", - "integrity": "sha512-tBGbeXw+XsE6pPr4UaXOh+UIcXARZeiA8bKJWxk2IjJcD1icVLhBSUQH9myCIZLNNzJIH36SDjUX8Wqk4xJCJg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.0.tgz", + "integrity": "sha512-I1vKG1foI+oPgG9r7IMY1S+xBnmAn1ISqployvqkwHoSb8VPsngHDTOgYGYBonuOKndaWRUGJZrKYYLB+Ane6w==" }, "@smithy/middleware-stack": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.7.tgz", - "integrity": "sha512-L1KLAAWkXbGx1t2jjCI/mDJ2dDNq+rp4/ifr/HcC6FHngxho5O7A5bQLpKHGlkfATH6fUnOEx0VICEVFA4sUzw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.0.tgz", + "integrity": "sha512-+H0jmyfAyHRFXm6wunskuNAqtj7yfmwFB6Fp37enytp2q047/Od9xetEaUbluyImOlGnGpaVGaVfjwawSr+i6Q==" }, "@smithy/node-config-provider": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.5.tgz", - "integrity": "sha512-3Omb5/h4tOCuKRx4p4pkYTvEYRCYoKk52bOYbKUyz/G/8gERbagsN8jFm4FjQubkrcIqQEghTpQaUw6uk+0edw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.0.0.tgz", + "integrity": "sha512-buqfaSdDh0zo62EPLf8rGDvcpKwGpO5ho4bXS2cdFhlOta7tBkWJt+O5uiaAeICfIOfPclNOndshDNSanX2X9g==" }, "@smithy/node-http-handler": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.9.tgz", - "integrity": "sha512-+K0q3SlNcocmo9OZj+fz67gY4lwhOCvIJxVbo/xH+hfWObvaxrMTx7JEzzXcluK0thnnLz++K3Qe7Z/8MDUreA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.0.0.tgz", + "integrity": "sha512-3trD4r7NOMygwLbUJo4eodyQuypAWr7uvPnebNJ9a70dQhVn+US8j/lCnvoJS6BXfZeF7PkkkI0DemVJw+n+eQ==" }, "@smithy/property-provider": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.14.tgz", - "integrity": "sha512-k3D2qp9o6imTrLaXRj6GdLYEJr1sXqS99nLhzq8fYmJjSVOeMg/G+1KVAAc7Oxpu71rlZ2f8SSZxcSxkevuR0A==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.0.0.tgz", + "integrity": "sha512-LmbPgHBswdXCrkWWuUwBm9w72S2iLWyC/5jet9/Y9cGHtzqxi+GVjfCfahkvNV4KXEwgnH8EMpcrD9RUYe0eLQ==" }, "@smithy/protocol-http": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", - "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.0.0.tgz", + "integrity": "sha512-qOQZOEI2XLWRWBO9AgIYuHuqjZ2csyr8/IlgFDHDNuIgLAMRx2Bl8ck5U5D6Vh9DPdoaVpuzwWMa0xcdL4O/AQ==" }, "@smithy/querystring-builder": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.13.tgz", - "integrity": "sha512-JhXKwp3JtsFUe96XLHy/nUPEbaXqn6r7xE4sNaH8bxEyytE5q1fwt0ew/Ke6+vIC7gP87HCHgQpJHg1X1jN2Fw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.0.tgz", + "integrity": "sha512-bW8Fi0NzyfkE0TmQphDXr1AmBDbK01cA4C1Z7ggwMAU5RDz5AAv/KmoRwzQAS0kxXNf/D2ALTEgwK0U2c4LtRg==" }, "@smithy/querystring-parser": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.13.tgz", - "integrity": "sha512-TEiT6o8CPZVxJ44Rly/rrsATTQsE+b/nyBVzsYn2sa75xAaZcurNxsFd8z1haoUysONiyex24JMHoJY6iCfLdA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.0.tgz", + "integrity": "sha512-UzHwthk0UEccV4dHzPySnBy34AWw3V9lIqUTxmozQ+wPDAO9csCWMfOLe7V9A2agNYy7xE+Pb0S6K/J23JSzfQ==" }, "@smithy/service-error-classification": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.6.tgz", - "integrity": "sha512-fCQ36frtYra2fqY2/DV8+3/z2d0VB/1D1hXbjRcM5wkxTToxq6xHbIY/NGGY6v4carskMyG8FHACxgxturJ9Pg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.0.tgz", + "integrity": "sha512-3BsBtOUt2Gsnc3X23ew+r2M71WwtpHfEDGhHYHSDg6q1t8FrWh15jT25DLajFV1H+PpxAJ6gqe9yYeRUsmSdFA==" }, "@smithy/shared-ini-file-loader": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.4.tgz", - "integrity": "sha512-9dRknGgvYlRIsoTcmMJXuoR/3ekhGwhRq4un3ns2/byre4Ql5hyUN4iS0x8eITohjU90YOnUCsbRwZRvCkbRfw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.0.0.tgz", + "integrity": "sha512-REVw6XauXk8xE4zo5aGL7Rz4ywA8qNMUn8RtWeTRQsgAlmlvbJ7CEPBcaXU2NDC3AYBgYAXrGyWD8XrN8UGDog==" }, "@smithy/signature-v4": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.15.tgz", - "integrity": "sha512-SRTEJSEhQYVlBKIIdZ9SZpqW+KFqxqcNnEcBX+8xkDdWx+DItme9VcCDkdN32yTIrICC+irUufnUdV7mmHPjoA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.0.0.tgz", + "integrity": "sha512-kXFOkNX+BQHe2qnLxpMEaCRGap9J6tUGLzc3A9jdn+nD4JdMwCKTJ+zFwQ20GkY+mAXGatyTw3HcoUlR39HwmA==" }, "@smithy/smithy-client": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.15.tgz", - "integrity": "sha512-rngZcQu7Jvs9UbHihK1EI67RMPuzkc3CJmu4MBgB7D7yBnMGuFR86tq5rqHfL2gAkNnMelBN/8kzQVvZjNKefQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.0.1.tgz", + "integrity": "sha512-KAiFY4Y4jdHxR+4zerH/VBhaFKM8pbaVmJZ/CWJRwtM/CmwzTfXfvYwf6GoUwiHepdv+lwiOXCuOl6UBDUEINw==" }, "@smithy/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.5.0.tgz", - "integrity": "sha512-/a31lYofrMBkJb3BuPlYJTMKDj0hUmKUP6JFZQu6YVuQVoAjubiY0A52U9S0Uysd33n/djexCUSNJ+G9bf3/aA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.0.0.tgz", + "integrity": "sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==" }, "@smithy/url-parser": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.13.tgz", - "integrity": "sha512-okWx2P/d9jcTsZWTVNnRMpFOE7fMkzloSFyM53fA7nLKJQObxM2T4JlZ5KitKKuXq7pxon9J6SF2kCwtdflIrA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.0.tgz", + "integrity": "sha512-2XLazFgUu+YOGHtWihB3FSLAfCUajVfNBXGGYjOaVKjLAuAxx3pSBY3hBgLzIgB17haf59gOG3imKqTy8mcrjw==" }, "@smithy/util-base64": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", - "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==" }, "@smithy/util-body-length-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", - "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==" }, "@smithy/util-body-length-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", - "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==" }, "@smithy/util-buffer-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", - "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==" }, "@smithy/util-config-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==" }, "@smithy/util-defaults-mode-browser": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.19.tgz", - "integrity": "sha512-VHP8xdFR7/orpiABJwgoTB0t8Zhhwpf93gXhNfUBiwAE9O0rvsv7LwpQYjgvbOUDDO8JfIYQB2GYJNkqqGWsXw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.1.tgz", + "integrity": "sha512-nW5kEzdJn1Bn5TF+gOPHh2rcPli8JU9vSSXLbfg7uPnfR1TMRQqs9zlYRhIb87NeSxIbpdXOI94tvXSy+fvDYg==" }, "@smithy/util-defaults-mode-node": { - "version": "2.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.25.tgz", - "integrity": "sha512-jkmep6/JyWmn2ADw9VULDeGbugR4N/FJCKOt+gYyVswmN1BJOfzF2umaYxQ1HhQDvna3kzm1Dbo1qIfBW4iuHA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.1.tgz", + "integrity": "sha512-TFk+Qb+elLc/MOhtSp+50fstyfZ6avQbgH2d96xUBpeScu+Al9elxv+UFAjaTHe0HQe5n+wem8ZLpXvU8lwV6Q==" }, "@smithy/util-endpoints": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.4.tgz", - "integrity": "sha512-FPry8j1xye5yzrdnf4xKUXVnkQErxdN7bUIaqC0OFoGsv2NfD9b2UUMuZSSt+pr9a8XWAqj0HoyVNUfPiZ/PvQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.0.tgz", + "integrity": "sha512-+exaXzEY3DNt2qtA2OtRNSDlVrE4p32j1JSsQkzA5AdP0YtJNjkYbYhJxkFmPYcjI1abuwopOZCwUmv682QkiQ==" }, "@smithy/util-hex-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", - "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==" }, "@smithy/util-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.6.tgz", - "integrity": "sha512-7W4uuwBvSLgKoLC1x4LfeArCVcbuHdtVaC4g30kKsD1erfICyQ45+tFhhs/dZNeQg+w392fhunCm/+oCcb6BSA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.0.tgz", + "integrity": "sha512-q5ITdOnV2pXHSVDnKWrwgSNTDBAMHLptFE07ua/5Ty5WJ11bvr0vk2a7agu7qRhrCFRQlno5u3CneU5EELK+DQ==" }, "@smithy/util-retry": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.6.tgz", - "integrity": "sha512-PSO41FofOBmyhPQJwBQJ6mVlaD7Sp9Uff9aBbnfBJ9eqXOE/obrqQjn0PNdkfdvViiPXl49BINfnGcFtSP4kYw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.0.tgz", + "integrity": "sha512-nK99bvJiziGv/UOKJlDvFF45F00WgPLKVIGUfAK+mDhzVN2hb/S33uW2Tlhg5PVBoqY7tDVqL0zmu4OxAHgo9g==" }, "@smithy/util-stream": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.20.tgz", - "integrity": "sha512-tT8VASuD8jJu0yjHEMTCPt1o5E3FVzgdsxK6FQLAjXKqVv5V8InCnc0EOsYrijgspbfDqdAJg7r0o2sySfcHVg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.1.tgz", + "integrity": "sha512-7F7VNNhAsfMRA8I986YdOY5fE0/T1/ZjFF6OLsqkvQVNP3vZ/szYDfGCyphb7ioA09r32K/0qbSFfNFU68aSzA==" }, "@smithy/util-uri-escape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", - "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==" }, "@smithy/util-utf8": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", - "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==" }, "@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==" + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==" }, "@types/webidl-conversions": { "version": "7.0.3", @@ -448,10 +436,15 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==" + }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" }, "memory-pager": { "version": "1.5.0", @@ -459,9 +452,9 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" }, "mongodb": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.16.0.tgz", - "integrity": "sha512-0EB113Fsucaq1wsY0dOhi1fmZOwFtLOtteQkiqOXGklvWMnSH3g2QS53f0KTP+/6qOkuoXE2JksubSZNmxeI+g==" + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.2.tgz", + "integrity": "sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg==" }, "mongodb-connection-string-url": { "version": "2.6.0", @@ -473,26 +466,26 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==" - }, "smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==" + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==" }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==" }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, "strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", @@ -514,9 +507,9 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" }, "webidl-conversions": { "version": "7.0.0", diff --git a/packages/npm-mongo/package.js b/packages/npm-mongo/package.js index cc90b5d93b7..822066be15c 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.16.1-alpha300.19', + version: '4.16.2-rc300.2', documentation: null }); Npm.depends({ - mongodb: "4.16.0" + mongodb: "4.17.2", }); Package.onUse(function (api) { diff --git a/packages/oauth-encryption/package.js b/packages/oauth-encryption/package.js index 9efd11165bc..89738068950 100644 --- a/packages/oauth-encryption/package.js +++ b/packages/oauth-encryption/package.js @@ -1,11 +1,11 @@ Package.describe({ summary: "Encrypt account secrets stored in the database", - version: '1.3.3-alpha300.19', + version: '1.3.3-rc300.2', }); Package.onUse(api => { api.use('ecmascript', 'server'); - api.use("modules@0.19.1-alpha300.19", "server"); + api.use("modules@0.19.1-beta300.7", "server"); api.use("ejson@1.1.3", "server"); api.mainModule("encrypt.js", "server"); api.export("OAuthEncryption", "server"); diff --git a/packages/oauth/oauth_client.js b/packages/oauth/oauth_client.js index 0ff507e7615..e406f02d8cb 100644 --- a/packages/oauth/oauth_client.js +++ b/packages/oauth/oauth_client.js @@ -97,19 +97,20 @@ OAuth.getDataAfterRedirect = () => { }; }; -// Launch an OAuth login flow. For the popup login style, show the -// popup. For the redirect login style, save the credential token for -// this login attempt in the reload migration data, and redirect to -// the service for the login. -// -// options: -// loginService: "facebook", "google", etc. -// loginStyle: "popup" or "redirect" -// loginUrl: The URL at the login service provider to start the OAuth flow. -// credentialRequestCompleteCallback: for the popup flow, call when the popup -// is closed and we have the credential from the login service. -// credentialToken: our identifier for this login flow. -// +/** + * Launch an OAuth login flow. For the popup login style, show the + * popup. For the redirect login style, save the credential token for + * this login attempt in the reload migration data, and redirect to + * the service for the login. + * + * @param {Object} options + * @param {string} options.loginService "facebook", "google", etc. + * @param {string} options.loginStyle "popup" or "redirect" + * @param {string} options.loginUrl The URL at the login service provider to start the OAuth flow. + * credentialRequestCompleteCallback: for the popup flow, call when the popup + * is closed and we have the credential from the login service. + * @param {string} options.credentialToken our identifier for this login flow. + **/ OAuth.launchLogin = options => { if (! options.loginService) throw new Error('loginService required'); diff --git a/packages/oauth/oauth_server.js b/packages/oauth/oauth_server.js index 2c4aed337d7..2e9b6cdc9ff 100644 --- a/packages/oauth/oauth_server.js +++ b/packages/oauth/oauth_server.js @@ -211,6 +211,8 @@ WebApp.handlers.use(middleware); OAuthTest.middleware = middleware; +OAuthTest.registeredServices = registeredServices; + // Handle /_oauth/* paths and extract the service name. // // @returns {String|null} e.g. "facebook", or null if this isn't an @@ -289,7 +291,7 @@ OAuth._renderOauthResults = async (res, query, credentialSecret) => { }; const getAsset = (name) => { - return new Promise((resolve, reject) => Assets.getText( + return new Promise((resolve, reject) => Assets.getTextAsync( `${name}.html`, (err, data) => err ? reject(err) : resolve(data))) } @@ -364,7 +366,7 @@ const renderEndOfLoginResponse = async options => { // to the OAuth server and authorized this app, we communicate the // credentialToken and credentialSecret to the main window. The main // window must provide both these values to the DDP `login` method to -// authenticate its DDP connection. After communicating these vaues to +// authenticate its DDP connection. After communicating these values to // the main window, we close the popup. // // We export this function so that developers can override this diff --git a/packages/oauth/package.js b/packages/oauth/package.js index 3f6496d15ba..83be162a32f 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: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', }); Package.onUse(api => { diff --git a/packages/oauth1/oauth1_binding.js b/packages/oauth1/oauth1_binding.js index 015553611e6..eaf327e7929 100644 --- a/packages/oauth1/oauth1_binding.js +++ b/packages/oauth1/oauth1_binding.js @@ -86,11 +86,6 @@ export class OAuth1Binding { 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); diff --git a/packages/oauth1/package.js b/packages/oauth1/package.js index 2a44daddfe9..254ee8a1db0 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.2-alpha300.19', + version: '1.5.2-rc300.2', }); Package.onUse(api => { diff --git a/packages/oauth2/package.js b/packages/oauth2/package.js index 4074a2fbc0f..34a720e4bbb 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.3-alpha300.19', + version: '1.3.3-rc300.2', }); Package.onUse(api => { diff --git a/packages/ordered-dict/package.js b/packages/ordered-dict/package.js index ba7715dd752..86f297dfa91 100644 --- a/packages/ordered-dict/package.js +++ b/packages/ordered-dict/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Ordered traversable dictionary with a mutable ordering", - version: '1.2.0-alpha300.19', + version: '1.2.0-rc300.2', documentation: null }); diff --git a/packages/package-stats-opt-out/package.js b/packages/package-stats-opt-out/package.js index 63cbc87e742..528046b1eff 100644 --- a/packages/package-stats-opt-out/package.js +++ b/packages/package-stats-opt-out/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Opt out of sending package stats", - version: '1.0.8-alpha300.19' + version: '1.0.8-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/package-version-parser/.npm/package/npm-shrinkwrap.json b/packages/package-version-parser/.npm/package/npm-shrinkwrap.json index ea1d2b1fe48..ea7fc351e9a 100644 --- a/packages/package-version-parser/.npm/package/npm-shrinkwrap.json +++ b/packages/package-version-parser/.npm/package/npm-shrinkwrap.json @@ -1,10 +1,20 @@ { "lockfileVersion": 4, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/packages/package-version-parser/package-version-parser.js b/packages/package-version-parser/package-version-parser.js index 8dd27f062a4..ca68f19abd8 100644 --- a/packages/package-version-parser/package-version-parser.js +++ b/packages/package-version-parser/package-version-parser.js @@ -212,10 +212,10 @@ PV.compare = function (versionOne, versionTwo) { // per the semver spec.) if (v1.semver !== v2.semver) { if (! v1._semverParsed) { - v1._semverParsed = new semver(v1.semver); + v1._semverParsed = semver.parse(v1.semver); } if (! v2._semverParsed) { - v2._semverParsed = new semver(v2.semver); + v2._semverParsed = semver.parse(v2.semver); } return semver.compare(v1._semverParsed, v2._semverParsed); } else { diff --git a/packages/package-version-parser/package.js b/packages/package-version-parser/package.js index 916cda6bdcb..a75021bbe63 100644 --- a/packages/package-version-parser/package.js +++ b/packages/package-version-parser/package.js @@ -1,10 +1,10 @@ Package.describe({ summary: "Parses Meteor Smart Package version strings", - version: "3.2.2-alpha300.19" + version: '3.2.2-rc300.2', }); Npm.depends({ - semver: "5.4.1" + semver: "7.5.4" }); Package.onUse(function (api) { diff --git a/packages/promise/package.js b/packages/promise/package.js index 602d8b65ad0..d940f1fee51 100644 --- a/packages/promise/package.js +++ b/packages/promise/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "promise", - version: '1.0.0-alpha300.19', + version: '1.0.0-rc300.2', summary: "ECMAScript 2015 Promise polyfill with Fiber support", git: "https://github.com/meteor/promise", documentation: "README.md" diff --git a/packages/random/package.js b/packages/random/package.js index 39a8c39f1b0..e8d54e0d54b 100644 --- a/packages/random/package.js +++ b/packages/random/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Random number generator and utilities', - version: '1.2.2-alpha300.19', + version: '1.2.2-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/rate-limit/package.js b/packages/rate-limit/package.js index 34d06653ed8..2e056e81128 100644 --- a/packages/rate-limit/package.js +++ b/packages/rate-limit/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'rate-limit', - version: '1.1.2-alpha300.19', + version: '1.1.2-rc300.2', // Brief, one-line summary of the package. summary: 'An algorithm for rate limiting anything', // URL to the Git repository containing the source code for this package. diff --git a/packages/react-fast-refresh/.npm/package/npm-shrinkwrap.json b/packages/react-fast-refresh/.npm/package/npm-shrinkwrap.json index e8aa7350e63..9476a975cd3 100644 --- a/packages/react-fast-refresh/.npm/package/npm-shrinkwrap.json +++ b/packages/react-fast-refresh/.npm/package/npm-shrinkwrap.json @@ -12,9 +12,9 @@ "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==" }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==" + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" }, "yallist": { "version": "4.0.0", diff --git a/packages/react-fast-refresh/client-runtime.js b/packages/react-fast-refresh/client-runtime.js index bc70e9813b3..4f8ea13089f 100644 --- a/packages/react-fast-refresh/client-runtime.js +++ b/packages/react-fast-refresh/client-runtime.js @@ -32,7 +32,7 @@ function registerExportsForReactRefresh(moduleId, moduleExports) { var typeID = moduleId + ' %exports% ' + key; runtime.register(exportValue, typeID); } -}; +} // Modules that only export components become React Refresh boundaries. function isReactRefreshBoundary(moduleExports) { @@ -79,7 +79,7 @@ function isReactRefreshBoundary(moduleExports) { } return hasExports && onlyExportComponents; -}; +} runtime.injectIntoGlobalHook(window); @@ -131,11 +131,11 @@ module.exports = function setupModule (module) { window.$RefreshReg$ = function (type, _id) { var fullId = module.id + ' ' + _id; RefreshRuntime.register(type, fullId); - } + }; window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform; beforeStates.push({ prevRefreshReg: prevRefreshReg, prevRefreshSig: prevRefreshSig }); -} +}; diff --git a/packages/react-fast-refresh/package.js b/packages/react-fast-refresh/package.js index 217c3f2c848..a9a699361c5 100644 --- a/packages/react-fast-refresh/package.js +++ b/packages/react-fast-refresh/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'react-fast-refresh', - version: '0.2.8-alpha300.19', + version: '0.2.9-rc300.2', summary: 'Automatically update React components with HMR', documentation: 'README.md', devOnly: true, @@ -8,7 +8,7 @@ Package.describe({ Npm.depends({ 'react-refresh': '0.14.0', - semver: '7.3.8', + semver: '7.5.4', }); Package.onUse(function(api) { diff --git a/packages/react-fast-refresh/server.js b/packages/react-fast-refresh/server.js index 5e68fbed6b0..ead1bcec15e 100644 --- a/packages/react-fast-refresh/server.js +++ b/packages/react-fast-refresh/server.js @@ -65,6 +65,6 @@ ReactFastRefresh = { return [ [babelPlugin, { skipEnvCheck: true }], enableReactRefreshBabelPlugin, - ] + ]; } }; diff --git a/packages/reactive-dict/package.js b/packages/reactive-dict/package.js index 3b0c90da1fa..061bb742da9 100644 --- a/packages/reactive-dict/package.js +++ b/packages/reactive-dict/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Reactive dictionary", - version: '1.3.2-alpha300.19' + version: '1.3.2-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js index 5023e1c4c04..34286f2cd9e 100644 --- a/packages/reactive-var/package.js +++ b/packages/reactive-var/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Reactive variable", - version: '1.0.13-alpha300.19' + version: '1.0.13-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/reload-safetybelt/package.js b/packages/reload-safetybelt/package.js index 9a17e4472af..ae8af7fa1f2 100644 --- a/packages/reload-safetybelt/package.js +++ b/packages/reload-safetybelt/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Reload safety belt for multi-server deployments", - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Package.onUse(function (api) { @@ -13,6 +13,6 @@ Package.onUse(function (api) { Package.onTest(function (api) { api.use("ecmascript"); api.addAssets("safetybelt.js", "server"); - api.use(["reload-safetybelt", "tinytest", "http", "webapp", "underscore"]); + api.use(["reload-safetybelt", "tinytest", "http", "webapp"]); api.addFiles("reload-safety-belt-tests.js", "server"); }); diff --git a/packages/reload-safetybelt/reload-safety-belt-tests.js b/packages/reload-safetybelt/reload-safety-belt-tests.js index 8e79a6f96df..dcfed5e5696 100644 --- a/packages/reload-safetybelt/reload-safety-belt-tests.js +++ b/packages/reload-safetybelt/reload-safety-belt-tests.js @@ -1,9 +1,9 @@ await (async () => { - var script = await Assets.getText("safetybelt.js"); + var script = await Assets.getTextAsync("safetybelt.js"); Tinytest.add("reload-safetybelt - safety belt is added", function (test) { test.isTrue( - _.some(WebAppInternals.additionalStaticJs, function (js, pathname) { + Object.values(WebAppInternals.additionalStaticJs).some( function (js, pathname) { return js === script; }) ); diff --git a/packages/reload-safetybelt/reload-safety-belt.js b/packages/reload-safetybelt/reload-safety-belt.js index 60bd28b6e6b..cc641b6bad5 100644 --- a/packages/reload-safetybelt/reload-safety-belt.js +++ b/packages/reload-safetybelt/reload-safety-belt.js @@ -4,5 +4,5 @@ // CSS. This prevents you from displaying the page in that case, and instead // reloads it, presumably all on the new version now. await (async () => { - WebAppInternals.addStaticJs(await Assets.getText("safetybelt.js")); + WebAppInternals.addStaticJs(await Assets.getTextAsync("safetybelt.js")); })(); diff --git a/packages/reload/package.js b/packages/reload/package.js index 9c692c556ec..f18869add34 100644 --- a/packages/reload/package.js +++ b/packages/reload/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Reload the page while preserving application state.", - version: '1.3.2-alpha300.19' + version: '1.3.2-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/retry/package.js b/packages/retry/package.js index ca68b990976..dcdb882ddb8 100644 --- a/packages/retry/package.js +++ b/packages/retry/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Retry logic with exponential backoff", - version: '1.1.1-alpha300.19' + version: '1.1.1-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/routepolicy/package.js b/packages/routepolicy/package.js index 1d0b0af9967..fbd1360d3f7 100644 --- a/packages/routepolicy/package.js +++ b/packages/routepolicy/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "route policy declarations", - version: '1.1.2-alpha300.19' + version: '1.1.2-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/server-render/package.js b/packages/server-render/package.js index dfea3f65f5d..f235719d525 100644 --- a/packages/server-render/package.js +++ b/packages/server-render/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "server-render", - version: "0.4.2-alpha300.19", + version: '0.4.2-rc300.2', summary: "Generic support for server-side rendering in Meteor apps", documentation: "README.md" }); diff --git a/packages/service-configuration/package.js b/packages/service-configuration/package.js index 7d065304185..5e039b8827f 100644 --- a/packages/service-configuration/package.js +++ b/packages/service-configuration/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: 'Manage the configuration for third-party services', - version: '1.3.2-alpha300.19', + version: '1.3.2-rc300.2', }); Package.onUse(function(api) { diff --git a/packages/service-configuration/service-configuration.d.ts b/packages/service-configuration/service-configuration.d.ts index 3c18cfaac3e..5b6e294a1e9 100644 --- a/packages/service-configuration/service-configuration.d.ts +++ b/packages/service-configuration/service-configuration.d.ts @@ -5,6 +5,12 @@ export interface Configuration { secret: string; } -export declare var ServiceConfiguration: { +declare class ConfigError extends Error { + constructor(serviceName?: string); + message: string; +} + +export var ServiceConfiguration: { configurations: Mongo.Collection; + ConfigError: typeof ConfigError }; diff --git a/packages/service-configuration/service_configuration_server.js b/packages/service-configuration/service_configuration_server.js index 16427463c4b..087f8cd6abc 100644 --- a/packages/service-configuration/service_configuration_server.js +++ b/packages/service-configuration/service_configuration_server.js @@ -34,12 +34,12 @@ try { Meteor.startup(() => { const settings = Meteor.settings?.packages?.['service-configuration']; if (!settings) return; - Object.keys(settings).forEach(key => { - ServiceConfiguration.configurations.upsert( + for (const key of Object.keys(settings)) { + ServiceConfiguration.configurations.upsertAsync( { service: key }, { $set: settings[key], } ); - }); + } }); diff --git a/packages/session/package.js b/packages/session/package.js index 955dd26eac7..3d1ec92bce0 100644 --- a/packages/session/package.js +++ b/packages/session/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Session variable", - version: '1.2.2-alpha300.19' + version: '1.2.2-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/sha/package.js b/packages/sha/package.js index 0a9894f384f..3965e1adb71 100644 --- a/packages/sha/package.js +++ b/packages/sha/package.js @@ -1,5 +1,5 @@ Package.describe({ - version: '1.0.10-alpha300.19', + version: '1.0.10-rc300.2', summary: 'SHA256 implementation', git: 'https://github.com/meteor/meteor' }); diff --git a/packages/shell-server/package.js b/packages/shell-server/package.js index b081c78de14..71a1b58078e 100644 --- a/packages/shell-server/package.js +++ b/packages/shell-server/package.js @@ -1,11 +1,12 @@ Package.describe({ name: "shell-server", - version: '0.6.0-alpha300.19', + version: '0.6.0-rc300.2', summary: "Server-side component of the `meteor shell` command.", documentation: "README.md" }); Package.onUse(function(api) { api.use("ecmascript", "server"); + api.use("babel-compiler", "server"); api.mainModule("main.js", "server"); }); diff --git a/packages/shell-server/shell-server.js b/packages/shell-server/shell-server.js index 933baedda7c..e9a5b6b18db 100644 --- a/packages/shell-server/shell-server.js +++ b/packages/shell-server/shell-server.js @@ -235,9 +235,9 @@ class Server { const defaultEval = repl.eval; function wrappedDefaultEval(code, context, file, callback) { - if (Package.ecmascript) { + if (Package['babel-compiler']) { try { - code = Package.ecmascript.ECMAScript.compileForShell(code, { + code = Package['babel-compiler'].Babel.compileForShell(code, { cacheDirectory: getCacheDirectory(shellDir) }); } catch (err) { diff --git a/packages/socket-stream-client/.npm/package/npm-shrinkwrap.json b/packages/socket-stream-client/.npm/package/npm-shrinkwrap.json index 42ef78be4d2..eaf34702ea1 100644 --- a/packages/socket-stream-client/.npm/package/npm-shrinkwrap.json +++ b/packages/socket-stream-client/.npm/package/npm-shrinkwrap.json @@ -11,6 +11,16 @@ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "permessage-deflate": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/permessage-deflate/-/permessage-deflate-0.1.7.tgz", diff --git a/packages/socket-stream-client/client-tests.js b/packages/socket-stream-client/client-tests.js index 6b8831ffc02..f3b9c2e46d3 100644 --- a/packages/socket-stream-client/client-tests.js +++ b/packages/socket-stream-client/client-tests.js @@ -1,9 +1,10 @@ import { Meteor } from "meteor/meteor"; import { Tracker } from "meteor/tracker"; -import { _ } from "meteor/underscore"; import { HTTP } from "meteor/http"; import { toSockjsUrl } from "./urls.js"; import { ClientStream } from "meteor/socket-stream-client"; +import isEqual from "lodash.isequal"; +import once from "lodash.once"; Tinytest.add('stream - status', function(test) { // Very basic test. Just see that it runs and returns something. Not a @@ -15,7 +16,7 @@ Tinytest.add('stream - status', function(test) { testAsyncMulti('stream - reconnect', [ function(test, expect) { - var callback = _.once( + var callback = once( expect(function() { var status; status = Meteor.status(); @@ -54,17 +55,17 @@ testAsyncMulti('stream - basic disconnect', [ Tracker.autorun(function() { var status = stream.status(); - if (_.last(history) !== status.status) { + if (history[history.length -1] !== status.status) { history.push(status.status); - if (_.isEqual(history, ['connecting'])) { + if (isEqual(history, ['connecting'])) { // do nothing; wait for the next state - } else if (_.isEqual(history, ['connecting', 'connected'])) { + } else if (isEqual(history, ['connecting', 'connected'])) { stream.disconnect(); - } else if (_.isEqual(history, ['connecting', 'connected', 'offline'])) { + } else if (isEqual(history, ['connecting', 'connected', 'offline'])) { stream.reconnect(); } else if ( - _.isEqual(history, [ + isEqual(history, [ 'connecting', 'connected', 'offline', @@ -73,7 +74,7 @@ testAsyncMulti('stream - basic disconnect', [ ) { // do nothing; wait for the next state } else if ( - _.isEqual(history, [ + isEqual(history, [ 'connecting', 'connected', 'offline', @@ -118,14 +119,14 @@ testAsyncMulti('stream - disconnect remains offline', [ Tracker.autorun(function() { var status = stream.status(); - if (_.last(history) !== status.status) { + if (history[history.length - 1] !== status.status) { history.push(status.status); - if (_.isEqual(history, ['connecting'])) { + if (isEqual(history, ['connecting'])) { // do nothing; wait for the next status - } else if (_.isEqual(history, ['connecting', 'connected'])) { + } else if (isEqual(history, ['connecting', 'connected'])) { stream.disconnect(); - } else if (_.isEqual(history, ['connecting', 'connected', 'offline'])) { + } else if (isEqual(history, ['connecting', 'connected', 'offline'])) { stream._online(); test.isTrue(status.status === 'offline'); onTestComplete(); @@ -225,4 +226,4 @@ testAsyncMulti('stream - /websocket is a websocket endpoint', [ }) ); } -]); +]); \ No newline at end of file diff --git a/packages/socket-stream-client/package.js b/packages/socket-stream-client/package.js index f471d20e8f0..06b8dff9841 100644 --- a/packages/socket-stream-client/package.js +++ b/packages/socket-stream-client/package.js @@ -1,13 +1,15 @@ Package.describe({ name: "socket-stream-client", - version: '0.5.2-alpha300.19', + version: '0.5.3-rc300.2', summary: "Provides the ClientStream abstraction used by ddp-client", documentation: "README.md" }); Npm.depends({ "faye-websocket": "0.11.4", - "permessage-deflate": "0.1.7" + "permessage-deflate": "0.1.7", + "lodash.isequal": "4.5.0", + "lodash.once": "4.1.1" }); Package.onUse(function(api) { @@ -22,7 +24,6 @@ Package.onUse(function(api) { }); Package.onTest(function(api) { - api.use("underscore"); api.use("ecmascript"); api.use("tinytest"); api.use("test-helpers"); diff --git a/packages/standard-minifier-css/package.js b/packages/standard-minifier-css/package.js index cc2ce5764c8..84f558c1e5f 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.9.3-alpha300.19', + version: '1.9.3-rc300.2', summary: 'Standard css minifier used with Meteor apps by default.', documentation: 'README.md', }); @@ -13,7 +13,7 @@ Package.registerBuildPlugin({ 'logging', ], npmDependencies: { - "@babel/runtime": "7.21.0", + "@babel/runtime": "7.23.5", "source-map": "0.7.4", "lru-cache": "8.0.0", "micromatch": "4.0.5", diff --git a/packages/standard-minifier-js/package.js b/packages/standard-minifier-js/package.js index 22354eaca18..d8892dd2fd7 100644 --- a/packages/standard-minifier-js/package.js +++ b/packages/standard-minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'standard-minifier-js', - version: '3.0.0-alpha300.19', + version: '3.0.0-rc300.2', summary: 'Standard javascript minifiers used with Meteor apps by default.', documentation: 'README.md', }); diff --git a/packages/standard-minifiers/package.js b/packages/standard-minifiers/package.js index 4a02d43dec6..f594ad93866 100644 --- a/packages/standard-minifiers/package.js +++ b/packages/standard-minifiers/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'standard-minifiers', - version: '1.1.0', + version: '1.1.1-rc300.2', summary: 'Standard minifiers used with Meteor apps by default.', documentation: 'README.md' }); diff --git a/packages/static-html/package.js b/packages/static-html/package.js index f8fe130bcfa..95710b62515 100644 --- a/packages/static-html/package.js +++ b/packages/static-html/package.js @@ -1,14 +1,14 @@ Package.describe({ name: 'static-html', summary: "Define static page content in .html files", - version: '1.3.3-alpha300.19', + version: '1.3.3-rc300.2', git: 'https://github.com/meteor/meteor.git' }); Package.registerBuildPlugin({ name: "compileStaticHtmlBatch", use: [ - 'ecmascript@0.16.8-alpha300.19', + 'ecmascript@0.16.8-beta300.7', 'caching-html-compiler@2.0.0-alpha300.16', 'templating-tools@2.0.0-alpha300.16' ], diff --git a/packages/test-helpers/mock.js b/packages/test-helpers/mock.js new file mode 100644 index 00000000000..b3bcc5dae3e --- /dev/null +++ b/packages/test-helpers/mock.js @@ -0,0 +1,33 @@ +mockBehaviours = function _mockBehaviours(obj, mockBehaviors = {}) { + const originalFunctions = {}; + const mockedRuns = []; + + // Store original functions + for (const key in obj) { + if (typeof obj[key] === 'function') { + originalFunctions[key] = obj[key]; + } + } + + // Mutate functions to identity functions + for (const key in obj) { + if (typeof obj[key] === 'function') { + obj[key] = function(...params) { + mockedRuns.push({ name: key, params }); + if (typeof mockBehaviors?.[key] === 'function') { + return mockBehaviors[key](...params); + } + return params?.[0]; + }; + } + } + + // Method to revert the mutation + const stop = function() { + for (const key in originalFunctions) { + obj[key] = originalFunctions[key]; + } + }; + + return { stop, mockedRuns }; +}; diff --git a/packages/test-helpers/package.js b/packages/test-helpers/package.js index 0d500ea99fc..5fa17f08353 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: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Package.onUse(function (api) { @@ -30,7 +30,7 @@ Package.onUse(function (api) { 'renderToDiv', 'clickIt', 'withCallbackLogger', 'testAsyncMulti', 'simplePoll', 'runAndThrowIfNeeded', - 'makeTestConnection', 'DomUtils']); + 'makeTestConnection', 'DomUtils', 'mockBehaviours', 'waitUntil']); api.addFiles('try_all_permutations.js'); api.addFiles('async_multi.js'); @@ -40,6 +40,8 @@ Package.onUse(function (api) { api.addFiles('render_div.js'); api.addFiles('current_style.js'); api.addFiles('callback_logger.js'); + api.addFiles('mock.js'); + api.addFiles('wait.js'); api.addFiles('domutils.js', 'client'); api.addFiles('connection.js', 'server'); }); diff --git a/packages/test-helpers/wait.js b/packages/test-helpers/wait.js new file mode 100644 index 00000000000..955b17fb424 --- /dev/null +++ b/packages/test-helpers/wait.js @@ -0,0 +1,49 @@ +function isPromise(obj) { + return obj && typeof obj.then === 'function'; +} + +waitUntil = function _waitUntil(checkFunction, { timeout = 15_000, interval = 200, leading = true, description = '' } = {}) { + let waitTime = interval; + return new Promise((resolve, reject) => { + if (leading && checkFunction()) { + resolve(); + return; + } + const handler = setInterval(() => { + const shouldWait = checkFunction(); + if (isPromise(shouldWait)) { + shouldWait + .then(_shouldWait => { + if (_shouldWait) { + resolve(); + clearInterval(handler); + return; + } + + if (waitTime > timeout) { + console.error(description, 'timed out'); + reject(); + clearInterval(handler); + } + + waitTime += interval; + }) + .catch((_error) => { + console.error(description, _error?.message); + reject(); + clearInterval(handler); + }); + } else if (shouldWait) { + resolve(); + clearInterval(handler); + } else { + if (waitTime > timeout) { + console.error(description, 'timed out'); + reject(); + clearInterval(handler); + } + waitTime += interval; + } + }, interval); + }); +}; diff --git a/packages/test-in-browser/package.js b/packages/test-in-browser/package.js index 5ba9110d094..98cd05288c8 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.4.0-alpha300.19', + version: '1.4.0-rc300.2', documentation: null }); diff --git a/packages/test-in-console/driver.js b/packages/test-in-console/driver.js index 95904e20c5e..4f66667d0d9 100644 --- a/packages/test-in-console/driver.js +++ b/packages/test-in-console/driver.js @@ -89,7 +89,7 @@ var report = function (name, last) { fullName: name.substr(3) }; if ((data.status === "FAIL" || data.status === "EXPECTED") && - !_.isEmpty(resultSet[name].events)) { + !(Object.keys(resultSet[name].events).length === 0)) { // only send events when bad things happen data.events = resultSet[name].events; } @@ -118,7 +118,7 @@ runTests = function () { Tinytest._runTestsEverywhere( function (results) { var name = getName(results); - if (!_.has(resultSet, name)) { + if (!(name in resultSet)) { var testPath = EJSON.clone(results.groupPath); testPath.push(results.test); resultSet[name] = { @@ -133,7 +133,7 @@ runTests = function () { } // Loop through events, and record status for each test // Also log result if test has finished - _.each(results.events, function (event) { + results.events.forEach(function (event) { resultSet[name].events.push(event); switch (event.type) { case "ok": @@ -190,7 +190,7 @@ runTests = function () { if (failed > 0) { log("~~~~~~~ THERE ARE FAILURES ~~~~~~~"); } - log("passed/expected/failed/total", passed, "/", expected, "/", failed, "/", _.size(resultSet)); + log("passed/expected/failed/total", passed, "/", expected, "/", failed, "/", Object.keys(resultSet).length); sendReports(function () { if (doReport) { log("Waiting 3s for any last reports to get sent out"); @@ -210,12 +210,12 @@ runTests = function () { // Also log xUnit output xunit(''); - _.each(resultSet, function (result, name) { + resultSet.forEach(function (result, name) { var classname = result.testPath.join('.').replace(/ /g, '-') + (result.server ? "-server" : "-client"); var name = result.test.replace(/ /g, '-') + (result.server ? "-server" : "-client"); var time = ""; var error = ""; - _.each(result.events, function (event) { + result.events.forEach(function (event) { switch (event.type) { case "finish": var timeMs = event.timeMs; diff --git a/packages/test-in-console/package.js b/packages/test-in-console/package.js index bac6b17c172..dd3496650b0 100644 --- a/packages/test-in-console/package.js +++ b/packages/test-in-console/package.js @@ -1,11 +1,11 @@ Package.describe({ summary: 'Run tests noninteractively, with results going to the console.', - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Package.onUse(function(api) { - api.use(['tinytest', 'underscore', 'random', 'ejson', 'check']); - api.use('http', 'server'); // TODO replace with fetch + api.use(['tinytest', 'random', 'ejson', 'check']); + api.use('fetch', 'server'); api.export('TEST_STATUS', 'client'); diff --git a/packages/test-in-console/puppeteerRunner.js b/packages/test-in-console/puppeteerRunner.js index 3400986b7fe..d0a59ae9c95 100644 --- a/packages/test-in-console/puppeteerRunner.js +++ b/packages/test-in-console/puppeteerRunner.js @@ -5,12 +5,29 @@ let testNumber = 0; async function runNextUrl(browser) { const page = await browser.newPage(); - page.on('console', msg => { + page.on('console', async msg => { // 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++; + else { + testNumber++; + const currentClientTest = + await page.evaluate(() => __Tinytest._getCurrentRunningTestOnClient()); + if (currentClientTest !== '') { + console.log(`Currently running on the client test: ${ currentClientTest }`) + return; + } + // If we get here is because we have not yet started the test on the client + const currentServerTest = + await page.evaluate(async () => await __Tinytest._getCurrentRunningTestOnServer()); + + if (currentServerTest !== '') { + console.log(`Currently running on the server test: ${ currentServerTest }`); + return; + } + // we were not able to find the name of the test, this is a way to make sure the test is still running + console.log(`Test number: ${ testNumber }`); + } }); if (!process.env.URL) { @@ -23,10 +40,6 @@ async function runNextUrl(browser) { async function poll() { if (await isDone(page)) { let failCount = await getFailCount(page); - 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) { diff --git a/packages/test-in-console/reporter.js b/packages/test-in-console/reporter.js index 3bb6fc7043d..099e43a81c7 100644 --- a/packages/test-in-console/reporter.js +++ b/packages/test-in-console/reporter.js @@ -19,9 +19,13 @@ Meteor.methods({ // XXX Could do a more precise validation here; reports are complex! check(reports, [Object]); if (url) { - await HTTP.post(url, { - data: reports - }); + fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(reports), + }); } return null; } diff --git a/packages/test-server-tests-in-console-once/.npm/package/.gitignore b/packages/test-server-tests-in-console-once/.npm/package/.gitignore new file mode 100644 index 00000000000..3c3629e647f --- /dev/null +++ b/packages/test-server-tests-in-console-once/.npm/package/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/test-server-tests-in-console-once/.npm/package/README b/packages/test-server-tests-in-console-once/.npm/package/README new file mode 100644 index 00000000000..3d492553a43 --- /dev/null +++ b/packages/test-server-tests-in-console-once/.npm/package/README @@ -0,0 +1,7 @@ +This directory and the files immediately inside it are automatically generated +when you change this package's NPM dependencies. Commit the files in this +directory (npm-shrinkwrap.json, .gitignore, and this README) to source control +so that others run the same versions of sub-dependencies. + +You should NOT check in the node_modules directory that Meteor automatically +creates; if you are using git, the .gitignore file tells git to ignore it. diff --git a/packages/test-server-tests-in-console-once/.npm/package/npm-shrinkwrap.json b/packages/test-server-tests-in-console-once/.npm/package/npm-shrinkwrap.json new file mode 100644 index 00000000000..51c79d70fab --- /dev/null +++ b/packages/test-server-tests-in-console-once/.npm/package/npm-shrinkwrap.json @@ -0,0 +1,10 @@ +{ + "lockfileVersion": 4, + "dependencies": { + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==" + } + } +} diff --git a/packages/test-server-tests-in-console-once/package.js b/packages/test-server-tests-in-console-once/package.js index a6278134f9b..cfdfa704d70 100644 --- a/packages/test-server-tests-in-console-once/package.js +++ b/packages/test-server-tests-in-console-once/package.js @@ -1,10 +1,14 @@ Package.describe({ summary: "Run server tests noninteractively, with results going to the console.", - version: '1.0.11' + version: '1.0.13-rc300.2', +}); + +Npm.depends({ + 'lodash.has': '4.5.2' }); Package.onUse(function (api) { - api.use(['tinytest', 'underscore', 'ejson'], 'server'); + api.use(['tinytest', 'ejson'], 'server'); api.addFiles(['server.js'], "server"); }); diff --git a/packages/test-server-tests-in-console-once/server.js b/packages/test-server-tests-in-console-once/server.js index cf1facba8c5..f2256d36d95 100644 --- a/packages/test-server-tests-in-console-once/server.js +++ b/packages/test-server-tests-in-console-once/server.js @@ -1,3 +1,5 @@ +const has = Npm.require('lodash.has'); + var passed = 0; var failed = 0; var expected = 0; @@ -11,7 +13,7 @@ Meteor.startup(function () { console.log("running server-side tests"); Tinytest._runTests(function (results) { var name = getName(results); - if (!_.has(resultSet, name)) { + if (!has(resultSet, name)) { var testPath = EJSON.clone(results.groupPath); testPath.push(results.test); resultSet[name] = { @@ -21,7 +23,7 @@ Meteor.startup(function () { testPath: testPath }; } - _.each(results.events, function (event) { + results.events.forEach(function (event) { resultSet[name].events.push(event); switch (event.type) { case "ok": @@ -68,7 +70,7 @@ Meteor.startup(function () { }); }, function () { console.log("passed/expected/failed/total", - passed, "/", expected, "/", failed, "/", _.size(resultSet)); + passed, "/", expected, "/", failed, "/", Object.keys(resultSet).length); if (failed > 0) { console.log("TESTS FAILED"); } else { diff --git a/packages/tinytest-harness/package.js b/packages/tinytest-harness/package.js index 6c4cb6aeed5..bf52972ce0c 100644 --- a/packages/tinytest-harness/package.js +++ b/packages/tinytest-harness/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'tinytest-harness', - version: '0.0.4', + version: '0.0.5-rc300.2', summary: 'In development, lets your app define Tinytests, run them and see results', documentation: null }); diff --git a/packages/tinytest/.npm/package/.gitignore b/packages/tinytest/.npm/package/.gitignore new file mode 100644 index 00000000000..3c3629e647f --- /dev/null +++ b/packages/tinytest/.npm/package/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/tinytest/.npm/package/README b/packages/tinytest/.npm/package/README new file mode 100644 index 00000000000..3d492553a43 --- /dev/null +++ b/packages/tinytest/.npm/package/README @@ -0,0 +1,7 @@ +This directory and the files immediately inside it are automatically generated +when you change this package's NPM dependencies. Commit the files in this +directory (npm-shrinkwrap.json, .gitignore, and this README) to source control +so that others run the same versions of sub-dependencies. + +You should NOT check in the node_modules directory that Meteor automatically +creates; if you are using git, the .gitignore file tells git to ignore it. diff --git a/packages/tinytest/.npm/package/npm-shrinkwrap.json b/packages/tinytest/.npm/package/npm-shrinkwrap.json new file mode 100644 index 00000000000..b0da3142b7c --- /dev/null +++ b/packages/tinytest/.npm/package/npm-shrinkwrap.json @@ -0,0 +1,10 @@ +{ + "lockfileVersion": 4, + "dependencies": { + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + } + } +} diff --git a/packages/tinytest/package.js b/packages/tinytest/package.js index 8274b1c2e34..3fd69959c00 100644 --- a/packages/tinytest/package.js +++ b/packages/tinytest/package.js @@ -1,13 +1,16 @@ Package.describe({ summary: "Tiny testing framework", - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', +}); + +Npm.depends({ + "lodash.isequal": "4.5.0" }); Package.onUse(function (api) { api.use([ 'ecmascript', 'ejson', - 'underscore', 'random', 'ddp', 'mongo', diff --git a/packages/tinytest/tinytest.js b/packages/tinytest/tinytest.js index 03029159292..73be02c9f81 100644 --- a/packages/tinytest/tinytest.js +++ b/packages/tinytest/tinytest.js @@ -1,3 +1,5 @@ +import isEqual from "lodash.isequal"; + /******************************************************************************/ /* TestCaseResults */ /******************************************************************************/ @@ -14,6 +16,10 @@ export class TestCaseResults { this.extraDetails = {}; } + sleep(ms = 0) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + ok(doc) { var ok = {type: "ok"}; if (doc) @@ -329,7 +335,7 @@ export class TestCaseResults { include(s, v, message, not) { var pass = false; if (s instanceof Array) { - pass = s.some(it => _.isEqual(v, it)); + pass = s.some(it => isEqual(v, it)); } else if (s && typeof s === "object") { pass = v in s; } else if (typeof s === "string") { @@ -529,6 +535,7 @@ export class TestRun { _runTest(test, onComplete, stop_at_offset) { var startTime = (+new Date); + Tinytest._currentRunningTestName = test.name; return test.run(event => { /* onEvent */ @@ -669,6 +676,7 @@ export class TestRun { /******************************************************************************/ export const Tinytest = {}; +globalThis.__Tinytest = Tinytest; Tinytest.addAsync = function (name, func, options) { TestManager.addCase(new TestCase(name, func), options); @@ -699,6 +707,22 @@ Tinytest._runTests = function (onReport, onComplete, pathPrefix) { testRun.run(onComplete); }; +Tinytest._currentRunningTestName = "" + +Meteor.methods({ + 'tinytest/getCurrentRunningTestName'() { + return Tinytest._currentRunningTestName; + } +}) + +Tinytest._getCurrentRunningTestOnServer = function () { + return Meteor.callAsync('tinytest/getCurrentRunningTestName'); +} + +Tinytest._getCurrentRunningTestOnClient = function () { + return Tinytest._currentRunningTestName; +} + // Run just one test case, and stop the debugger at a particular // error, all as indicated by 'cookie', which will have come from a // failure event output by _runTests. diff --git a/packages/tracker/package.js b/packages/tracker/package.js index 37e12b72e1c..387022c554c 100644 --- a/packages/tracker/package.js +++ b/packages/tracker/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Dependency tracker to allow reactive callbacks", - version: '1.3.3-alpha300.19', + version: '1.3.4-rc300.2', }); Package.onUse(function (api) { diff --git a/packages/tracker/tracker.d.ts b/packages/tracker/tracker.d.ts index 8e71bcc3330..01ba6933b56 100644 --- a/packages/tracker/tracker.d.ts +++ b/packages/tracker/tracker.d.ts @@ -16,6 +16,10 @@ export namespace Tracker { * True during the initial run of the computation at the time `Tracker.autorun` is called, and false on subsequent reruns and at other times. */ firstRun: boolean; + /** + * Forces autorun blocks to be executed in synchronous-looking order by storing the value autorun promise thus making it awaitable. + */ + firstRunPromise: Promise /** * Invalidates this computation so that it will be rerun. */ diff --git a/packages/tracker/tracker.js b/packages/tracker/tracker.js index 5c59a5c34e3..2985a18ddb0 100644 --- a/packages/tracker/tracker.js +++ b/packages/tracker/tracker.js @@ -196,6 +196,16 @@ Tracker.Computation = class Computation { this._onError = onError; this._recomputing = false; + /** + * @summary Forces autorun blocks to be executed in synchronous-looking order by storing the value autorun promise thus making it awaitable. + * @locus Client + * @memberOf Tracker.Computation + * @instance + * @name firstRunPromise + * @returns {Promise} + */ + this.firstRunPromise = undefined; + var errored = true; try { this._compute(); @@ -207,6 +217,22 @@ Tracker.Computation = class Computation { } } + + /** + * Resolves the firstRunPromise with the result of the autorun function. + * @param {*} onResolved + * @param {*} onRejected + * @returns{Promise { - withNoYieldsAllowed(this._func)(this); + // In case of async functions, the result of this function will contain the promise of the autorun function + // & make autoruns await-able. + const firstRunPromise = Tracker.withComputation(this, () => { + return withNoYieldsAllowed(this._func)(this); }); + // We'll store the firstRunPromise on the computation so it can be awaited by the callers, but only + // during the first run. We don't want things to get mixed up. + if (this.firstRun) { + this.firstRunPromise = Promise.resolve(firstRunPromise); + } } finally { inCompute = previousInCompute; } @@ -560,15 +594,12 @@ Tracker._runFlush = function (options) { * thrown. Defaults to the error being logged to the console. * @returns {Tracker.Computation} */ -Tracker.autorun = function (f, options) { +Tracker.autorun = function (f, options = {}) { if (typeof f !== 'function') throw new Error('Tracker.autorun requires a function argument'); - options = options || {}; - constructingComputation = true; - var c = new Tracker.Computation( - f, Tracker.currentComputation, options.onError); + var c = new Tracker.Computation(f, Tracker.currentComputation, options.onError); if (Tracker.active) Tracker.onInvalidate(function () { diff --git a/packages/tracker/tracker_tests.js b/packages/tracker/tracker_tests.js index 78480b7e97f..8c93790bb47 100644 --- a/packages/tracker/tracker_tests.js +++ b/packages/tracker/tracker_tests.js @@ -297,7 +297,7 @@ Tinytest.add("tracker - lifecycle", function (test) { test.equal(c, Tracker.currentComputation); test.equal(c.stopped, false); test.equal(c.invalidated, false); - test.equal(c.firstRun, firstRun); + test.equal(c.firstRun, firstRun); Tracker.onInvalidate(makeCb()); // 1, 6, ... Tracker.afterFlush(makeCb()); // 2, 7, ... @@ -630,6 +630,53 @@ Tinytest.addAsync('tracker - async function - stepped', async function (test) { test.equal(count, limit, 'after resolve'); }); +Tinytest.addAsync('tracker - async function - synchronize', async test => { + let counter = 0; + + await Tracker.autorun(async () => { + test.equal(counter, 0); + counter += 1; + test.equal(counter, 1); + await new Promise(resolve => setTimeout(resolve)); + test.equal(counter, 1); + counter *= 2; + test.equal(counter, 2); + }); + + await Tracker.autorun(async () => { + test.equal(counter, 2); + counter += 1; + test.equal(counter, 3); + await new Promise(resolve => setTimeout(resolve)); + test.equal(counter, 3); + counter *= 2; + test.equal(counter, 6); + }); +}) + +Tinytest.addAsync('tracker - async function - synchronize - firstRunPromise', async test => { + let counter = 0 + await Tracker.autorun(async () => { + test.equal(counter, 0); + counter += 1; + test.equal(counter, 1); + await new Promise(resolve => setTimeout(resolve)); + test.equal(counter, 1); + counter *= 2; + test.equal(counter, 2); + }).firstRunPromise; + + await Tracker.autorun(async () => { + test.equal(counter, 2); + counter += 1; + test.equal(counter, 3); + await new Promise(resolve => setTimeout(resolve)); + test.equal(counter, 3); + counter *= 2; + test.equal(counter, 6); + }).firstRunPromise; +}) + Tinytest.add('computation - #flush', function (test) { var i = 0, j = 0, d = new Tracker.Dependency; var c1 = Tracker.autorun(function () { diff --git a/packages/twitter-config-ui/package.js b/packages/twitter-config-ui/package.js index 2fdb1458342..56a2fa64b4b 100644 --- a/packages/twitter-config-ui/package.js +++ b/packages/twitter-config-ui/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Blaze configuration templates for Twitter OAuth.", - version: '1.0.2-alpha300.19', + version: '1.0.2-rc300.2', }); Package.onUse(function(api) { diff --git a/packages/twitter-config-ui/twitter_configure.html b/packages/twitter-config-ui/twitter_configure.html index eed56c1959f..85b2f3c2d1c 100644 --- a/packages/twitter-config-ui/twitter_configure.html +++ b/packages/twitter-config-ui/twitter_configure.html @@ -1,26 +1,25 @@ diff --git a/packages/twitter-oauth/package.js b/packages/twitter-oauth/package.js index 147ddbf35ca..3f2e7618acb 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.4-alpha300.19' + version: '1.3.4-rc300.2', }); Package.onUse(function(api) { diff --git a/packages/typescript/package.js b/packages/typescript/package.js index b892d042d93..f3d354d2679 100644 --- a/packages/typescript/package.js +++ b/packages/typescript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'typescript', - version: '4.9.5-alpha300.19', + version: '5.4.3-rc300.2', summary: 'Compiler plugin that compiles TypeScript and ECMAScript in .ts and .tsx files', documentation: 'README.md', diff --git a/packages/underscore-tests/package.js b/packages/underscore-tests/package.js index 24cad237160..94e414bc827 100644 --- a/packages/underscore-tests/package.js +++ b/packages/underscore-tests/package.js @@ -2,7 +2,7 @@ Package.describe({ // These tests can't be directly in the underscore packages since // Tinytest depends on underscore summary: "Tests for the underscore package", - version: '1.0.8' + version: '1.0.9-rc300.2', }); Package.onTest(function (api) { diff --git a/packages/underscore/.npm/package/npm-shrinkwrap.json b/packages/underscore/.npm/package/npm-shrinkwrap.json index 4da56ccfdd4..9533a246ae5 100644 --- a/packages/underscore/.npm/package/npm-shrinkwrap.json +++ b/packages/underscore/.npm/package/npm-shrinkwrap.json @@ -2,9 +2,9 @@ "lockfileVersion": 4, "dependencies": { "@types/underscore": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", - "integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==" + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.9.tgz", + "integrity": "sha512-M63wKUdsjDFUfyFt1TCUZHGFk9KDAa5JP0adNUErbm0U45Lr06HtANdYRP+GyleEopEoZ4UyBcdAC5TnW4Uz2w==" } } } diff --git a/packages/underscore/package.js b/packages/underscore/package.js index ba30530abdb..c6c917bd3a6 100644 --- a/packages/underscore/package.js +++ b/packages/underscore/package.js @@ -1,11 +1,11 @@ Package.describe({ summary: "Collection of small helpers: _.map, _.each, ...", - version: '1.0.14-alpha300.19', + version: '1.6.2-rc300.2', }); Npm.depends({ - '@types/underscore': '1.11.4', + '@types/underscore': '1.11.9', }); Package.onUse(function (api) { api.export('_'); diff --git a/packages/underscore/underscore.js b/packages/underscore/underscore.js index f5ca16aa338..6a9e39fe093 100644 --- a/packages/underscore/underscore.js +++ b/packages/underscore/underscore.js @@ -1,6 +1,6 @@ -// Underscore.js 1.5.2 +// Underscore.js 1.6.0 // http://underscorejs.org -// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. (function() { @@ -65,7 +65,7 @@ } // Current version. - _.VERSION = '1.5.2'; + _.VERSION = '1.6.0'; // Collection Functions // -------------------- @@ -100,7 +100,7 @@ // Handles objects with the built-in `forEach`, arrays, and raw objects. // Delegates to **ECMAScript 5**'s native `forEach` if available. var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; + if (obj == null) return obj; if (nativeForEach && obj.forEach === nativeForEach) { obj.forEach(iterator, context); } else if (looksLikeArray(obj)) { @@ -113,6 +113,7 @@ if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; } } + return obj; }; // Return the results of applying the iterator to each element. @@ -178,10 +179,10 @@ }; // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { + _.find = _.detect = function(obj, predicate, context) { var result; any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { + if (predicate.call(context, value, index, list)) { result = value; return true; } @@ -192,33 +193,33 @@ // Return all the elements that pass a truth test. // Delegates to **ECMAScript 5**'s native `filter` if available. // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { + _.filter = _.select = function(obj, predicate, context) { var results = []; if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); + if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context); each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results.push(value); + if (predicate.call(context, value, index, list)) results.push(value); }); return results; }; // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { + _.reject = function(obj, predicate, context) { return _.filter(obj, function(value, index, list) { - return !iterator.call(context, value, index, list); + return !predicate.call(context, value, index, list); }, context); }; // Determine whether all of the elements match a truth test. // Delegates to **ECMAScript 5**'s native `every` if available. // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - iterator || (iterator = _.identity); + _.every = _.all = function(obj, predicate, context) { + predicate || (predicate = _.identity); var result = true; if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); + if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context); each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; + if (!(result = result && predicate.call(context, value, index, list))) return breaker; }); return !!result; }; @@ -226,13 +227,13 @@ // Determine if at least one element in the object matches a truth test. // Delegates to **ECMAScript 5**'s native `some` if available. // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator || (iterator = _.identity); + var any = _.some = _.any = function(obj, predicate, context) { + predicate || (predicate = _.identity); var result = false; if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); + if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context); each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; + if (result || (result = predicate.call(context, value, index, list))) return breaker; }); return !!result; }; @@ -258,19 +259,13 @@ // Convenience version of a common use case of `map`: fetching a property. _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); + return _.map(obj, _.property(key)); }; // Convenience version of a common use case of `filter`: selecting only objects // containing specific `key:value` pairs. - _.where = function(obj, attrs, first) { - if (_.isEmpty(attrs)) return first ? void 0 : []; - return _[first ? 'find' : 'filter'](obj, function(value) { - for (var key in attrs) { - if (attrs[key] !== value[key]) return false; - } - return true; - }); + _.where = function(obj, attrs) { + return _.find(obj, _.matches(attrs)); }; // Convenience version of a common use case of `find`: getting the first object @@ -286,13 +281,15 @@ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { return Math.max.apply(Math, obj); } - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity, value: -Infinity}; + var result = -Infinity, lastComputed = -Infinity; each(obj, function(value, index, list) { var computed = iterator ? iterator.call(context, value, index, list) : value; - computed > result.computed && (result = {value : value, computed : computed}); + if (computed > lastComputed) { + result = value; + lastComputed = computed; + } }); - return result.value; + return result; }; // Return the minimum element (or element-based computation). @@ -300,16 +297,18 @@ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { return Math.min.apply(Math, obj); } - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity, value: Infinity}; + var result = Infinity, lastComputed = Infinity; each(obj, function(value, index, list) { var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); + if (computed < lastComputed) { + result = value; + lastComputed = computed; + } }); - return result.value; + return result; }; - // Shuffle an array, using the modern version of the + // Shuffle an array, using the modern version of the // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). _.shuffle = function(obj) { var rand; @@ -323,11 +322,12 @@ return shuffled; }; - // Sample **n** random values from an array. - // If **n** is not specified, returns a single random element from the array. + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. // The internal `guard` argument allows it to work with `map`. _.sample = function(obj, n, guard) { - if (arguments.length < 2 || guard) { + if (n == null || guard) { + if (obj.length !== +obj.length) obj = _.values(obj); return obj[_.random(obj.length - 1)]; } return _.shuffle(obj).slice(0, Math.max(0, n)); @@ -335,12 +335,14 @@ // An internal function to generate lookup iterators. var lookupIterator = function(value) { - return _.isFunction(value) ? value : function(obj){ return obj[value]; }; + if (value == null) return _.identity; + if (_.isFunction(value)) return value; + return _.property(value); }; // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, value, context) { - var iterator = lookupIterator(value); + _.sortBy = function(obj, iterator, context) { + iterator = lookupIterator(iterator); return _.pluck(_.map(obj, function(value, index, list) { return { value: value, @@ -360,9 +362,9 @@ // An internal function used for aggregate "group by" operations. var group = function(behavior) { - return function(obj, value, context) { + return function(obj, iterator, context) { var result = {}; - var iterator = value == null ? _.identity : lookupIterator(value); + iterator = lookupIterator(iterator); each(obj, function(value, index) { var key = iterator.call(context, value, index, obj); behavior(result, key, value); @@ -374,7 +376,7 @@ // Groups the object's values by a criterion. Pass either a string attribute // to group by, or a function that returns the criterion. _.groupBy = group(function(result, key, value) { - (_.has(result, key) ? result[key] : (result[key] = [])).push(value); + _.has(result, key) ? result[key].push(value) : result[key] = [value]; }); // Indexes the object's values by a criterion, similar to `groupBy`, but for @@ -425,7 +427,9 @@ // allows it to work with `_.map`. _.first = _.head = _.take = function(array, n, guard) { if (array == null) return void 0; - return (n == null) || guard ? array[0] : slice.call(array, 0, n); + if ((n == null) || guard) return array[0]; + if (n < 0) return []; + return slice.call(array, 0, n); }; // Returns everything but the last entry of the array. Especially useful on @@ -440,11 +444,8 @@ // values in the array. The **guard** check allows it to work with `_.map`. _.last = function(array, n, guard) { if (array == null) return void 0; - if ((n == null) || guard) { - return array[array.length - 1]; - } else { - return slice.call(array, Math.max(array.length - n, 0)); - } + if ((n == null) || guard) return array[array.length - 1]; + return slice.call(array, Math.max(array.length - n, 0)); }; // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. @@ -485,6 +486,16 @@ return _.difference(array, slice.call(arguments, 1)); }; + // Split an array into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(array, predicate) { + var pass = [], fail = []; + each(array, function(elem) { + (predicate(elem) ? pass : fail).push(elem); + }); + return [pass, fail]; + }; + // Produce a duplicate-free version of the array. If the array has already // been sorted, you have the option of using a faster algorithm. // Aliased as `unique`. @@ -518,7 +529,7 @@ var rest = slice.call(arguments, 1); return _.filter(_.uniq(array), function(item) { return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; + return _.contains(other, item); }); }); }; @@ -533,7 +544,7 @@ // Zip together multiple lists into a single array -- elements that share // an index go together. _.zip = function() { - var length = _.max(_.pluck(arguments, "length").concat(0)); + var length = _.max(_.pluck(arguments, 'length').concat(0)); var results = new Array(length); for (var i = 0; i < length; i++) { results[i] = _.pluck(arguments, '' + i); @@ -639,19 +650,27 @@ }; // Partially apply a function by creating a version that has had some of its - // arguments pre-filled, without changing its dynamic `this` context. + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. _.partial = function(func) { - var args = slice.call(arguments, 1); + var boundArgs = slice.call(arguments, 1); return function() { - return func.apply(this, args.concat(slice.call(arguments))); + var position = 0; + var args = boundArgs.slice(); + for (var i = 0, length = args.length; i < length; i++) { + if (args[i] === _) args[i] = arguments[position++]; + } + while (position < arguments.length) args.push(arguments[position++]); + return func.apply(this, args); }; }; - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. _.bindAll = function(obj) { var funcs = slice.call(arguments, 1); - if (funcs.length === 0) throw new Error("bindAll must be passed function names"); + if (funcs.length === 0) throw new Error('bindAll must be passed function names'); each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); return obj; }; @@ -690,12 +709,12 @@ var previous = 0; options || (options = {}); var later = function() { - previous = options.leading === false ? 0 : new Date; + previous = options.leading === false ? 0 : _.now(); timeout = null; result = func.apply(context, args); }; return function() { - var now = new Date; + var now = _.now(); if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; @@ -705,6 +724,7 @@ timeout = null; previous = now; result = func.apply(context, args); + context = args = null; } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } @@ -718,24 +738,32 @@ // leading edge, instead of the trailing. _.debounce = function(func, wait, immediate) { var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + context = args = null; + } + } + }; + return function() { context = this; args = arguments; - timestamp = new Date(); - var later = function() { - var last = (new Date()) - timestamp; - if (last < wait) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - if (!immediate) result = func.apply(context, args); - } - }; + timestamp = _.now(); var callNow = immediate && !timeout; if (!timeout) { timeout = setTimeout(later, wait); } - if (callNow) result = func.apply(context, args); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } return result; }; }; @@ -757,11 +785,7 @@ // allowing you to adjust arguments, run code before and after, and // conditionally execute the original function. _.wrap = function(func, wrapper) { - return function() { - var args = [func]; - push.apply(args, arguments); - return wrapper.apply(this, args); - }; + return _.partial(wrapper, func); }; // Returns a function that is the composition of a list of functions, each @@ -791,8 +815,9 @@ // Retrieve the names of an object's properties. // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); var keys = []; for (var key in obj) if (_.has(obj, key)) keys.push(key); return keys; @@ -947,7 +972,8 @@ // from different frames are. var aCtor = a.constructor, bCtor = b.constructor; if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && - _.isFunction(bCtor) && (bCtor instanceof bCtor))) { + _.isFunction(bCtor) && (bCtor instanceof bCtor)) + && ('constructor' in a && 'constructor' in b)) { return false; } // Add the first object to the stack of traversed objects. @@ -1087,6 +1113,30 @@ return value; }; + _.constant = function(value) { + return function () { + return value; + }; + }; + + _.property = function(key) { + return function(obj) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of `key:value` pairs. + _.matches = function(attrs) { + return function(obj) { + if (obj === attrs) return true; //avoid comparing an object to itself. + for (var key in attrs) { + if (attrs[key] !== obj[key]) + return false; + } + return true; + } + }; + // Run a function **n** times. _.times = function(n, iterator, context) { var accum = Array(Math.max(0, n)); @@ -1103,6 +1153,9 @@ return min + Math.floor(Math.random() * (max - min + 1)); }; + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { return new Date().getTime(); }; + // List of HTML entities for escaping. var entityMap = { escape: { diff --git a/packages/url/package.js b/packages/url/package.js index 650287f1ace..9773d35296b 100644 --- a/packages/url/package.js +++ b/packages/url/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "url", - version: "1.3.2", + version: '1.3.3-rc300.2', summary: "Isomorphic modern/legacy/Node polyfill for WHATWG URL/URLSearchParams", documentation: "README.md" }); diff --git a/packages/webapp-hashing/package.js b/packages/webapp-hashing/package.js index 25c6d53b063..aa6a6794f31 100644 --- a/packages/webapp-hashing/package.js +++ b/packages/webapp-hashing/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Used internally by WebApp. Knows how to hash programs from manifests.", - version: '1.1.2-alpha300.19' + version: '1.1.2-rc300.2', }); Package.onUse(function(api) { diff --git a/packages/webapp/.npm/package/npm-shrinkwrap.json b/packages/webapp/.npm/package/npm-shrinkwrap.json index d8913a46ac3..db9acb4100b 100644 --- a/packages/webapp/.npm/package/npm-shrinkwrap.json +++ b/packages/webapp/.npm/package/npm-shrinkwrap.json @@ -7,9 +7,9 @@ "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==" }, "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==" + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==" }, "@types/express": { "version": "4.17.15", @@ -17,9 +17,9 @@ "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==" }, "@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==" + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==" }, "@types/http-errors": { "version": "2.0.4", @@ -32,14 +32,14 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==" + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==" }, "@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" }, "@types/range-parser": { "version": "1.2.7", @@ -52,9 +52,9 @@ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==" }, "@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==" + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==" }, "@vlasky/whomst": { "version": "0.1.7", @@ -94,9 +94,9 @@ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==" }, "compressible": { "version": "2.0.18", @@ -126,14 +126,14 @@ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "cookie-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==" + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==" }, "cookie-signature": { "version": "1.0.6", @@ -151,9 +151,9 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" }, "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==" }, "depd": { "version": "2.0.0", @@ -180,6 +180,16 @@ "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==" }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -205,11 +215,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -219,11 +224,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==" } } }, @@ -248,9 +248,9 @@ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==" }, "get-stream": { "version": "6.0.1", @@ -263,14 +263,14 @@ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==" }, "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==" }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "has-symbols": { "version": "1.0.3", @@ -278,9 +278,9 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==" }, "http-errors": { "version": "2.0.0", @@ -367,11 +367,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -422,11 +417,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "posix": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/posix/-/posix-4.2.0.tgz", - "integrity": "sha512-JbxfT0Fxy/SG10LSkKX1C75iULYfAJqYCwwmM6J0+zh2vl/bE51CqaqvSpdZWg7YAwiuDIoBI6j7in+n3GgXSw==" - }, "promise-polyfill": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-1.1.6.tgz", @@ -443,9 +433,9 @@ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==" + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==" }, "range-parser": { "version": "1.2.1", @@ -475,73 +465,26 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==" - }, "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==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==" - } - } + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==" }, "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==" }, "setprototypeof": { "version": "1.2.0", @@ -559,9 +502,9 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==" }, "signal-exit": { "version": "3.0.7", @@ -574,9 +517,9 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "stream-to-string": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stream-to-string/-/stream-to-string-1.2.0.tgz", - "integrity": "sha512-8drZlFIKBHSMdX9GCWv8V9AAWnQcTqw0iAI6/GC7UJ0H0SwKeFKjOoZfGY1tOU00GGU7FYZQoJ/ZCUEoXhD7yQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/stream-to-string/-/stream-to-string-1.2.1.tgz", + "integrity": "sha512-WsvTDNF8UYs369Yko3pcdTducQtYpzEZeOV7cTuReyFvOoA9S/DLJ6sYK+xPafSPHhUMpaxiljKYnT6JSFztIA==" }, "strip-final-newline": { "version": "2.0.0", diff --git a/packages/webapp/package.js b/packages/webapp/package.js index 723bc707ce0..9db4676c064 100644 --- a/packages/webapp/package.js +++ b/packages/webapp/package.js @@ -1,21 +1,21 @@ Package.describe({ summary: 'Serves a Meteor app over HTTP', - version: '2.0.0-alpha300.19', + version: '2.0.0-rc300.2', }); Npm.depends({ - 'cookie-parser': '1.4.5', + 'cookie-parser': '1.4.6', express: '4.18.2', '@types/express': '4.17.15', compression: '1.7.4', errorhandler: '1.5.1', parseurl: '1.3.3', - send: '0.17.1', - 'stream-to-string': '1.2.0', - qs: '6.10.1', + send: '0.18.0', + 'stream-to-string': '1.2.1', + qs: '6.11.2', useragent: '2.3.0', '@vlasky/whomst': '0.1.7', - '@types/connect': '3.4.35', + '@types/connect': '3.4.38', }); Npm.strip({ @@ -25,7 +25,7 @@ Npm.strip({ // whitelist plugin is now included in the core Cordova.depends({ - 'cordova-plugin-meteor-webapp': '2.0.1', + 'cordova-plugin-meteor-webapp': '2.0.4', }); Package.onUse(function(api) { diff --git a/packages/webapp/webapp.d.ts b/packages/webapp/webapp.d.ts index 6dbe152088d..7997fac577f 100644 --- a/packages/webapp/webapp.d.ts +++ b/packages/webapp/webapp.d.ts @@ -1,5 +1,5 @@ -import * as http from 'http'; -import express from 'express'; +import * as http from "http"; +import * as express from "express"; export interface StaticFiles { [key: string]: { @@ -12,6 +12,16 @@ export interface StaticFiles { }; } +type ExpressModule = { + (): express.Application; + json: typeof express.json; + raw: typeof express.raw; + Router: typeof express.Router; + static: typeof express.static; + text: typeof express.text; + urlencoded: typeof express.urlencoded; +}; + export declare module WebApp { var defaultArch: string; var clientPrograms: { @@ -26,15 +36,16 @@ export declare module WebApp { /** * @deprecated use handlers instead */ - var connectHandlers: express.Handler; - var handlers: express.Handler; + var connectHandlers: express.Application; + var handlers: express.Application; /** * @deprecated use rawHandlers instead */ - var rawConnectHandlers: express.Handler; - var rawHandlers: express.Handler; + var rawConnectHandlers: express.Application; + var rawHandlers: express.Application; var httpServer: http.Server; var expressApp: express.Application; + var express: ExpressModule; /** * Should be used only for testing * @deprecated use _suppressExpressErrors instead @@ -47,7 +58,7 @@ export declare module WebApp { function onListening(callback: Function): void; type RuntimeConfigHookCallback = (options: { - arch: 'web.browser' | 'web.browser.legacy' | 'web.cordova'; + arch: "web.browser" | "web.browser.legacy" | "web.cordova"; request: http.IncomingMessage; encodedCurrentConfig: string; updated: boolean; @@ -65,9 +76,7 @@ export declare module WebAppInternals { module: any; }; }; - function identifyBrowser( - userAgentString: string - ): { + function identifyBrowser(userAgentString: string): { name: string; major: string; minor: string; diff --git a/packages/webapp/webapp_server.js b/packages/webapp/webapp_server.js index 1245207519e..a616f7faf6c 100644 --- a/packages/webapp/webapp_server.js +++ b/packages/webapp/webapp_server.js @@ -44,6 +44,9 @@ WebAppInternals.NpmModules = { } }; +// More of a convenience for the end user +WebApp.express = express; + // Though we might prefer to use web.browser (modern) as the default // architecture, safety requires a more compatible defaultArch. WebApp.defaultArch = 'web.browser.legacy'; diff --git a/packages/weibo-config-ui/package.js b/packages/weibo-config-ui/package.js index c5e498a863d..97f066b4a71 100644 --- a/packages/weibo-config-ui/package.js +++ b/packages/weibo-config-ui/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Blaze configuration templates for Weibo OAuth.", - version: '1.0.3-alpha300.19', + version: '1.0.3-rc300.2', }); Package.onUse(api => { diff --git a/packages/weibo-oauth/package.js b/packages/weibo-oauth/package.js index e2de8dd3ba6..b37e21c4d5d 100644 --- a/packages/weibo-oauth/package.js +++ b/packages/weibo-oauth/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Weibo OAuth flow", - version: "1.3.2", + version: '1.3.3-rc300.2', }); Package.onUse(api => { @@ -14,3 +14,9 @@ Package.onUse(api => { api.export('Weibo'); }); + +Package.onTest(function(api) { + api.use('weibo-oauth'); + api.use(['tinytest', 'ecmascript', 'test-helpers', 'oauth', 'oauth2', 'service-configuration']); + api.addFiles('weibo-oauth_tests.js'); +}); diff --git a/packages/weibo-oauth/weibo-oauth_tests.js b/packages/weibo-oauth/weibo-oauth_tests.js new file mode 100644 index 00000000000..260b483cd2a --- /dev/null +++ b/packages/weibo-oauth/weibo-oauth_tests.js @@ -0,0 +1,34 @@ +Tinytest.addAsync( + 'weibo-oauth - run service oauth with mocked flow as expected', + async function (test) { + const oauthMock = mockBehaviours(OAuth, { + _fetch: () => Promise.resolve({ json: () => ({ access_token: 'testToken', uid: '12345' })}), + }); + + const service = 'weibo'; + const serviceMockConfig = { service }; + const mockConfig = { clientId: "test", secret: "test", loginStyle: "popup" }; + if (Meteor.isServer) { + await ServiceConfiguration.configurations.upsertAsync(serviceMockConfig, { $set: mockConfig }); + const result = await OAuthTest.registeredServices[service].handleOauthRequest({}); + test.isTrue(!!result?.serviceData, 'should return mocked result'); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['openSecret','_redirectUri','_fetch','_fetch'], + 'should run mock oauth behaviors', + ); + } else if (Meteor.isClient) { + ServiceConfiguration.configurations.insert({ ...serviceMockConfig, ...mockConfig }); + Weibo.requestCredential({}); + test.equal( + oauthMock.mockedRuns.map(({ name }) => name), + ['_loginStyle', '_redirectUri', '_stateParam', 'launchLogin'], + 'should run mock oauth behaviors', + ); + } + + oauthMock.stop(); + + return Promise.resolve(); + }, +); diff --git a/packages/weibo-oauth/weibo_server.js b/packages/weibo-oauth/weibo_server.js index 24d56438fdb..44ef8558dbf 100644 --- a/packages/weibo-oauth/weibo_server.js +++ b/packages/weibo-oauth/weibo_server.js @@ -32,7 +32,7 @@ OAuth.registerService('weibo', 2, null, async query => { // - access_token // - expires_in: lifetime of this token in seconds (5 years(!) right now) const getTokenResponse = async (query) => { - const config = ServiceConfiguration.configurations.findOne({ + const config = await ServiceConfiguration.configurations.findOneAsync({ service: 'weibo', }); if (!config) throw new ServiceConfiguration.ConfigError(); diff --git a/scripts/admin/check-legacy-syntax/check-syntax.js b/scripts/admin/check-legacy-syntax/check-syntax.js index 3924eb2f478..09fd3acd3a0 100644 --- a/scripts/admin/check-legacy-syntax/check-syntax.js +++ b/scripts/admin/check-legacy-syntax/check-syntax.js @@ -5,8 +5,8 @@ // and when used in build plugins can run in old Meteor versions const clientEcmascriptVersion = 5; -// Node 8 (Meteor 1.6+) fully supports 2016 -const serverEcmascriptVersion = "2016"; +// Node 8 (Meteor 1.6+) fully supports 2016, and supports most of 2017 +const serverEcmascriptVersion = "2017"; // Latest version - (has TLA) const latestEcmascriptVersion = "2022"; @@ -26,15 +26,14 @@ const packages = { meteor: { serverFiles: [ "server_environment.js", + "dynamics_nodejs.js", + "emitter-promise.js" ], // TODO: Fibers // Ignored server files that has a features > 2016 ignoredFiles: [ - "emitter-promise.js", - "dynamics_nodejs.js", "async_helpers.js", - "asl-helpers.js", ] }, "accounts-ui": {}, diff --git a/scripts/admin/copy-dev-bundle-from-jenkins.sh b/scripts/admin/copy-dev-bundle-from-jenkins.sh index ab6bfdb13aa..58931c51629 100755 --- a/scripts/admin/copy-dev-bundle-from-jenkins.sh +++ b/scripts/admin/copy-dev-bundle-from-jenkins.sh @@ -27,7 +27,7 @@ if [ $# -ne 1 ]; then exit 1 fi -DIRNAME=$(aws s3 ls s3://com.meteor.jenkins/ | perl -nle 'print $1 if m!(dev-bundle-.+--'${arg}'--.+)/!') +DIRNAME=$(aws s3 ls s3://com.meteor.jenkins/ | perl -nle 'print $1 if m!(dev-bundle-.+--'${arg}')/!') if [ -z "$DIRNAME" ]; then echo "build not found" 1>&2 @@ -39,7 +39,7 @@ echo Found build $DIRNAME trap "echo Found surprising number of tarballs." EXIT # Check to make sure the proper number of each kind of file is there. aws s3 ls s3://com.meteor.jenkins/$DIRNAME/ | \ - perl -nle 'if (/\.tar\.gz/) { ++$TAR } else { die "something weird" } END { exit !($TAR == 3) }' + perl -nle 'if (/\.tar\.gz/) { ++$TAR } else { die "something weird" } END { exit !($TAR == 4) }' trap - EXIT diff --git a/scripts/admin/copy-dev-bundle-mac-m1-from-jenkins.sh b/scripts/admin/copy-dev-bundle-mac-m1-from-jenkins.sh index 80606dd1c70..6cb1a761ff6 100755 --- a/scripts/admin/copy-dev-bundle-mac-m1-from-jenkins.sh +++ b/scripts/admin/copy-dev-bundle-mac-m1-from-jenkins.sh @@ -27,7 +27,7 @@ if [ $# -ne 1 ]; then exit 1 fi -DIRNAME=$(aws s3 ls s3://com.meteor.jenkins/ | perl -nle 'print $1 if m!(dev-bundle-.+--'${arg}'--.+mac-m1)/!') +DIRNAME=$(aws s3 ls s3://com.meteor.jenkins/ | perl -nle 'print $1 if m!(dev-bundle-.+--'${arg}'.+mac-m1)/!') if [ -z "$DIRNAME" ]; then echo "build not found" 1>&2 diff --git a/scripts/admin/launch-meteor b/scripts/admin/launch-meteor index 1ec76b42802..69e3afb2657 100755 --- a/scripts/admin/launch-meteor +++ b/scripts/admin/launch-meteor @@ -60,6 +60,8 @@ if [ ! -x "$METEOR_WAREHOUSE_DIR/meteor" ]; then PLATFORM="os.linux.x86_32" elif [ "${LINUX_ARCH}" = "x86_64" ] ; then PLATFORM="os.linux.x86_64" + elif [ "${LINUX_ARCH}" = "aarch64" ] ; then + PLATFORM="os.linux.aarch64" else echo "Unusable architecture: ${LINUX_ARCH}" echo "Meteor only supports i686 and x86_64 for now." diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index 7a082708df0..755740a0931 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "3.0-alpha.19", + "version": "3.0-rc.2", "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 2e8d355c59d..3b9264ec99f 100644 --- a/scripts/admin/meteor-release-official.json +++ b/scripts/admin/meteor-release-official.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "2.13.3", + "version": "2.16", "recommended": false, "official": true, "description": "The Official Meteor Distribution" diff --git a/scripts/admin/publish-meteor-tool-on-all-platforms.sh b/scripts/admin/publish-meteor-tool-on-all-platforms.sh index 2e96214eae7..8d1cd11ba21 100755 --- a/scripts/admin/publish-meteor-tool-on-all-platforms.sh +++ b/scripts/admin/publish-meteor-tool-on-all-platforms.sh @@ -42,7 +42,7 @@ main () { echo # XXX there is no os.windows.x86_64 as we don't build for it at the moment - PLATFORMS=( os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 os.windows.x86_32 ) + PLATFORMS=( os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 os.windows.x86_32 os.linux.aarch64 ) for PLATFORM in ${PLATFORMS[@]}; do COMMAND="`dirname $0`/publish-meteor-tool-on-arch.sh $GITSHA $PLATFORM $SESSION_FILE" echo $COMMAND diff --git a/scripts/admin/publish-meteor-tool-on-arch.sh b/scripts/admin/publish-meteor-tool-on-arch.sh index 9041ac4035c..795f43a1401 100755 --- a/scripts/admin/publish-meteor-tool-on-arch.sh +++ b/scripts/admin/publish-meteor-tool-on-arch.sh @@ -18,7 +18,7 @@ main () { echo "usage: $0 " 1>&2 echo "The passed sha1 is checked out and published from the machines." 1>&2 echo "Options for platform:" 1>&2 - echo " os.osx.x86_64 os.linux.x86_64 os.linux.x86_32" 1>&2 + echo " os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 os.linux.aarch64" 1>&2 echo " os.windows.x86_32 os.windows.x86_64" 1>&2 exit 1 fi @@ -33,7 +33,7 @@ main () { METEOR="$CHECKOUT_DIR/meteor" - UNIX_PLATFORMS=( os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 ) + UNIX_PLATFORMS=( os.osx.x86_64 os.linux.x86_64 os.linux.x86_32 os.linux.aarch64 ) WINDOWS_PLATFORMS=( os.windows.x86_32 os.windows.x86_64 ) if [[ $PLATFORM =~ ^(os\.linux|os\.osx) ]] ; then diff --git a/scripts/admin/update-semver/index.js b/scripts/admin/update-semver/index.js index f6ad15ab7ad..ddcbde17920 100644 --- a/scripts/admin/update-semver/index.js +++ b/scripts/admin/update-semver/index.js @@ -79,7 +79,7 @@ async function main() { */ let args = process.argv.slice(2); // if gets bigger turn into a function - const dir = args[1].includes("blaze") + const dir = args[1]?.includes("blaze") ? "packages/non-core/blaze/packages" : "packages"; const releaseNumber = await getReleaseNumber(); @@ -173,13 +173,13 @@ async function main() { const version = semver.inc(currentVersion, 'prerelease', release); if (name === 'meteor-tool') return version; - return version.replace(release, `${ release }${ releaseNumber }`); + return version?.replace(release, `${ release }${ releaseNumber }`); } return semver.inc(currentVersion, release); } const n = incrementNewVersion(release); - const newVersion = n?.replace(n, `${n}-alpha300.3`) + const newVersion = n?.replace(n, `${n}`) console.log(`Updating ${ name } from ${ currentVersion } to ${ newVersion }`); const newCode = code.replace(rawVersion, ` '${ newVersion }',`); await fs.promises.writeFile(filePath, newCode); diff --git a/scripts/build-dev-bundle-common.sh b/scripts/build-dev-bundle-common.sh index 972427998e1..4321a509adb 100644 --- a/scripts/build-dev-bundle-common.sh +++ b/scripts/build-dev-bundle-common.sh @@ -5,17 +5,17 @@ set -u UNAME=$(uname) ARCH=$(uname -m) -NODE_VERSION=20.9.0 -MONGO_VERSION_64BIT=6.0.3 +NODE_VERSION=20.12.2 +MONGO_VERSION_64BIT=7.0.5 MONGO_VERSION_32BIT=3.2.22 -NPM_VERSION=10.1.0 +NPM_VERSION=10.5.0 if [ "$UNAME" == "Linux" ] ; then NODE_BUILD_NUMBER= - if [ "$ARCH" != "i686" -a "$ARCH" != "x86_64" ] ; then + if [[ "$ARCH" != "i686" && "$ARCH" != "x86_64" && "$ARCH" != "aarch64" ]] ; then echo "Unsupported architecture: $ARCH" - echo "Meteor only supports i686 and x86_64 for now." + echo "Meteor only supports i686, x86_64 and aarch64 for now." exit 1 fi @@ -67,6 +67,9 @@ then elif [ "$ARCH" == "x86_64" ] then NODE_TGZ="node-v${NODE_VERSION}-linux-x64.tar.gz" + elif [ "$ARCH" == "aarch64" ] + then + NODE_TGZ="node-v${NODE_VERSION}-linux-arm64.tar.gz" else echo "Unknown architecture: $UNAME $ARCH" exit 1 diff --git a/scripts/dev-bundle-server-package.js b/scripts/dev-bundle-server-package.js index 99f3689e603..c3399412d95 100644 --- a/scripts/dev-bundle-server-package.js +++ b/scripts/dev-bundle-server-package.js @@ -11,20 +11,20 @@ var packageJson = { // Keep the versions of these packages consistent with the versions // found in dev-bundle-tool-package.js. promise: "8.1.0", - "@meteorjs/reify": "0.24.0", - "@babel/parser": "7.15.3", - "@types/underscore": "1.11.2", - underscore: "1.13.1", + "@meteorjs/reify": "0.25.1", + "@babel/parser": "7.17.0", + underscore: "1.13.6", "source-map-support": "https://github.com/meteor/node-source-map-support/tarball/81bce1f99625e62af73338f63afcf2b44c6cfa5e", - "@types/semver": "5.4.0", - semver: "5.4.1" + "@types/semver": "5.5.0", + semver: "7.5.4" }, // These are only used in dev mode (by shell.js) so end-users can avoid // needing to install them if they use `npm install --production`. devDependencies: { + "@types/underscore": "1.11.2", split2: "3.2.2", - multipipe: "1.0.2", - chalk: "0.5.1" + multipipe: "2.0.1", + chalk: "4.1.2" } }; diff --git a/scripts/dev-bundle-tool-package.js b/scripts/dev-bundle-tool-package.js index a5b4a53c86b..022e6ebb170 100644 --- a/scripts/dev-bundle-tool-package.js +++ b/scripts/dev-bundle-tool-package.js @@ -10,24 +10,24 @@ var packageJson = { dependencies: { // Explicit dependency because we are replacing it with a bundled version // and we want to make sure there are no dependencies on a higher version - npm: "10.1.0", + npm: "10.5.0", "node-gyp": "9.4.0", "@mapbox/node-pre-gyp": "1.0.11", - typescript: "4.9.4", - "@meteorjs/babel": "7.19.0-beta.3", + typescript: "5.4.5", + "@meteorjs/babel": "7.19.0-beta.4", // Keep the versions of these packages consistent with the versions // found in dev-bundle-server-package.js. - "@meteorjs/reify": "0.24.0", + "@meteorjs/reify": "0.25.1", // So that Babel can emit require("@babel/runtime/helpers/...") calls. "@babel/runtime": "7.15.3", // For backwards compatibility with isopackets that still depend on // babel-runtime rather than @babel/runtime. "babel-runtime": "7.0.0-beta.3", "@types/underscore": "1.11.2", - underscore: "1.13.1", - "source-map-support": "https://github.com/meteor/node-source-map-support/tarball/81bce1f99625e62af73338f63afcf2b44c6cfa5e", - "@types/semver": "5.4.0", - semver: "5.4.1", + underscore: "1.13.6", + "source-map-support": "https://github.com/meteor/node-source-map-support/tarball/1912478769d76e5df4c365e147f25896aee6375e", + "@types/semver": "5.5.0", + semver: "7.5.4", request: "2.88.2", uuid: "3.4.0", "graceful-fs": "4.2.6", @@ -39,9 +39,10 @@ var packageJson = { // TODO: We should replace this with: https://github.com/jprichardson/node-kexec/pull/38 kexec: "https://github.com/meteor/node-kexec/tarball/f29f54037c7db6ad29e1781463b182e5929215a0", "source-map": "0.7.4", - chalk: "4.1.1", + chalk: "4.1.2", // TODO: maybe replace with https://www.npmjs.com/package/better-sqlite3 sqlite3: "5.0.2", + inquirer: "8.2.6", "http-proxy": "1.18.1", "is-reachable": "3.1.0", "wordwrap": "1.0.0", @@ -65,7 +66,8 @@ var packageJson = { 'lru-cache': '4.1.5', "anser": "2.0.1", 'xmlbuilder2': '1.8.1', - "ws": "7.4.5" + "ws": "7.4.5", + "open":"8.4.2" } }; diff --git a/scripts/generate-dev-bundle.sh b/scripts/generate-dev-bundle.sh index e41cc803d8a..8e0de641e8d 100755 --- a/scripts/generate-dev-bundle.sh +++ b/scripts/generate-dev-bundle.sh @@ -64,7 +64,7 @@ fi case $OS in macos) MONGO_BASE_URL="https://fastdl.mongodb.org/osx" ;; linux) - [ $ARCH = "i686" ] && + [ $ARCH = "i686" -o $ARCH = "aarch64" ] && MONGO_BASE_URL="https://fastdl.mongodb.org/linux" || MONGO_BASE_URL="https://github.com/meteor/mongodb-builder/releases/download/v${MONGO_VERSION}" ;; @@ -73,6 +73,8 @@ esac if [ $OS = "macos" ] && [ "$(uname -m)" = "arm64" ] ; then MONGO_NAME="mongodb-${OS}-x86_64-${MONGO_VERSION}" +elif [ $OS = "linux" ] && [ "$ARCH" = "aarch64" ] ; then + MONGO_NAME="mongodb-linux-aarch64-ubuntu2204-${MONGO_VERSION}" else MONGO_NAME="mongodb-${OS}-${ARCH}-${MONGO_VERSION}" fi diff --git a/scripts/make-release-tarballs.sh b/scripts/make-release-tarballs.sh index 562b67823ce..3ae13bce53f 100755 --- a/scripts/make-release-tarballs.sh +++ b/scripts/make-release-tarballs.sh @@ -12,13 +12,17 @@ done echo "BRANCH_NAME = $BRANCH_NAME" echo "VERSION = $VERSION" -git fetch origin && git checkout release/METEOR@"$VERSION" && - git reset --hard origin/"$BRANCH_NAME" && - git clean -df && - ./meteor admin make-bootstrap-tarballs --target-arch os.windows.x86_64 "$VERSION" win64 && +git fetch origin +git checkout release/METEOR@"$VERSION" +git reset --hard origin/"$BRANCH_NAME" +git clean -df + +./meteor admin make-bootstrap-tarballs --target-arch os.windows.x86_64 "$VERSION" win64 && aws s3 cp --acl public-read win64/meteor-bootstrap-os.windows.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/"$VERSION"/ && ./meteor admin make-bootstrap-tarballs --target-arch os.linux.x86_64 "$VERSION" linux64 && aws s3 cp --acl public-read linux64/meteor-bootstrap-os.linux.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/"$VERSION"/ && + ./meteor admin make-bootstrap-tarballs --target-arch os.linux.aarch64 "$VERSION" linux64 && + aws s3 cp --acl public-read linux64/meteor-bootstrap-os.linux.aarch64.tar.gz s3://com.meteor.static/packages-bootstrap/"$VERSION"/ && ./meteor admin make-bootstrap-tarballs --target-arch os.osx.x86_64 "$VERSION" osx && aws s3 cp --acl public-read osx/meteor-bootstrap-os.osx.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/"$VERSION"/ && ./meteor admin make-bootstrap-tarballs --target-arch os.osx.arm64 "$VERSION" osx && diff --git a/scripts/test-balancer/package-lock.json b/scripts/test-balancer/package-lock.json index 675392c2180..88bd5ca6d30 100644 --- a/scripts/test-balancer/package-lock.json +++ b/scripts/test-balancer/package-lock.json @@ -1,27 +1,37 @@ { "name": "test-balancer", "version": "0.0.1", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "sax": { + "packages": { + "": { + "name": "test-balancer", + "version": "0.0.1", + "dependencies": { + "xml2js": "^0.4.19" + } + }, + "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "xml2js": { + "node_modules/xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.4" + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" } }, - "xmlbuilder": { + "node_modules/xmlbuilder": { "version": "9.0.4", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", - "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=" + "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=", + "engines": { + "node": ">=4.0" + } } } } diff --git a/scripts/windows/appveyor/install.ps1 b/scripts/windows/ci/install.ps1 similarity index 100% rename from scripts/windows/appveyor/install.ps1 rename to scripts/windows/ci/install.ps1 diff --git a/scripts/windows/appveyor/test.ps1 b/scripts/windows/ci/test.ps1 similarity index 56% rename from scripts/windows/appveyor/test.ps1 rename to scripts/windows/ci/test.ps1 index f8ef08707d8..7c94f9ea2b5 100644 --- a/scripts/windows/appveyor/test.ps1 +++ b/scripts/windows/ci/test.ps1 @@ -25,19 +25,6 @@ If ($selfTestExitCode -eq 0) { Write-Host "FAILURE! (Exit: $selfTestExitCode)" -ForegroundColor Red } -Write-Host "Uploading JUnit test results..." -ForegroundColor Magenta -$wc = New-Object 'System.Net.WebClient' -Get-ChildItem $env:TEMP 'self-test-junit-*.xml' | Foreach-Object { - Write-Host " - $($_.FullName)" -ForegroundColor Magenta - Write-Host " - as Artifact..." -ForegroundColor Magenta - Push-AppveyorArtifact $_.FullName - Write-Host " - as Test Results..." -ForegroundColor Magenta - $artifactPostUrl = ` - "https://ci.appveyor.com/api/testresults/junit/", - $env:APPVEYOR_JOB_ID -Join '' - $wc.UploadFile($artifactPostUrl, ($_.FullName)) -} - If ($selfTestExitCode -ne 0) { Exit $selfTestExitCode } diff --git a/tools/cli/commands-packages-query.js b/tools/cli/commands-packages-query.js index 81f75f71c02..7f31e401319 100644 --- a/tools/cli/commands-packages-query.js +++ b/tools/cli/commands-packages-query.js @@ -111,8 +111,8 @@ var formatHiddenVersions = function (hiddenVersions, oldestShownVersion) { }; // Converts an object to an EJSON string with the right spacing. -function formatEJSON(data) { - const { EJSON } = loadIsopackage('ejson'); +async function formatEJSON(data) { + const { EJSON } = await loadIsopackage('ejson'); return EJSON.stringify(data, { indent: true }) + "\n"; } @@ -466,13 +466,13 @@ Object.assign(PackageQuery.prototype, { // options: // - ejson: Don't pretty-print the data. Print a machine-readable ejson // object. - print: function (options) { + print: async function (options) { var self = this; // If we are asking for an EJSON-style output, we will only print out the // relevant fields. if (options.ejson) { - Console.rawInfo(formatEJSON( + Console.rawInfo(await formatEJSON( self.data.version ? self._generateVersionObject(self.data) : self._generatePackageObject(self.data))); @@ -1112,7 +1112,7 @@ Object.assign(ReleaseQuery.prototype, { // options: // - ejson: Don't pretty-print the data. Return a machine-readable ejson // object. - print: function (options) { + print: async function (options) { var self = this; // If we are asking for an EJSON-style output, print out the relevant fields. @@ -1123,7 +1123,7 @@ Object.assign(ReleaseQuery.prototype, { ]; var packageFields = [ "name", "maintainers", "versions" ]; var fields = self.data.version ? versionFields : packageFields; - Console.rawInfo(formatEJSON(_.pick(self.data, fields))); + Console.rawInfo(await formatEJSON(_.pick(self.data, fields))); return; } @@ -1482,7 +1482,7 @@ main.registerCommand({ return itemNotFound(fullName); } - query.print({ ejson: !! options.ejson }); + await query.print({ ejson: !! options.ejson }); return 0; }); @@ -1652,7 +1652,7 @@ main.registerCommand({ packages: matchingPackages, releases: matchingReleases }; - Console.rawInfo(formatEJSON(ret)); + Console.rawInfo(await formatEJSON(ret)); return 0; } diff --git a/tools/cli/commands-packages.js b/tools/cli/commands-packages.js index 0c03beb0a32..e580246c480 100644 --- a/tools/cli/commands-packages.js +++ b/tools/cli/commands-packages.js @@ -1528,7 +1528,7 @@ var maybeUpdateRelease = async function (options) { if (release.current && ! release.current.isRecommended() && options.appDir && ! options.patch) { var releaseVersion = await release.current.getReleaseVersion(); - var newerRecommendedReleases = getLaterReleaseVersions( + var newerRecommendedReleases = await getLaterReleaseVersions( releaseTrack, releaseVersion); if (!newerRecommendedReleases.length) { // When running 'meteor update' without --release in an app, @@ -2654,7 +2654,7 @@ main.registerCommand({ // check if the passed arch is in the list var arch = options['target-arch']; if (! osArches.includes(arch)) { - throw new Error( + throw new Error( arch + ": the arch is not available for the release. Available arches: " + osArches.join(', ')); } diff --git a/tools/cli/commands.js b/tools/cli/commands.js index c46b5ba0f65..4d5076ff33e 100644 --- a/tools/cli/commands.js +++ b/tools/cli/commands.js @@ -19,10 +19,14 @@ const { red, yellow } = require('../console/console.js').colors; +const inquirer = require('inquirer'); + var projectContextModule = require('../project-context.js'); var release = require('../packaging/release.js'); const { Profile } = require("../tool-env/profile"); +const open = require('open') + const { exec } = require("child_process"); /** * Run a command in the shell. @@ -353,6 +357,7 @@ var runCommandOptions = { maxArgs: Infinity, options: { port: { type: String, short: "p", default: DEFAULT_PORT }, + open: { type: Boolean, short: "o", default: false }, 'mobile-server': { type: String }, 'cordova-server-port': { type: String }, 'app-port': { type: String }, @@ -374,7 +379,7 @@ var runCommandOptions = { // of top-level dependencies. 'allow-incompatible-update': { type: Boolean }, 'extra-packages': { type: String }, - 'exclude-archs': { type: String } + 'exclude-archs': { type: String }, }, catalogRefresh: new catalog.Refresh.Never() }; @@ -448,6 +453,7 @@ async function doRunCommand(options) { runLog.setRawLogs(true); } + let webArchs = projectContext.platformList.getWebArchs(); if (! _.isEmpty(runTargets) || options['mobile-server']) { @@ -505,7 +511,18 @@ async function doRunCommand(options) { cordovaServerPort: parsedCordovaServerPort, once: options.once, noReleaseCheck: options['no-release-check'] || process.env.METEOR_NO_RELEASE_CHECK, - cordovaRunner: cordovaRunner + cordovaRunner: cordovaRunner, + onBuilt: function () { + // Opens a browser window when it finishes building + if (options.open) { + console.log("=> Opening your app in a browser..."); + if (process.env.ROOT_URL) { + open(process.env.ROOT_URL) + } else { + open(`http://localhost:${options.port}`) + } + } + } }); } @@ -590,16 +607,31 @@ export const AVAILABLE_SKELETONS = [ DEFAULT_SKELETON, "typescript", "vue", - 'vue-2', "svelte", "tailwind", "chakra-ui", "solid", ]; +const SKELETON_INFO = { + "apollo": "To create a basic Apollo + React app", + "bare": "To create an empty app", + "blaze": "To create an app using Blaze", + "full": "To create a more complete scaffolded app", + "minimal": "To create an app with as few Meteor packages as possible", + "react": "To create a basic React-based app", + "typescript": "To create an app using TypeScript and React", + "vue": "To create a basic Vue3-based app", + "svelte": "To create a basic Svelte app", + "tailwind": "To create an app using React and Tailwind", + "chakra-ui": "To create an app Chakra UI and React", + "solid": "To create a basic Solid app" +} + main.registerCommand({ name: 'create', maxArgs: 1, + minArgs: 0, options: { list: { type: Boolean }, example: { type: String }, @@ -610,7 +642,6 @@ main.registerCommand({ blaze: { type: Boolean }, react: { type: Boolean }, vue: { type: Boolean }, - 'vue-2': { type: Boolean }, typescript: { type: Boolean }, apollo: { type: Boolean }, svelte: { type: Boolean }, @@ -620,6 +651,7 @@ main.registerCommand({ prototype: { type: Boolean }, from: { type: String }, }, + pretty: false, catalogRefresh: new catalog.Refresh.Never() }, async function (options) { // Creating a package is much easier than creating an app, so if that's what @@ -785,12 +817,64 @@ main.registerCommand({ return 0; } - var appPathAsEntered; - if (options.args.length === 1) { - appPathAsEntered = options.args[0]; - } else { - throw new main.ShowUsage(); + /** + * + * @returns {{appPathAsEntered: string, skeleton: string }} + */ + const setup = async () => { + // meteor create app-name + if (options.args.length === 1) { + const appPathAsEntered = options.args[0]; + const skeletonExplicitOption = + AVAILABLE_SKELETONS.find(skeleton => !!options[skeleton]); + + const skeleton = skeletonExplicitOption || DEFAULT_SKELETON; + + console.log(`Using ${green`${skeleton}`} skeleton`); + return { + appPathAsEntered, + skeleton + } + } + function capitalizeFirstLetter(string) { + return string.charAt(0).toUpperCase() + string.slice(1); + } + const prompt = inquirer.createPromptModule(); + // meteor create + // need to ask app name and skeleton + const r = await prompt([ + { + type: 'input', + name: 'appPathAsEntered', + message: `What is the name/path of your ${yellow`app`}? `, + default(){ + return 'my-app'; + } + }, + { + type: 'list', + name: 'skeleton', + message: `Which ${yellow`skeleton`} do you want to use?`, + choices: AVAILABLE_SKELETONS.map(skeleton => {return `${capitalizeFirstLetter(skeleton)} # ${SKELETON_INFO[skeleton]}`}), + default(){ + return `${capitalizeFirstLetter(DEFAULT_SKELETON)} # ${SKELETON_INFO[DEFAULT_SKELETON]}`; + }, + filter(val) { + const skel = val.split(' ')[0]; + console.log(`Using ${green`${skel}`} skeleton`); + return skel.toLowerCase(); + } + } + ]) + return r; } + + var { + appPathAsEntered, + skeleton + } = await setup(); + Console.setPretty(true) // to not lose the console + var appPath = files.pathResolve(appPathAsEntered); if (files.findAppDir(appPath)) { @@ -860,9 +944,41 @@ main.registerCommand({ }) ); } + await files.cp_r(files.pathJoin(__dirnameConverted, '..', 'static-assets', + `skel-${skeleton}`), appPath, { + transformFilename: function (f) { + 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 { + return contents; + } + }, + ignore: toIgnore, + preserveSymlinks: true, + }); + // Setup fn, which is called after the app is created, to print a message // about how to run the app. - async function setup() { + async function setupMessages() { // We are actually working with a new meteor project at this point, so // set up its context. var projectContext = new projectContextModule.ProjectContext({ @@ -976,7 +1092,7 @@ main.registerCommand({ await bash`git clone --progress ${url} ${appPath} `; // remove .git folder from the example await files.rm_recursive_async(files.pathJoin(appPath, ".git")); - await setup(); + await setupMessages(); }; if (options.example) { @@ -1015,11 +1131,6 @@ main.registerCommand({ toIgnore.push(/(\.html|\.js|\.css)/); } - const skeletonExplicitOption = AVAILABLE_SKELETONS.find( - (skeleton) => !!options[skeleton] - ); - const skeleton = skeletonExplicitOption || DEFAULT_SKELETON; - try { // Prototype option should use local skeleton. // Maybe we should use a different skeleton for prototype @@ -1032,7 +1143,7 @@ main.registerCommand({ } catch (e) { if ( - e.message !== "Using prototype option" || + e.message !== "Using prototype option" && e.message !== "Using release option" ) { // something has happened while creating the app using git clone @@ -1083,39 +1194,7 @@ main.registerCommand({ preserveSymlinks: true, } ); - await setup(); - } - if (!!skeletonExplicitOption) { - // Notify people about the skeleton options - Console.info( - [ - "", - "To start with a different app template, try one of the following:", - "", - ].join("\n") - ); - - cmd("meteor create --bare # to create an empty app"); - 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 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" - ); - cmd("meteor create --blaze # to create an app using Blaze"); - cmd( - "meteor create --tailwind # to create an app using React and Tailwind" - ); - cmd("meteor create --chakra-ui # to create an app Chakra UI and React"); - cmd("meteor create --solid # to create a basic Solid app"); + await setupMessages(); } Console.info(""); @@ -1902,6 +1981,7 @@ testCommandOptions = { catalogRefresh: new catalog.Refresh.Never(), options: { port: { type: String, short: "p", default: DEFAULT_PORT }, + open: { type: Boolean, short: "o", default: false }, 'mobile-server': { type: String }, 'cordova-server-port': { type: String }, 'debug-port': { type: String }, @@ -1988,7 +2068,7 @@ main.registerCommand(Object.assign( async function doTestCommand(options) { // This "metadata" is accessed in a few places. Using a global // variable here was more expedient than navigating the many layers - // of abstraction across the the build process. + // of abstraction across the build process. // // As long as the Meteor CLI runs a single command as part of each // process, this should be safe. @@ -2360,7 +2440,18 @@ var runTestAppForPackages = async function (projectContext, options) { // On the first run, we shouldn't display the delta between "no packages // in the temp app" and "all the packages we're testing". If we make // changes and reload, though, it's fine to display them. - omitPackageMapDeltaDisplayOnFirstRun: true + omitPackageMapDeltaDisplayOnFirstRun: true, + onBuilt: function () { + // Opens a browser window when it finishes building + if (options.open) { + console.log("=> Opening your app in a browser..."); + if (process.env.ROOT_URL) { + open(process.env.ROOT_URL) + } else { + open(`http://localhost:${options.port}`) + } + } + } }); } }; diff --git a/tools/cli/example-repositories.js b/tools/cli/example-repositories.js index 7bf472ec0d9..f1d67151ef8 100644 --- a/tools/cli/example-repositories.js +++ b/tools/cli/example-repositories.js @@ -1,5 +1,4 @@ export const EXAMPLE_REPOSITORIES = { - "vue-2": { "repo": "https://github.com/meteor/skel-vue-2" }, "vue": { "repo": "https://github.com/meteor/skel-vue" }, "react": { "repo": "https://github.com/meteor/skel-react" }, "full": { "repo": "https://github.com/meteor/skel-full" }, diff --git a/tools/cli/help.txt b/tools/cli/help.txt index 920a2ce472c..1eff3661b6c 100644 --- a/tools/cli/help.txt +++ b/tools/cli/help.txt @@ -73,6 +73,7 @@ Options: uses port N+1 and a port specified by --app-port. Specify as --port=host:port to bind to a specific interface. + --open, -o Opens a browser window when the app starts. --inspect[-brk][=] Enable server-side debugging via debugging clients like the Node.js command-line debugger, Chrome DevTools, or @@ -106,6 +107,7 @@ Options: --exclude-archs Don't create bundles for certain web architectures (comma separated, for example: --exclude-archs "web.browser.legacy, web.cordova") + --open Opens a browser window when it finishes building >>> debug Run the project with server-side debugging enabled. @@ -150,7 +152,7 @@ Options: >>> create Create a new project. -Usage: meteor create [--release ] [--bare|--minimal|--full|--react|--vue|--vue-2|--apollo|--svelte|--blaze|--tailwind|--chakra-ui|--solid] +Usage: meteor create [--release ] [--bare|--minimal|--full|--react|--vue|--apollo|--svelte|--blaze|--tailwind|--chakra-ui|--solid] meteor create [--release ] --example [] meteor create [--release ] --from [] meteor create --list @@ -186,7 +188,6 @@ Options: --full Create a fully scaffolded app. --react Create a basic react-based app, same as default. --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. @@ -637,6 +638,7 @@ with --port. Options: --port, -p Port to listen on (instead of the default 3000). Also uses port N+1 and N+2. + --open, -o Opens a browser window when the app starts. --inspect[-brk][=] Enable server-side debugging via debugging clients like the Node.js command-line debugger, Chrome DevTools, or @@ -726,6 +728,7 @@ Meteor Guide - https://guide.meteor.com/testing.html Options: --port, -p Port to listen on (instead of the default 3000). Also uses port N+1 and N+2. + --open, -o Opens a browser window when the app starts. --inspect[-brk][=] Enable server-side debugging via debugging clients like the Node.js command-line debugger, Chrome DevTools, or @@ -762,6 +765,7 @@ Options: --exclude-archs Don't create test bundles for certain web architectures (comma separated, for example: --exclude-archs "web.browser.legacy, web.cordova") + --open Opens a browser window when it finishes building >>> self-test Run tests of the 'meteor' tool. diff --git a/tools/cli/main.js b/tools/cli/main.js index 14fccd81e71..250e2f376aa 100644 --- a/tools/cli/main.js +++ b/tools/cli/main.js @@ -552,7 +552,8 @@ var springboard = async function (rel, options) { var execPath = files.convertToOSPath(executable); var child = require("child_process").spawn(execPath, newArgv, { env: process.env, - stdio: 'inherit' + stdio: 'inherit', + shell: true, }).on('exit', resolve); })); } diff --git a/tools/console/console.js b/tools/console/console.js index f08530977d6..a897346483f 100644 --- a/tools/console/console.js +++ b/tools/console/console.js @@ -49,7 +49,7 @@ /// (They will change your output in ways that you probably do not want). These /// don't auto-linewrap, end in a newline, or take in Console.options. /// -/// Here is are some examples: +/// Here are some examples: /// Console.rawInfo(JSON.stringify(myData, null, 2)); /// Console.rawError(err.stack + "\n"); /// diff --git a/tools/cordova/assets/launchscreens/android_mdpi_portrait.png b/tools/cordova/assets/launchscreens/android_universal.png similarity index 100% rename from tools/cordova/assets/launchscreens/android_mdpi_portrait.png rename to tools/cordova/assets/launchscreens/android_universal.png diff --git a/tools/cordova/builder.js b/tools/cordova/builder.js index 7c6c9fb75e0..ab8e8a4b031 100644 --- a/tools/cordova/builder.js +++ b/tools/cordova/builder.js @@ -64,16 +64,7 @@ const splashIosKeys = { }; const splashAndroidKeys = { - 'android_mdpi_portrait': 'port-mdpi', - 'android_mdpi_landscape': 'land-mdpi', - 'android_hdpi_portrait': 'port-hdpi', - 'android_hdpi_landscape': 'land-hdpi', - 'android_xhdpi_portrait': 'port-xhdpi', - 'android_xhdpi_landscape': 'land-xhdpi', - 'android_xxhdpi_portrait': 'port-xxhdpi', - 'android_xxhdpi_landscape': 'land-xxhdpi', - 'android_xxxhdpi_portrait': 'port-xxxhdpi', - 'android_xxxhdpi_landscape': 'land-xxxhdpi' + 'android_universal': 'AndroidWindowSplashScreenAnimatedIcon', }; export class CordovaBuilder { @@ -150,14 +141,6 @@ export class CordovaBuilder { const packageMap = this.projectContext.packageMap; - if (packageMap && packageMap.getInfo('launch-screen')) { - this.additionalConfiguration.global.AutoHideSplashScreen = false; - this.additionalConfiguration.global.SplashScreen = 'screen'; - this.additionalConfiguration.global.SplashScreenDelay = 5000; - this.additionalConfiguration.global.FadeSplashScreenDuration = 250; - this.additionalConfiguration.global.ShowSplashScreenSpinner = false; - } - if (packageMap && packageMap.getInfo('mobile-status-bar')) { this.additionalConfiguration.global.StatusBarOverlaysWebView = false; this.additionalConfiguration.global.StatusBarStyle = 'default'; @@ -232,7 +215,7 @@ export class CordovaBuilder { _.each(iconsAndroidSizes, setDefaultIcon); setDefaultLaunchScreen('ios_universal'); - setDefaultLaunchScreen('android_mdpi_portrait'); + setDefaultLaunchScreen('android_universal'); this.pluginsConfiguration = {}; } @@ -373,7 +356,7 @@ export class CordovaBuilder { files.pathJoin(this.resourcesPath, newFilename)); // Set it to the xml tree - xmlElement.ele(tag, { src, ...attributes }); + xmlElement.ele(tag, { ...(tag === "preference" ? { value: src } : { src }), ...attributes }); } _resolveFilenameForImages = (suppliedPath, key, tag) => { @@ -426,8 +409,12 @@ export class CordovaBuilder { let suppliedPath = suppliedValue; let suppliedPathDarkMode = null; if (typeof suppliedValue === 'object') { - suppliedPath = suppliedValue.src; - suppliedPathDarkMode = suppliedValue.srcDarkMode; + if (isIos) { + suppliedPath = suppliedValue.src; + suppliedPathDarkMode = suppliedValue.srcDarkMode; + } else { + throw new Error("Dark mode through Meteor's launch screen helper is only allowed for iOS. For android, please follow the instructions: https://developer.android.com/develop/ui/views/theming/darktheme."); + } } if (isIos) { @@ -445,19 +432,12 @@ export class CordovaBuilder { } const filename = this._resolveFilenameForImages(suppliedPath, key, 'splash'); - if (suppliedPathDarkMode) { - this._copyImageToBuildFolderAndAppendToXmlNode(suppliedPathDarkMode, - appendDarkMode(filename, { withChar: '_' }), - xmlElement, 'splash', - { density: appendDarkMode(value, { separator: '-', withChar: '-' })} - ); - } this._copyImageToBuildFolderAndAppendToXmlNode(suppliedPath, filename, xmlElement, - 'splash', - { density: value }); - }) + 'preference', + { name: value }); + }); } configureAndCopyResourceFiles(resourceFiles, iosElement, androidElement) { @@ -754,11 +734,11 @@ configuration. The key may be deprecated.`); * @summary Set the launch screen images for your mobile app. * @param {Object} launchScreens A dictionary where keys are different * devices, screen sizes, and orientations, and the values are image paths - * relative to the project root directory or an object containing a dark mode image path too ({src, srcDarkMode}). + * relative to the project root directory or an object containing a dark mode image path too `{ src, srcDarkMode }` (iOS only). + * Note: If you want to have a dark theme splash screen on Android, please follow the instructions described [here](https://developer.android.com/develop/ui/views/theming/darktheme). * - * For Android, launch screen images should - * be special "Nine-patch" image files that specify how they should be - * stretched. See the [Android docs](https://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch). + * For Android specific information, check the [Cordova docs](https://cordova.apache.org/docs/en/latest/core/features/splashscreen/index.html#android-specific-information) and [Android docs](https://developer.android.com/develop/ui/views/launch/splash-screen#splash_screen_dimensions). + * Also note that for android the asset can either be an XML Vector Drawable or PNG. * * For best practices when developing a splash image, see the [Apple Guidelines](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/launch-screen/). * To learn more about size classes for iOS, check out the [documentation](https://cordova.apache.org/docs/en/10.x/reference/cordova-plugin-splashscreen/#size-classes) from Cordova. @@ -766,32 +746,23 @@ configuration. The key may be deprecated.`); * Valid key values: * * iOS: - * - `ios_universal` (Default@2xuniversalanyany.png - 2732x2732) - All @2x devices, if device/mode specific is not declared - * - `ios_universal_3x` (Default@3xuniversalanyany.png - 2208x2208) - All @3x devices, if device/mode specific is not declared - * - `Default@2x~universal~comany` (1278x2732) - All @2x devices in portrait mode - * - `Default@2x~universal~comcom` (1334x750) - All @2x devices in landscape (narrow) mode - * - `Default@3x~universal~anycom` (2208x1242) - All @3x devices in landscape (wide) mode - * - `Default@3x~universal~comany` (1242x2208) - All @3x devices in portrait mode - * - `Default@2x~iphone~anyany` (1334x1334) - iPhone SE/6s/7/8/XR - * - `Default@2x~iphone~comany` (750x1334) - iPhone SE/6s/7/8/XR - portrait mode - * - `Default@2x~iphone~comcom` (1334x750) - iPhone SE/6s/7/8/XR - landscape (narrow) mode - * - `Default@3x~iphone~anyany` (2208x2208) - iPhone 6s Plus/7 Plus/8 Plus/X/XS/XS Max - * - `Default@3x~iphone~anycom` (2208x1242) - iPhone 6s Plus/7 Plus/8 Plus/X/XS/XS Max - landscape (wide) mode - * - `Default@3x~iphone~comany` (1242x2208) - iPhone 6s Plus/7 Plus/8 Plus/X/XS/XS Max - portrait mode - * - `Default@2x~ipad~anyany` (2732x2732) - iPad Pro 12.9"/11"/10.5"/9.7"/7.9" - * - `Default@2x~ipad~comany` (1278x2732) - iPad Pro 12.9"/11"/10.5"/9.7"/7.9" - portrait mode + * - `ios_universal` (Default@2xuniversalanyany.png - 2732x2732 px) - All @2x devices, if device/mode specific is not declared + * - `ios_universal_3x` (Default@3xuniversalanyany.png - 2208x2208 px) - All @3x devices, if device/mode specific is not declared + * - `Default@2x~universal~comany` (1278x2732 px) - All @2x devices in portrait mode + * - `Default@2x~universal~comcom` (1334x750 px) - All @2x devices in landscape (narrow) mode + * - `Default@3x~universal~anycom` (2208x1242 px) - All @3x devices in landscape (wide) mode + * - `Default@3x~universal~comany` (1242x2208 px) - All @3x devices in portrait mode + * - `Default@2x~iphone~anyany` (1334x1334 px) - iPhone SE/6s/7/8/XR + * - `Default@2x~iphone~comany` (750x1334 px) - iPhone SE/6s/7/8/XR - portrait mode + * - `Default@2x~iphone~comcom` (1334x750 px) - iPhone SE/6s/7/8/XR - landscape (narrow) mode + * - `Default@3x~iphone~anyany` (2208x2208 px) - iPhone 6s Plus/7 Plus/8 Plus/X/XS/XS Max + * - `Default@3x~iphone~anycom` (2208x1242 px) - iPhone 6s Plus/7 Plus/8 Plus/X/XS/XS Max - landscape (wide) mode + * - `Default@3x~iphone~comany` (1242x2208 px) - iPhone 6s Plus/7 Plus/8 Plus/X/XS/XS Max - portrait mode + * - `Default@2x~ipad~anyany` (2732x2732 px) - iPad Pro 12.9"/11"/10.5"/9.7"/7.9" + * - `Default@2x~ipad~comany` (1278x2732 px) - iPad Pro 12.9"/11"/10.5"/9.7"/7.9" - portrait mode * * Android: - * - `android_mdpi_portrait` (320x480) - * - `android_mdpi_landscape` (480x320) - * - `android_hdpi_portrait` (480x800) - * - `android_hdpi_landscape` (800x480) - * - `android_xhdpi_portrait` (720x1280) - * - `android_xhdpi_landscape` (1280x720) - * - `android_xxhdpi_portrait` (960x1600) - * - `android_xxhdpi_landscape` (1600x960) - * - `android_xxxhdpi_portrait` (1280x1920) - * - `android_xxxhdpi_landscape` (1920x1280) + * - `android_universal` (288x288 dp) * * @memberOf App */ @@ -800,11 +771,16 @@ configuration. The key may be deprecated.`); Object.keys(splashIosKeys).concat(Object.keys(splashAndroidKeys)); Object.keys(launchScreens).forEach((key) => { - if (!key in validDevices) { + if (!validDevices.includes(key)) { Console.labelWarn(`${key}: unknown key in App.launchScreens \ configuration. The key may be deprecated.`); } - }) + + const value = launchScreens[key]; + if (typeof value !== "string" && key.includes("android")) { + throw new Error("Android splash screen path must be a string. To enable dark splash screens for your app, check out the android developer guide: https://developer.android.com/develop/ui/views/theming/darktheme."); + } + }); Object.assign(builder.imagePaths.splash, launchScreens); }, diff --git a/tools/cordova/index.js b/tools/cordova/index.js index f12c4812009..232a3308f72 100644 --- a/tools/cordova/index.js +++ b/tools/cordova/index.js @@ -13,7 +13,7 @@ export const CORDOVA_ARCH = "web.cordova"; export const CORDOVA_PLATFORMS = ['ios', 'android']; -const CORDOVA_ANDROID_VERSION = "10.1.2"; +const CORDOVA_ANDROID_VERSION = "12.0.1"; export const CORDOVA_DEV_BUNDLE_VERSIONS = { 'cordova-lib': '10.0.0', @@ -25,7 +25,7 @@ export const CORDOVA_DEV_BUNDLE_VERSIONS = { export const CORDOVA_PLATFORM_VERSIONS = { 'android': CORDOVA_ANDROID_VERSION, - 'ios': '6.2.0', + 'ios': '7.0.1', }; export const SWIFT_VERSION = 5; diff --git a/tools/cordova/project.js b/tools/cordova/project.js index b4ad0876c3c..001871cf709 100644 --- a/tools/cordova/project.js +++ b/tools/cordova/project.js @@ -67,7 +67,6 @@ const pinnedPluginVersions = { "cordova-plugin-media": "3.0.1", "cordova-plugin-media-capture": "1.4.3", "cordova-plugin-network-information": "1.3.3", - "cordova-plugin-splashscreen": "4.1.0", "cordova-plugin-statusbar": "2.3.0", "cordova-plugin-test-framework": "1.1.5", "cordova-plugin-vibration": "2.1.5", diff --git a/tools/cordova/run-targets.js b/tools/cordova/run-targets.js index 2541680280d..4860f6e59cf 100644 --- a/tools/cordova/run-targets.js +++ b/tools/cordova/run-targets.js @@ -138,7 +138,7 @@ export class AndroidRunTarget extends CordovaRunTarget { `CordovaLog:${logLevel}`, `chromium:${logLevel}`, `SystemWebViewClient:${logLevel}`, '*:F']; - const { Log } = loadIsopackage('logging'); + const { Log } = await loadIsopackage('logging'); const logStream = transform(line => { const logEntry = logFromAndroidLogcatLine(Log, line); diff --git a/tools/fs/files.ts b/tools/fs/files.ts index 80e17fe7747..57633fc6988 100644 --- a/tools/fs/files.ts +++ b/tools/fs/files.ts @@ -1611,7 +1611,7 @@ export const rename = isWindowsLikeFilesystem() ? function (from: string, to: st attempt(); }).catch(async (error: any) => { if (error.code === 'EPERM' || - error.code === 'EACCESS') { + error.code === 'EACCES') { await cp_r(from, to, { preserveSymlinks: true }); await rm_recursive(from); } else { diff --git a/tools/isobuild/bundler.js b/tools/isobuild/bundler.js index 7061f5576e6..ab19f9aa8ab 100644 --- a/tools/isobuild/bundler.js +++ b/tools/isobuild/bundler.js @@ -2242,19 +2242,6 @@ class JsImage { * @param {String} assetPath The path of the asset, relative to the application's `private` subdirectory. * @param {Function} [asyncCallback] Optional callback, which is called asynchronously with the error or result after the function is complete. If not provided, the function runs synchronously. */ - getText: function (assetPath, callback) { - const result = getAsset(item.assets, assetPath, "utf8", callback); - - if (!callback) { - if (!Fiber.current) { - throw new Error("The synchronous Assets API can " + - "only be called from within a Fiber."); - } - - return Promise.await(result); - } - }, - getTextAsync: function (assetPath) { return getAsset(item.assets, assetPath, "utf8"); }, @@ -2266,19 +2253,6 @@ class JsImage { * @param {String} assetPath The path of the asset, relative to the application's `private` subdirectory. * @param {Function} [asyncCallback] Optional callback, which is called asynchronously with the error or result after the function is complete. If not provided, the function runs synchronously. */ - getBinary: function (assetPath, callback) { - const result = getAsset(item.assets, assetPath, undefined, callback); - - if (!callback) { - if (!Fiber.current) { - throw new Error("The synchronous Assets API can " + - "only be called from within a Fiber."); - } - - return Promise.await(result); - } - }, - getBinaryAsync: function (assetPath) { return getAsset(item.assets, assetPath, undefined); } diff --git a/tools/isobuild/compiler-plugin.js b/tools/isobuild/compiler-plugin.js index 7d38c76c61d..cd51d01d7e7 100644 --- a/tools/isobuild/compiler-plugin.js +++ b/tools/isobuild/compiler-plugin.js @@ -61,7 +61,7 @@ const hasOwn = Object.prototype.hasOwnProperty; // Cache the (slightly post-processed) results of linker.fullLink. const CACHE_SIZE = process.env.METEOR_LINKER_CACHE_SIZE || 1024*1024*100; const CACHE_DEBUG = !! process.env.METEOR_TEST_PRINT_LINKER_CACHE_DEBUG; -const LINKER_CACHE_SALT = 25; // Increment this number to force relinking. +const LINKER_CACHE_SALT = 26; // Increment this number to force relinking. const LINKER_CACHE = new LRU({ max: CACHE_SIZE, // Cache is measured in bytes. We don't care about servePath. @@ -542,13 +542,13 @@ class InputFile extends buildPluginModule.InputFile { * @memberOf InputFile * @instance */ - addHtml(options, lazyFinalizer) { + async addHtml(options, lazyFinalizer) { if (typeof lazyFinalizer === "function") { // For now, just call the lazyFinalizer function immediately. Since // HTML is not compiled, this immediate invocation is probably // permanently appropriate for addHtml, whereas methods like // addJavaScript benefit from waiting to call lazyFinalizer. - Object.assign(options, Promise.await(lazyFinalizer())); + Object.assign(options, await lazyFinalizer()); } this._resourceSlot.addHtml(options); @@ -738,7 +738,7 @@ class ResourceSlot { if (! css && typeof css !== "string") { // The minifier didn't do anything, so we should use the // original contents of cssResource.data. - css = cssResource.data.toString("utf8"); + css = (await cssResource.data).toString("utf8"); if (cssResource.sourceMap) { // Add the source map as an asset, and append a diff --git a/tools/isobuild/compiler.js b/tools/isobuild/compiler.js index 97c899d795c..66cb49e2b00 100644 --- a/tools/isobuild/compiler.js +++ b/tools/isobuild/compiler.js @@ -25,7 +25,7 @@ var compiler = exports; // this version number. The idea is that the "format" field of the isopack // JSON file only changes when the actual specified structure of the // isopack/unibuild changes, but this version (which is build-tool-specific) -// can change when the the contents (not structure) of the built output +// can change when the contents (not structure) of the built output // changes. So eg, if we improve the linker's static analysis, this should be // bumped. // diff --git a/tools/isobuild/linker.js b/tools/isobuild/linker.js index eea250f20fb..6d8714035f5 100644 --- a/tools/isobuild/linker.js +++ b/tools/isobuild/linker.js @@ -139,6 +139,7 @@ Object.assign(Module.prototype, { if (APP_PRELINK_CACHE.has(cacheKey)) { ret.push(APP_PRELINK_CACHE.get(cacheKey)); + continue; } const node = await file.getPrelinkedOutput({ preserveLineNumbers: true }); @@ -167,14 +168,7 @@ Object.assign(Module.prototype, { ret.push(prelinked); } - // TODO[fibers]: This is a temporary hack to make sure that we don't return the same - // file twice. I'm not sure why, but self.files sometimes contains the same file twice. - // these tool tests fail without this hack: - // - assets - unicode asset names are allowed - // - javascript hot code push - // and probably others - const uniqueHashes = [...new Set(ret.map((f) => f.hash))]; - return uniqueHashes.map((h) => ret.find((f) => f.hash === h)); + return ret; } // Otherwise.. @@ -951,22 +945,9 @@ var getHeader = function (options) { return '(function() {\n\n'; } - var isApp = options.name === null; - var chunks = []; - let orderedDeps = []; - - options.deps.forEach(dep => { - if (!dep.unordered) { - orderedDeps.push(JSON.stringify(dep.package)) - } - }); - - chunks.push( - `Package["core-runtime"].queue("${options.name}", [`, - orderedDeps.join(', '), - '], function () {' - ); + var chunks = [`Package["core-runtime"].queue("${options.name}",function () {`]; + var isApp = options.name === null; if (isApp) { chunks.push( getImportCode(options.imports, "/* Imports for global scope */\n\n", true), @@ -984,8 +965,7 @@ var getHeader = function (options) { if (!_.isEmpty(packageVariables)) { chunks.push( - "/* Package-scope variables */\n", - "var ", + "/* Package-scope variables */\nvar ", packageVariables.join(', '), ";\n\n", ); diff --git a/tools/meteor-services/auth.js b/tools/meteor-services/auth.js index bb672528ff5..dd593583bad 100644 --- a/tools/meteor-services/auth.js +++ b/tools/meteor-services/auth.js @@ -501,7 +501,6 @@ var doInteractivePasswordLogin = async function (options) { try { var result = await conn.callAsync( "login", - { returnServerPromise: true }, { session: auth.getSessionId(config.getAccountsDomain()), meteorAccountsLoginInfo: loginData, diff --git a/tools/packaging/catalog/catalog-local.js b/tools/packaging/catalog/catalog-local.js index 273aa59d99c..d56335652a9 100644 --- a/tools/packaging/catalog/catalog-local.js +++ b/tools/packaging/catalog/catalog-local.js @@ -421,6 +421,12 @@ Object.assign(LocalCatalog.prototype, { if (_.has(self.packages, name)) return; + const dependencies = packageSource.getDependencyMetadata({ logError: true }); + + if (buildmessage.jobHasMessages()) { + return; // recover by ignoring + } + self.packages[name] = { packageSource: packageSource, packageRecord: { @@ -437,7 +443,7 @@ Object.assign(LocalCatalog.prototype, { publishedBy: null, description: packageSource.metadata.summary, git: packageSource.metadata.git, - dependencies: packageSource.getDependencyMetadata(), + dependencies, source: null, lastUpdated: null, published: null, diff --git a/tools/runners/run-all.js b/tools/runners/run-all.js index 4dfc6bfce25..f5549950cd3 100644 --- a/tools/runners/run-all.js +++ b/tools/runners/run-all.js @@ -179,7 +179,7 @@ class Runner { .catch(async (error) => { --tries; const left = tries + (tries === 1 ? " try" : " tries"); - Console.log(`Error starting Mongo (${left} left): ${error.message}`); + Console.error(`Error starting Mongo (${left} left): ${error.message}`); if (tries > 0) { self.mongoRunner.stop(); setTimeout(() => startMongo(tries), 1000); @@ -317,6 +317,7 @@ class Runner { // - buildOptions: 'buildOptions' argument to bundler.bundle() // - settingsFile: path to file containing deploy-time settings // - once: see above +// - onBuilt: callback to call when the app bundle is built // - banner: replace the application path that is normally printed on // startup with an arbitrary string (eg, 'Tests') // - rootUrl: tell the app that traffic at this URL will be routed to @@ -334,6 +335,8 @@ class Runner { exports.run = async function (options) { var runOptions = _.clone(options); var once = runOptions.once; + var onBuilt = runOptions.onBuilt; + var promise = new Promise(function (resolve) { runOptions.onFailure = async function () { // Ensure that runner stops now. You might think this is unnecessary @@ -397,6 +400,7 @@ exports.run = async function (options) { await runner.init(); // don't wait this on to finish setTimeout(() => runner.start(), 0); + onBuilt && onBuilt(); var result = await promise; await runner.stop(); diff --git a/tools/runners/run-hmr.js b/tools/runners/run-hmr.js index 567264493ac..15c78a2e83c 100644 --- a/tools/runners/run-hmr.js +++ b/tools/runners/run-hmr.js @@ -280,7 +280,7 @@ export class HMRServer { this.changeSetsByArch[arch].push(result); this._trimChangeSets(arch); - if (!arch in this.trimmedArchUntil) { + if (!(arch in this.trimmedArchUntil)) { this.trimmedArchUntil[arch] = this.firstBuild - 1; } diff --git a/tools/runners/run-mongo.js b/tools/runners/run-mongo.js index d284dfcd7aa..ea319eb0dea 100644 --- a/tools/runners/run-mongo.js +++ b/tools/runners/run-mongo.js @@ -49,14 +49,6 @@ function spawnMongod(mongodPath, port, dbPath, replSetName) { // Use mmapv1 on 32bit platforms, as our binary doesn't support WT if (process.arch === 'ia32') { args.push('--storageEngine', 'mmapv1', '--smallfiles'); - } else if (process.platform !== 'linux') { - // MongoDB 4, which we use on 64-bit systems, displays a banner in the - // Mongo shell about a free monitoring service, which can be disabled - // with this flag. However, the custom Linux build (see MONGO_BASE_URL - // in scripts/generate-dev-bundle.sh) neither displays the banner nor - // supports the flag, so it's safe/important to avoid passing the flag - // to mongod on 64-bit linux. - args.push('--enableFreeMonitoring', 'off'); } // run with rosetta on mac m1 @@ -78,6 +70,7 @@ function spawnMongod(mongodPath, port, dbPath, replSetName) { }, process.env ), + ...process.platform === 'win32' && { shell: true }, }); } diff --git a/tools/static-assets/README.md b/tools/static-assets/README.md index 1884abb1d61..6cef051b69c 100644 --- a/tools/static-assets/README.md +++ b/tools/static-assets/README.md @@ -44,10 +44,6 @@ Similar to `skel`, `skel-solid` is copied on `meteor create --solid` command. 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/server/boot.js b/tools/static-assets/server/boot.js index 90088df00d8..0c305c80c19 100644 --- a/tools/static-assets/server/boot.js +++ b/tools/static-assets/server/boot.js @@ -354,10 +354,10 @@ const loadServerBundles = Profile("Load server bundles", async function () { }; const Assets = { - getText: function (assetPath, callback) { + getTextAsync: function (assetPath, callback) { return getAsset(assetPath, "utf8", callback); }, - getBinary: function (assetPath, callback) { + getBinaryAsync: function (assetPath, callback) { return getAsset(assetPath, undefined, callback); }, /** diff --git a/tools/static-assets/skel-apollo/.meteor/packages b/tools/static-assets/skel-apollo/.meteor/packages index 0addfea1924..718d356e3d1 100644 --- a/tools/static-assets/skel-apollo/.meteor/packages +++ b/tools/static-assets/skel-apollo/.meteor/packages @@ -19,4 +19,4 @@ hot-module-replacement # Update client in development without reloading the pag ~prototype~ static-html # Define static page content in .html files apollo # Basic Apollo integration for Meteor apps -swydo:graphql # Import .graphql files +compat:graphql # Import .graphql files diff --git a/tools/static-assets/skel-apollo/package.json b/tools/static-assets/skel-apollo/package.json index 6295d82ae4a..347670d4510 100644 --- a/tools/static-assets/skel-apollo/package.json +++ b/tools/static-assets/skel-apollo/package.json @@ -2,19 +2,17 @@ "name": "~name~", "private": true, "scripts": { - "start": "meteor run", + "start": "meteor run --open", "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": { - "@apollo/client": "^3.7.14", - "@apollo/server": "^4.7.1", - "@babel/runtime": "^7.21.5", - "body-parser": "^1.20.2", - "express": "^4.18.2", - "graphql": "^16.6.0", - "meteor-node-stubs": "^1.2.5", + "@apollo/client": "^3.9.2", + "@apollo/server": "^4.10.0", + "@babel/runtime": "^7.23.9", + "graphql": "^16.8.1", + "meteor-node-stubs": "^1.2.7", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/tools/static-assets/skel-apollo/server/apollo.js b/tools/static-assets/skel-apollo/server/apollo.js index b8dab6f1565..eeee0be6bfa 100644 --- a/tools/static-assets/skel-apollo/server/apollo.js +++ b/tools/static-assets/skel-apollo/server/apollo.js @@ -1,22 +1,22 @@ import { ApolloServer } from '@apollo/server'; -import { WebApp } from 'meteor/webapp'; +import { WebApp, WebAppInternals } from 'meteor/webapp'; import { getUser } from 'meteor/apollo'; import { LinksCollection } from '/imports/api/links'; import typeDefs from '/imports/apollo/schema.graphql'; -import express from 'express'; import { expressMiddleware } from '@apollo/server/express4'; -import { json } from 'body-parser'; + +const express = WebAppInternals.NpmModules.express.module; const resolvers = { Query: { - getLink: async (obj, { id }) => LinksCollection.findOne(id), - getLinks: async () => LinksCollection.find().fetch() + getLink: async (obj, { id }) => LinksCollection.findOneAsync(id), + getLinks: async () => LinksCollection.find().fetchAsync() } }; const context = async ({ req }) => ({ user: await getUser(req.headers.authorization) -}) +}); const server = new ApolloServer({ cache: 'bounded', @@ -29,10 +29,7 @@ export async function startApolloServer() { WebApp.handlers.use( '/graphql', // Configure the path as you want. - express() // Create new Express router. - .disable('etag') // We don't server GET requests, so there's no need for that. - .disable('x-powered-by') // A small safety measure. - .use(json()) // From `body-parser`. - .use(expressMiddleware(server, { context })) // From `@apollo/server/express4`. + express.json(), + expressMiddleware(server, { context }) // From `@apollo/server/express4` ); } diff --git a/tools/static-assets/skel-apollo/server/main.js b/tools/static-assets/skel-apollo/server/main.js index 9f9a9b4b7a0..1e5812aa4c6 100644 --- a/tools/static-assets/skel-apollo/server/main.js +++ b/tools/static-assets/skel-apollo/server/main.js @@ -17,7 +17,7 @@ Meteor.startup(async () => { if (await LinksCollection.find().countAsync() === 0) { await insertLink({ title: 'Do the Tutorial', - url: 'https://www.meteor.com/tutorials/react/creating-an-app', + url: 'https://react-tutorial.meteor.com/simple-todos/01-creating-app.html', }); await insertLink({ diff --git a/tools/static-assets/skel-bare/package.json b/tools/static-assets/skel-bare/package.json index ba420dae931..a8e0c020acb 100644 --- a/tools/static-assets/skel-bare/package.json +++ b/tools/static-assets/skel-bare/package.json @@ -5,7 +5,7 @@ "start": "meteor run" }, "dependencies": { - "@babel/runtime": "^7.17.9", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7" } } diff --git a/tools/static-assets/skel-blaze/package.json b/tools/static-assets/skel-blaze/package.json index e5206638802..b2beebf6027 100644 --- a/tools/static-assets/skel-blaze/package.json +++ b/tools/static-assets/skel-blaze/package.json @@ -8,9 +8,9 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.17.9", - "jquery": "^3.6.0", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "jquery": "^3.7.1", + "meteor-node-stubs": "^1.2.7" }, "meteor": { "mainModule": { diff --git a/tools/static-assets/skel-chakra-ui/.meteor/packages b/tools/static-assets/skel-chakra-ui/.meteor/packages index 90ce4b06dd5..37f116fa2a4 100644 --- a/tools/static-assets/skel-chakra-ui/.meteor/packages +++ b/tools/static-assets/skel-chakra-ui/.meteor/packages @@ -19,4 +19,4 @@ hot-module-replacement # Update client in development without reloading the pag ~prototype~ static-html # Define static page content in .html files -react-meteor-data # React higher-order component for reactively tracking Meteor data +react-meteor-data@3.0.0-beta300.1 # React higher-order component for reactively tracking Meteor data diff --git a/tools/static-assets/skel-chakra-ui/package.json b/tools/static-assets/skel-chakra-ui/package.json index e7ec1856915..28b03b9050a 100644 --- a/tools/static-assets/skel-chakra-ui/package.json +++ b/tools/static-assets/skel-chakra-ui/package.json @@ -8,14 +8,14 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.18.6", + "@babel/runtime": "^7.23.5", "@chakra-ui/icons": "^1.1.7", "@chakra-ui/react": "^1.8.8", "@emotion/react": "^11.9.3", "@emotion/styled": "^11.9.3", "@react-icons/all-files": "^4.1.0", "framer-motion": "^6.4.2", - "meteor-node-stubs": "^1.2.3", + "meteor-node-stubs": "^1.2.7", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/tools/static-assets/skel-chakra-ui/server/main.js b/tools/static-assets/skel-chakra-ui/server/main.js index 0198535e0a7..49452ad3525 100644 --- a/tools/static-assets/skel-chakra-ui/server/main.js +++ b/tools/static-assets/skel-chakra-ui/server/main.js @@ -10,7 +10,7 @@ Meteor.startup(async () => { if (await LinksCollection.find().countAsync() === 0) { await insertLink({ title: 'Do the Tutorial', - url: 'https://www.meteor.com/tutorials/react/creating-an-app', + url: 'https://react-tutorial.meteor.com/simple-todos/01-creating-app.html', }); await insertLink({ diff --git a/tools/static-assets/skel-full/imports/startup/server/fixtures.js b/tools/static-assets/skel-full/imports/startup/server/fixtures.js index f3473aa4f85..ce32eeac56c 100644 --- a/tools/static-assets/skel-full/imports/startup/server/fixtures.js +++ b/tools/static-assets/skel-full/imports/startup/server/fixtures.js @@ -12,7 +12,7 @@ Meteor.startup(async () => { if (await Links.find().countAsync() === 0) { await insertLink({ title: 'Do the Tutorial', - url: 'https://www.meteor.com/tutorials/react/creating-an-app', + url: 'https://react-tutorial.meteor.com/simple-todos/01-creating-app.html', }); await insertLink({ diff --git a/tools/static-assets/skel-full/package.json b/tools/static-assets/skel-full/package.json index 66e7523a35d..cda4f5918a0 100644 --- a/tools/static-assets/skel-full/package.json +++ b/tools/static-assets/skel-full/package.json @@ -6,9 +6,9 @@ "test": "meteor test --once --driver-package meteortesting:mocha" }, "dependencies": { - "@babel/runtime": "^7.17.9", - "jquery": "^3.6.0", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "jquery": "^3.7.1", + "meteor-node-stubs": "^1.2.7" }, "devDependencies": { "chai": "^4.2.0" diff --git a/tools/static-assets/skel-minimal/package.json b/tools/static-assets/skel-minimal/package.json index 246b296d482..3b5926b7752 100644 --- a/tools/static-assets/skel-minimal/package.json +++ b/tools/static-assets/skel-minimal/package.json @@ -8,8 +8,8 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.17.9", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7" }, "meteor": { "mainModule": { diff --git a/tools/static-assets/skel-react/.meteor/packages b/tools/static-assets/skel-react/.meteor/packages index 90ce4b06dd5..37f116fa2a4 100644 --- a/tools/static-assets/skel-react/.meteor/packages +++ b/tools/static-assets/skel-react/.meteor/packages @@ -19,4 +19,4 @@ hot-module-replacement # Update client in development without reloading the pag ~prototype~ static-html # Define static page content in .html files -react-meteor-data # React higher-order component for reactively tracking Meteor data +react-meteor-data@3.0.0-beta300.1 # React higher-order component for reactively tracking Meteor data diff --git a/tools/static-assets/skel-react/package.json b/tools/static-assets/skel-react/package.json index 1b0c4457f42..2b6c1cf8bad 100644 --- a/tools/static-assets/skel-react/package.json +++ b/tools/static-assets/skel-react/package.json @@ -8,8 +8,8 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.20.7", - "meteor-node-stubs": "^1.2.5", + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/tools/static-assets/skel-react/server/main.js b/tools/static-assets/skel-react/server/main.js index 0198535e0a7..49452ad3525 100644 --- a/tools/static-assets/skel-react/server/main.js +++ b/tools/static-assets/skel-react/server/main.js @@ -10,7 +10,7 @@ Meteor.startup(async () => { if (await LinksCollection.find().countAsync() === 0) { await insertLink({ title: 'Do the Tutorial', - url: 'https://www.meteor.com/tutorials/react/creating-an-app', + url: 'https://react-tutorial.meteor.com/simple-todos/01-creating-app.html', }); await insertLink({ diff --git a/tools/static-assets/skel-solid/.meteor/packages b/tools/static-assets/skel-solid/.meteor/packages index 492b563f761..8d50345989b 100644 --- a/tools/static-assets/skel-solid/.meteor/packages +++ b/tools/static-assets/skel-solid/.meteor/packages @@ -19,4 +19,4 @@ hot-module-replacement # Update client in development without reloading the pag ~prototype~ static-html # Define static page content in .html files -vite:bundler +jorgenvatle:vite-bundler@2.0.0-beta.12 diff --git a/tools/static-assets/skel-solid/package.json b/tools/static-assets/skel-solid/package.json index e3cbb0efb58..582540ec895 100644 --- a/tools/static-assets/skel-solid/package.json +++ b/tools/static-assets/skel-solid/package.json @@ -8,9 +8,9 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.17.9", - "meteor-node-stubs": "^1.2.1", - "solid-js": "^1.5.4" + "@babel/runtime": "^7.23.9", + "meteor-node-stubs": "^1.2.7", + "solid-js": "^1.8.15" }, "meteor": { "mainModule": { @@ -20,9 +20,10 @@ "testModule": "tests/main.js" }, "devDependencies": { - "babel-preset-solid": "^1.5.4", - "vite": "^3.0.9", - "vite-plugin-solid": "^2.3.0", - "vite-plugin-solid-svg": "^0.4.1" + "babel-preset-solid": "^1.8.15", + "meteor-vite": "^1.10.2", + "vite": "^4.5.2", + "vite-plugin-solid": "^2.10.1", + "vite-plugin-solid-svg": "^0.8.0" } } diff --git a/tools/static-assets/skel-svelte/imports/ui/App.svelte b/tools/static-assets/skel-svelte/imports/ui/App.svelte index d64c1297eec..9f18322c0b5 100644 --- a/tools/static-assets/skel-svelte/imports/ui/App.svelte +++ b/tools/static-assets/skel-svelte/imports/ui/App.svelte @@ -6,15 +6,11 @@ const addToCounter = () => { counter += 1; } - - let subIsReady = false; - $m: { - const handle = Meteor.subscribe("links.all"); - subIsReady = handle.ready(); - } // more information about $m at https://atmospherejs.com/zodern/melte#tracker-statements - let links; + $m: handle = Meteor.subscribe("links.all"); + $m: subIsReady = handle.ready(); + $m: links = LinksCollection.find().fetch(); diff --git a/tools/static-assets/skel-svelte/package.json b/tools/static-assets/skel-svelte/package.json index 0ae79b3327d..9c9a9aca231 100644 --- a/tools/static-assets/skel-svelte/package.json +++ b/tools/static-assets/skel-svelte/package.json @@ -8,9 +8,9 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.20.6", - "meteor-node-stubs": "^1.2.5", - "svelte": "^3.54.0" + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7", + "svelte": "^3.59.2" }, "devDependencies": { "svelte-preprocess": "^5.0.0" diff --git a/tools/static-assets/skel-svelte/tsconfig.json b/tools/static-assets/skel-svelte/tsconfig.json index 11f2c45698d..7f0c17ad000 100644 --- a/tools/static-assets/skel-svelte/tsconfig.json +++ b/tools/static-assets/skel-svelte/tsconfig.json @@ -16,5 +16,5 @@ "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 + "exclude": ["./.meteor/**", "!./.meteor/local/types", "./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 90ce4b06dd5..37f116fa2a4 100644 --- a/tools/static-assets/skel-tailwind/.meteor/packages +++ b/tools/static-assets/skel-tailwind/.meteor/packages @@ -19,4 +19,4 @@ hot-module-replacement # Update client in development without reloading the pag ~prototype~ static-html # Define static page content in .html files -react-meteor-data # React higher-order component for reactively tracking Meteor data +react-meteor-data@3.0.0-beta300.1 # React higher-order component for reactively tracking Meteor data diff --git a/tools/static-assets/skel-tailwind/package.json b/tools/static-assets/skel-tailwind/package.json index 122c7e4cf8f..33eb88c1b19 100644 --- a/tools/static-assets/skel-tailwind/package.json +++ b/tools/static-assets/skel-tailwind/package.json @@ -8,9 +8,9 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.15.4", + "@babel/runtime": "^7.23.5", "autoprefixer": "^10.4.4", - "meteor-node-stubs": "^1.2.1", + "meteor-node-stubs": "^1.2.7", "postcss": "^8.4.12", "postcss-load-config": "^3.1.4", "react": "^17.0.2", diff --git a/tools/static-assets/skel-tailwind/server/main.js b/tools/static-assets/skel-tailwind/server/main.js index 6d8dd672ad7..6edde231437 100644 --- a/tools/static-assets/skel-tailwind/server/main.js +++ b/tools/static-assets/skel-tailwind/server/main.js @@ -10,7 +10,7 @@ Meteor.startup(async () => { if (await LinksCollection.find().countAsync() === 0) { await insertLink({ title: 'Do the Tutorial', - url: 'https://www.meteor.com/tutorials/react/creating-an-app', + url: 'https://react-tutorial.meteor.com/simple-todos/01-creating-app.html', }); await insertLink({ diff --git a/tools/static-assets/skel-typescript/.meteor/packages b/tools/static-assets/skel-typescript/.meteor/packages index 033932891ef..91e12d8bfe1 100644 --- a/tools/static-assets/skel-typescript/.meteor/packages +++ b/tools/static-assets/skel-typescript/.meteor/packages @@ -19,5 +19,5 @@ hot-module-replacement # Update client in development without reloading the pag ~prototype~ static-html # Define static page content in .html files -react-meteor-data # React higher-order component for reactively tracking Meteor data +react-meteor-data@3.0.0-beta300.1 # React higher-order component for reactively tracking Meteor data zodern:types # Pull in type declarations from other Meteor packages diff --git a/tools/static-assets/skel-typescript/package.json b/tools/static-assets/skel-typescript/package.json index 5689e482f65..385b3520c1c 100644 --- a/tools/static-assets/skel-typescript/package.json +++ b/tools/static-assets/skel-typescript/package.json @@ -8,17 +8,17 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.20.7", - "meteor-node-stubs": "^1.2.5", + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { "@types/mocha": "^8.2.3", - "@types/node": "^18.13.0", - "@types/react": "^18.0.26", - "@types/react-dom": "^18.0.10", - "typescript": "^4.9.4" + "@types/node": "^18.16.5", + "@types/react": "^18.2.5", + "@types/react-dom": "^18.2.4", + "typescript": "^5.4.5" }, "meteor": { "mainModule": { diff --git a/tools/static-assets/skel-typescript/server/main.ts b/tools/static-assets/skel-typescript/server/main.ts index 861a50c0446..5a7ca3abb00 100644 --- a/tools/static-assets/skel-typescript/server/main.ts +++ b/tools/static-assets/skel-typescript/server/main.ts @@ -10,7 +10,7 @@ Meteor.startup(async () => { if (await LinksCollection.find().countAsync() === 0) { await insertLink({ title: 'Do the Tutorial', - url: 'https://www.meteor.com/tutorials/react/creating-an-app', + url: 'https://react-tutorial.meteor.com/simple-todos/01-creating-app.html', }); await insertLink({ diff --git a/tools/static-assets/skel-vue-2/.gitignore b/tools/static-assets/skel-vue-2/.gitignore deleted file mode 100644 index c2658d7d1b3..00000000000 --- a/tools/static-assets/skel-vue-2/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/tools/static-assets/skel-vue-2/.meteor/.gitignore b/tools/static-assets/skel-vue-2/.meteor/.gitignore deleted file mode 100644 index 40830374235..00000000000 --- a/tools/static-assets/skel-vue-2/.meteor/.gitignore +++ /dev/null @@ -1 +0,0 @@ -local diff --git a/tools/static-assets/skel-vue-2/.meteor/packages b/tools/static-assets/skel-vue-2/.meteor/packages deleted file mode 100644 index 83be6b3a626..00000000000 --- a/tools/static-assets/skel-vue-2/.meteor/packages +++ /dev/null @@ -1,24 +0,0 @@ -# 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 deleted file mode 100644 index efeba1b50c7..00000000000 --- a/tools/static-assets/skel-vue-2/.meteor/platforms +++ /dev/null @@ -1,2 +0,0 @@ -server -browser diff --git a/tools/static-assets/skel-vue-2/client/main.html b/tools/static-assets/skel-vue-2/client/main.html deleted file mode 100644 index 7a78efb67d8..00000000000 --- a/tools/static-assets/skel-vue-2/client/main.html +++ /dev/null @@ -1,8 +0,0 @@ - - ~name~ - - - - -
- diff --git a/tools/static-assets/skel-vue-2/client/main.js b/tools/static-assets/skel-vue-2/client/main.js deleted file mode 100644 index 665c6aa1b16..00000000000 --- a/tools/static-assets/skel-vue-2/client/main.js +++ /dev/null @@ -1,12 +0,0 @@ -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-2/imports/api/collections/Links.js b/tools/static-assets/skel-vue-2/imports/api/collections/Links.js deleted file mode 100644 index de6a43c4a49..00000000000 --- a/tools/static-assets/skel-vue-2/imports/api/collections/Links.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export default new Mongo.Collection('links'); diff --git a/tools/static-assets/skel-vue-2/imports/api/collections/Links.tests.js b/tools/static-assets/skel-vue-2/imports/api/collections/Links.tests.js deleted file mode 100644 index ce178512d09..00000000000 --- a/tools/static-assets/skel-vue-2/imports/api/collections/Links.tests.js +++ /dev/null @@ -1,24 +0,0 @@ -// Tests for the behavior of the links collection -// -// https://guide.meteor.com/testing.html - -import { Meteor } from 'meteor/meteor'; -import { assert } from 'chai'; -import Links from './Links.js'; - -if (Meteor.isServer) { - describe('links collection', function () { - it('insert correctly', function () { - const linkId = Links.insert({ - title: 'meteor homepage', - url: 'https://www.meteor.com', - }); - const added = Links.find({ _id: linkId }); - const collectionName = added._getCollectionName(); - const count = added.count(); - - assert.equal(collectionName, 'links'); - assert.equal(count, 1); - }); - }); -} diff --git a/tools/static-assets/skel-vue-2/imports/api/fixtures.js b/tools/static-assets/skel-vue-2/imports/api/fixtures.js deleted file mode 100644 index daa11f32f17..00000000000 --- a/tools/static-assets/skel-vue-2/imports/api/fixtures.js +++ /dev/null @@ -1,31 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import Links from './collections/Links.js'; - -async function insertLink({ title, url }) { - await Links.insertAsync({ title, url, createdAt: new Date() }); -} - -Meteor.startup(async () => { - // If the Links collection is empty, add some data. - if (await Links.find().countAsync() === 0) { - await insertLink({ - title: 'Do the Tutorial', - url: 'https://vue-tutorial.meteor.com/', - }); - - 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-2/imports/api/methods/createLink.js b/tools/static-assets/skel-vue-2/imports/api/methods/createLink.js deleted file mode 100644 index 876f7109785..00000000000 --- a/tools/static-assets/skel-vue-2/imports/api/methods/createLink.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { check } from 'meteor/check'; -import Links from '../collections/Links.js'; - -Meteor.methods({ - 'createLink'(title, url) { - check(url, String); - check(title, String); - - return Links.insert({ - url, - title, - createdAt: new Date(), - }); - }, -}); diff --git a/tools/static-assets/skel-vue-2/imports/api/methods/createLink.tests.js b/tools/static-assets/skel-vue-2/imports/api/methods/createLink.tests.js deleted file mode 100644 index d899a7338f6..00000000000 --- a/tools/static-assets/skel-vue-2/imports/api/methods/createLink.tests.js +++ /dev/null @@ -1,20 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { assert } from 'chai'; -import Links from '../collections/Links.js'; -import './methods.js'; - -if (Meteor.isServer) { - describe('method: createLink', function () { - beforeEach(function () { - Links.remove({}); - }); - - it('can add a new link', function () { - const addLink = Meteor.server.method_handlers['createLink']; - - addLink.apply({}, ['meteor.com', 'https://www.meteor.com']); - - assert.equal(Links.find().count(), 1); - }); - }); -} diff --git a/tools/static-assets/skel-vue-2/imports/api/methods/index.js b/tools/static-assets/skel-vue-2/imports/api/methods/index.js deleted file mode 100644 index c52403a2e83..00000000000 --- a/tools/static-assets/skel-vue-2/imports/api/methods/index.js +++ /dev/null @@ -1 +0,0 @@ -import './createLink' diff --git a/tools/static-assets/skel-vue-2/imports/api/publications/index.js b/tools/static-assets/skel-vue-2/imports/api/publications/index.js deleted file mode 100644 index d161b580e79..00000000000 --- a/tools/static-assets/skel-vue-2/imports/api/publications/index.js +++ /dev/null @@ -1 +0,0 @@ -import './links' diff --git a/tools/static-assets/skel-vue-2/imports/api/publications/links.js b/tools/static-assets/skel-vue-2/imports/api/publications/links.js deleted file mode 100644 index f085d75045b..00000000000 --- a/tools/static-assets/skel-vue-2/imports/api/publications/links.js +++ /dev/null @@ -1,6 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import Links from '../collections/Links.js'; - -Meteor.publish('links', function () { - return Links.find(); -}); diff --git a/tools/static-assets/skel-vue-2/imports/api/publications/links.tests.js b/tools/static-assets/skel-vue-2/imports/api/publications/links.tests.js deleted file mode 100644 index 37f337c8691..00000000000 --- a/tools/static-assets/skel-vue-2/imports/api/publications/links.tests.js +++ /dev/null @@ -1,22 +0,0 @@ -import { assert } from 'chai' -import { PublicationCollector } from 'meteor/johanbrook:publication-collector' -import Links from '../collections/Links.js' -import './publications.js' - -describe('Publish links', function () { - beforeEach(function () { - Links.remove({}) - Links.insert({ - title: 'meteor homepage', - url: 'https://www.meteor.com' - }) - }) - - it('sends all links', function (done) { - const collector = new PublicationCollector() - collector.collect('links', (collections) => { - assert.equal(collections.links.length, 1) - done() - }) - }) -}) diff --git a/tools/static-assets/skel-vue-2/imports/ui/App.vue b/tools/static-assets/skel-vue-2/imports/ui/App.vue deleted file mode 100644 index e126098ccb8..00000000000 --- a/tools/static-assets/skel-vue-2/imports/ui/App.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/tools/static-assets/skel-vue-2/imports/ui/components/Hello.vue b/tools/static-assets/skel-vue-2/imports/ui/components/Hello.vue deleted file mode 100644 index 64947eb06a4..00000000000 --- a/tools/static-assets/skel-vue-2/imports/ui/components/Hello.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/tools/static-assets/skel-vue-2/imports/ui/components/Info.vue b/tools/static-assets/skel-vue-2/imports/ui/components/Info.vue deleted file mode 100644 index b52b2be838b..00000000000 --- a/tools/static-assets/skel-vue-2/imports/ui/components/Info.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - - - diff --git a/tools/static-assets/skel-vue-2/imports/ui/plugins.js b/tools/static-assets/skel-vue-2/imports/ui/plugins.js deleted file mode 100644 index eb976c92e59..00000000000 --- a/tools/static-assets/skel-vue-2/imports/ui/plugins.js +++ /dev/null @@ -1,4 +0,0 @@ -import Vue from 'vue' -import VueMeteorTracker from 'vue-meteor-tracker' - -Vue.use(VueMeteorTracker) diff --git a/tools/static-assets/skel-vue-2/package.json b/tools/static-assets/skel-vue-2/package.json deleted file mode 100644 index 0012ccbef03..00000000000 --- a/tools/static-assets/skel-vue-2/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "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": "^3.0.0-beta.7" - }, - "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 deleted file mode 100644 index 42950618b60..00000000000 --- a/tools/static-assets/skel-vue-2/server/main.js +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index 6d2a32e09d4..00000000000 --- a/tools/static-assets/skel-vue-2/tests/main.js +++ /dev/null @@ -1,20 +0,0 @@ -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 deleted file mode 100644 index c07b6ff75a6..00000000000 --- a/tools/static-assets/skel-vue/.meteor/.finished-upgraders +++ /dev/null @@ -1,19 +0,0 @@ -# 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 deleted file mode 100644 index dd363b25136..00000000000 --- a/tools/static-assets/skel-vue/.meteor/.id +++ /dev/null @@ -1,7 +0,0 @@ -# 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 2565a5fe328..c6c928e0d10 100644 --- a/tools/static-assets/skel-vue/.meteor/packages +++ b/tools/static-assets/skel-vue/.meteor/packages @@ -4,18 +4,20 @@ # 'meteor add' and 'meteor remove' will edit this file for you, # but you can also edit it by hand. -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 +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@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 +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 +hot-module-replacement # Update client in development without reloading the page + +static-html # Define static page content in .html files +jorgenvatle:vite-bundler@2.0.0-beta.12 +~prototype~ -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 deleted file mode 100644 index 1d2a6d0f799..00000000000 --- a/tools/static-assets/skel-vue/.meteor/release +++ /dev/null @@ -1 +0,0 @@ -METEOR@2.8.0 diff --git a/tools/static-assets/skel-vue/.meteor/versions b/tools/static-assets/skel-vue/.meteor/versions deleted file mode 100644 index 3b89f7359bc..00000000000 --- a/tools/static-assets/skel-vue/.meteor/versions +++ /dev/null @@ -1,71 +0,0 @@ -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/imports/ui/router.js b/tools/static-assets/skel-vue/imports/ui/router.js index 7768ef48947..b271e02d29f 100644 --- a/tools/static-assets/skel-vue/imports/ui/router.js +++ b/tools/static-assets/skel-vue/imports/ui/router.js @@ -1,5 +1,6 @@ import { createRouter, createWebHistory } from 'vue-router' import Home from './Home.vue' +import About from './About.vue' export const router = createRouter({ history: createWebHistory(), @@ -12,7 +13,7 @@ export const router = createRouter({ { path: '/about', name: 'about', - component: () => import('./About.vue'), + component: About, }, ], }) diff --git a/tools/static-assets/skel-vue/package.json b/tools/static-assets/skel-vue/package.json index f8dc1cace8d..4df6bd6053d 100644 --- a/tools/static-assets/skel-vue/package.json +++ b/tools/static-assets/skel-vue/package.json @@ -9,11 +9,11 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.17.9", - "meteor-node-stubs": "^1.2.1", - "vue": "^3.2.45", + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7", + "vue": "^3.3.9", "vue-meteor-tracker": "^3.0.0-beta.7", - "vue-router": "^4.1.6" + "vue-router": "^4.2.5" }, "meteor": { "mainModule": { @@ -23,11 +23,12 @@ "testModule": "tests/main.js" }, "devDependencies": { - "@types/meteor": "^2.8.1", + "@types/meteor": "^2.9.7", "@vitejs/plugin-vue": "^3.2.0", - "autoprefixer": "^10.4.13", - "postcss": "^8.4.19", - "tailwindcss": "^3.2.4", - "vite": "^3.2.3" + "autoprefixer": "^10.4.16", + "meteor-vite": "^1.7.1", + "postcss": "^8.4.31", + "tailwindcss": "^3.3.5", + "vite": "^3.2.7" } } diff --git a/tools/tests/apps/app-config/package-lock.json b/tools/tests/apps/app-config/package-lock.json index 19d94e6583c..8ca9b57a84c 100644 --- a/tools/tests/apps/app-config/package-lock.json +++ b/tools/tests/apps/app-config/package-lock.json @@ -4,11 +4,11 @@ "lockfileVersion": 1, "dependencies": { "@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" } }, "@types/mime-types": { @@ -160,44 +160,71 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "meteor-node-stubs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.0.3.tgz", - "integrity": "sha512-JQwIWPfM/Oa2x1Ycwn1Q0wVVQ8b0bOLv+qs4RR/D12b5dPktLlPCRhMzWzRPncZVJtfsnKKBgPLdFmJYUqAwHg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.9.tgz", + "integrity": "sha512-EKRezc1/PblYtYiK4BOT3h5geWDo9AFBBSYNamPNh8AC5msUbVCcg8kekzAa7r7JPzBX8nZWaXEQVar4t8q/Hg==", "requires": { - "assert": "^1.4.1", + "@meteorjs/crypto-browserify": "^3.12.1", + "assert": "^2.1.0", "browserify-zlib": "^0.2.0", - "buffer": "^5.2.1", - "console-browserify": "^1.1.0", + "buffer": "^5.7.1", + "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^1.2.0", + "domain-browser": "^4.23.0", "elliptic": "^6.5.4", - "events": "^3.0.0", + "events": "^3.3.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", + "path-browserify": "^1.0.1", "process": "^0.11.10", - "punycode": "^2.1.1", + "punycode": "^1.4.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.3.0", - "stream-browserify": "^2.0.2", - "stream-http": "^3.0.0", - "string_decoder": "^1.2.0", - "timers-browserify": "^2.0.10", + "readable-stream": "^3.6.2", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.11.1", - "vm-browserify": "^1.1.0" + "url": "^0.11.3", + "util": "^0.12.5", + "vm-browserify": "^1.1.2" }, "dependencies": { + "@meteorjs/crypto-browserify": { + "version": "3.12.1", + "bundled": true, + "requires": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, "asn1.js": { - "version": "5.4.1", + "version": "4.10.1", "bundled": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "minimalistic-assert": "^1.0.0" }, "dependencies": { "bn.js": { @@ -207,22 +234,20 @@ } }, "assert": { - "version": "1.5.0", + "version": "2.1.0", "bundled": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "util": { - "version": "0.10.3", - "bundled": true, - "requires": { - "inherits": "2.0.1" - } - } + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, + "available-typed-arrays": { + "version": "1.0.5", + "bundled": true + }, "base64-js": { "version": "1.5.1", "bundled": true @@ -275,23 +300,64 @@ } }, "browserify-sign": { - "version": "4.2.1", + "version": "4.2.3", "bundled": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" }, "dependencies": { - "inherits": { - "version": "2.0.4", + "bn.js": { + "version": "5.2.1", "bundled": true + }, + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "readable-stream": { + "version": "2.3.8", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } } } }, @@ -318,6 +384,15 @@ "version": "3.0.0", "bundled": true }, + "call-bind": { + "version": "1.0.5", + "bundled": true, + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, "cipher-base": { "version": "1.0.4", "bundled": true, @@ -335,7 +410,7 @@ "bundled": true }, "core-util-is": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true }, "create-ecdh": { @@ -375,21 +450,22 @@ "sha.js": "^2.4.8" } }, - "crypto-browserify": { - "version": "3.12.0", + "define-data-property": { + "version": "1.1.1", "bundled": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "define-properties": { + "version": "1.2.1", + "bundled": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "des.js": { @@ -416,11 +492,11 @@ } }, "domain-browser": { - "version": "1.2.0", + "version": "4.23.0", "bundled": true }, "elliptic": { - "version": "6.5.4", + "version": "6.5.5", "bundled": true, "requires": { "bn.js": "^4.11.9", @@ -435,10 +511,6 @@ "bn.js": { "version": "4.12.0", "bundled": true - }, - "inherits": { - "version": "2.0.4", - "bundled": true } } }, @@ -454,6 +526,56 @@ "safe-buffer": "^5.1.1" } }, + "for-each": { + "version": "0.3.3", + "bundled": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "function-bind": { + "version": "1.1.2", + "bundled": true + }, + "get-intrinsic": { + "version": "1.2.2", + "bundled": true, + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "has-property-descriptors": { + "version": "1.0.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "bundled": true + }, + "has-symbols": { + "version": "1.0.3", + "bundled": true + }, + "has-tostringtag": { + "version": "1.0.0", + "bundled": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "hash-base": { "version": "3.1.0", "bundled": true, @@ -461,12 +583,6 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "hash.js": { @@ -475,12 +591,13 @@ "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } + } + }, + "hasown": { + "version": "2.0.0", + "bundled": true, + "requires": { + "function-bind": "^1.1.2" } }, "hmac-drbg": { @@ -501,9 +618,43 @@ "bundled": true }, "inherits": { - "version": "2.0.1", + "version": "2.0.4", + "bundled": true + }, + "is-arguments": { + "version": "1.1.1", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", "bundled": true }, + "is-generator-function": { + "version": "1.0.10", + "bundled": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-nan": { + "version": "1.3.2", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-typed-array": { + "version": "1.1.12", + "bundled": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, "isarray": { "version": "1.0.0", "bundled": true @@ -539,10 +690,32 @@ "version": "1.0.1", "bundled": true }, - "object-assign": { - "version": "4.1.1", + "object-inspect": { + "version": "1.13.1", + "bundled": true + }, + "object-is": { + "version": "1.1.5", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", "bundled": true }, + "object.assign": { + "version": "4.1.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, "os-browserify": { "version": "0.3.0", "bundled": true @@ -552,14 +725,25 @@ "bundled": true }, "parse-asn1": { - "version": "5.1.6", + "version": "5.1.7", "bundled": true, "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } } }, "path-browserify": { @@ -567,7 +751,7 @@ "bundled": true }, "pbkdf2": { - "version": "3.1.1", + "version": "3.1.2", "bundled": true, "requires": { "create-hash": "^1.1.2", @@ -604,12 +788,15 @@ } }, "punycode": { - "version": "2.1.1", + "version": "1.4.1", "bundled": true }, - "querystring": { - "version": "0.2.0", - "bundled": true + "qs": { + "version": "6.11.2", + "bundled": true, + "requires": { + "side-channel": "^1.0.4" + } }, "querystring-es3": { "version": "0.2.1", @@ -631,18 +818,12 @@ } }, "readable-stream": { - "version": "3.6.0", + "version": "3.6.2", "bundled": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "ripemd160": { @@ -657,9 +838,15 @@ "version": "5.2.1", "bundled": true }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true + "set-function-length": { + "version": "1.1.1", + "bundled": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } }, "setimmediate": { "version": "1.0.5", @@ -673,60 +860,31 @@ "safe-buffer": "^5.0.1" } }, + "side-channel": { + "version": "1.0.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "stream-browserify": { - "version": "2.0.2", + "version": "3.0.0", "bundled": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, "stream-http": { - "version": "3.1.1", + "version": "3.2.0", "bundled": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "string_decoder": { @@ -748,30 +906,22 @@ "bundled": true }, "url": { - "version": "0.11.0", + "version": "0.11.3", "bundled": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "bundled": true - } + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, "util": { - "version": "0.11.1", + "version": "0.12.5", "bundled": true, "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "bundled": true - } + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, "util-deprecate": { @@ -782,6 +932,17 @@ "version": "1.1.2", "bundled": true }, + "which-typed-array": { + "version": "1.1.13", + "bundled": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "xtend": { "version": "4.0.2", "bundled": true @@ -815,9 +976,9 @@ } }, "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.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "mkdirp": { "version": "0.5.5", @@ -897,9 +1058,9 @@ } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "rimraf": { "version": "2.7.1", diff --git a/tools/tests/apps/app-config/package.json b/tools/tests/apps/app-config/package.json index 2b8effc1eee..2efdf5f1a6b 100644 --- a/tools/tests/apps/app-config/package.json +++ b/tools/tests/apps/app-config/package.json @@ -5,8 +5,8 @@ "start": "meteor run" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "meteor-node-stubs": "^1.2.1", + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7", "puppeteer": "^2.1.1" }, "meteor": { diff --git a/tools/tests/apps/app-prints-pid/package.json b/tools/tests/apps/app-prints-pid/package.json index 943ed1057c7..c9d72b58ddd 100644 --- a/tools/tests/apps/app-prints-pid/package.json +++ b/tools/tests/apps/app-prints-pid/package.json @@ -2,8 +2,8 @@ "name": "app-prints-pid", "private": true, "dependencies": { - "@babel/runtime": "^7.15.3", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7" }, "meteor": { "mainModule": { diff --git a/tools/tests/apps/client-refresh/package.json b/tools/tests/apps/client-refresh/package.json index 9eda40e787c..362cd5de713 100644 --- a/tools/tests/apps/client-refresh/package.json +++ b/tools/tests/apps/client-refresh/package.json @@ -8,8 +8,8 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7" }, "meteor": { "mainModule": { diff --git a/tools/tests/apps/compiler-plugin-add-asset/use-asset.js b/tools/tests/apps/compiler-plugin-add-asset/use-asset.js index d1299bcc56c..f22655cb46a 100644 --- a/tools/tests/apps/compiler-plugin-add-asset/use-asset.js +++ b/tools/tests/apps/compiler-plugin-add-asset/use-asset.js @@ -1,3 +1,3 @@ (async () => { - console.log("Asset says", await Assets.getText("foo.printme")); + console.log("Asset says", await Assets.getTextAsync("foo.printme")); })(); diff --git a/tools/tests/apps/compiler-plugin-asset-and-source/packages/asset-and-source/asset-and-source.js b/tools/tests/apps/compiler-plugin-asset-and-source/packages/asset-and-source/asset-and-source.js index 799e12b795e..548bc210637 100644 --- a/tools/tests/apps/compiler-plugin-asset-and-source/packages/asset-and-source/asset-and-source.js +++ b/tools/tests/apps/compiler-plugin-asset-and-source/packages/asset-and-source/asset-and-source.js @@ -1,6 +1,6 @@ if (Meteor.isServer) { // Printing out my own source code! (async () => { - console.log(await Assets.getText("asset-and-source.js")); + console.log(await Assets.getTextAsync("asset-and-source.js")); })(); } diff --git a/tools/tests/apps/css-injection-test/package.json b/tools/tests/apps/css-injection-test/package.json index 488a3ee0a04..f8f7c80c9f4 100644 --- a/tools/tests/apps/css-injection-test/package.json +++ b/tools/tests/apps/css-injection-test/package.json @@ -8,9 +8,9 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "jquery": "^3.5.1", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "jquery": "^3.7.1", + "meteor-node-stubs": "^1.2.7" }, "meteor": { "mainModule": "css-injection-test.js" diff --git a/tools/tests/apps/custom-minifier/package.json b/tools/tests/apps/custom-minifier/package.json index 516a6a46f8c..d8fe2af5aab 100644 --- a/tools/tests/apps/custom-minifier/package.json +++ b/tools/tests/apps/custom-minifier/package.json @@ -8,9 +8,9 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "jquery": "^3.6.0", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "jquery": "^3.7.1", + "meteor-node-stubs": "^1.2.7" }, "meteor": { "mainModule": "code.js" diff --git a/tools/tests/apps/dev-bundle-bin-commands/package.json b/tools/tests/apps/dev-bundle-bin-commands/package.json index 491153030ac..8e07cd81b2f 100644 --- a/tools/tests/apps/dev-bundle-bin-commands/package.json +++ b/tools/tests/apps/dev-bundle-bin-commands/package.json @@ -7,7 +7,7 @@ "exit-normally": "echo \"This script will exit normally\" && exit 0" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7" } } diff --git a/tools/tests/apps/dynamic-import/package.json b/tools/tests/apps/dynamic-import/package.json index 9e6ed8c7fbb..64f382fec1f 100644 --- a/tools/tests/apps/dynamic-import/package.json +++ b/tools/tests/apps/dynamic-import/package.json @@ -6,11 +6,11 @@ "test": "TEST_BROWSER_DRIVER=puppeteer meteor test --full-app --driver-package meteortesting:mocha" }, "dependencies": { - "@babel/runtime": "^7.15.3", + "@babel/runtime": "^7.23.5", "acorn": "^7.4.1", "arson": "^0.2.6", - "jquery": "^3.6.0", - "meteor-node-stubs": "^1.2.5", + "jquery": "^3.7.1", + "meteor-node-stubs": "^1.2.7", "moment": "^2.29.4", "optimism": "^0.11.5", "private": "^0.1.8", diff --git a/tools/tests/apps/ecmascript-regression/.meteor/packages b/tools/tests/apps/ecmascript-regression/.meteor/packages index cfd5022f7ae..2c648654f5a 100644 --- a/tools/tests/apps/ecmascript-regression/.meteor/packages +++ b/tools/tests/apps/ecmascript-regression/.meteor/packages @@ -13,12 +13,12 @@ standard-minifier-css@1.9.3-alpha300.11 # CSS minifier run for production mod standard-minifier-js@3.0.0-alpha300.10 # JS minifier run for production mode es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers ecmascript@0.16.8-alpha300.11 # Enable ECMAScript2015+ syntax in app code -typescript@4.9.4 # Enable TypeScript syntax in .ts and .tsx modules +typescript@5.3.3-beta300.7 # Enable TypeScript syntax in .ts and .tsx modules shell-server@0.6.0-alpha300.11 # Server-side component of the `meteor shell` command hot-module-replacement@0.5.4-alpha300.11 # Update client in development without reloading the page autopublish@1.0.7 # Publish all data to the clients (for prototyping) insecure@1.0.7 # Allow all DB writes from clients (for prototyping) static-html@1.3.3-alpha300.11 # Define static page content in .html files -react-meteor-data@2.7.2 # React higher-order component for reactively tracking Meteor data +react-meteor-data@3.0.0-beta300.1 # React higher-order component for reactively tracking Meteor data meteortesting:mocha@3.0.3-alpha300.11 diff --git a/tools/tests/apps/ecmascript-regression/.meteor/versions b/tools/tests/apps/ecmascript-regression/.meteor/versions index d5985967e1c..831289b98d9 100644 --- a/tools/tests/apps/ecmascript-regression/.meteor/versions +++ b/tools/tests/apps/ecmascript-regression/.meteor/versions @@ -38,7 +38,7 @@ logging@1.3.1 meteor@1.10.0 meteor-base@1.5.1 meteortesting:browser-tests@1.3.4 -meteortesting:mocha@2.0.3 +meteortesting:mocha@3.0.3-alpha300.11 meteortesting:mocha-core@8.0.1 minifier-css@1.6.0 minifier-js@2.7.1 @@ -58,7 +58,7 @@ ordered-dict@1.1.0 promise@0.12.0 random@1.2.1 react-fast-refresh@0.1.1 -react-meteor-data@2.3.3 +react-meteor-data@3.0.0-beta300.1 reactive-var@1.0.12 reload@1.3.1 retry@1.1.0 diff --git a/tools/tests/apps/ecmascript-regression/package-lock.json b/tools/tests/apps/ecmascript-regression/package-lock.json index d28c129bacb..b49e0ddf417 100644 --- a/tools/tests/apps/ecmascript-regression/package-lock.json +++ b/tools/tests/apps/ecmascript-regression/package-lock.json @@ -4,11 +4,11 @@ "lockfileVersion": 1, "dependencies": { "@babel/runtime": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", - "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" } }, "@types/node": { @@ -217,44 +217,71 @@ } }, "meteor-node-stubs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.1.0.tgz", - "integrity": "sha512-YvMQb4zcfWA82wFdRVTyxq28GO+Us7GSdtP+bTtC/mV35yipKnWo4W4665O57AmLVFnz4zR+WIZW11b4sfCtJw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.9.tgz", + "integrity": "sha512-EKRezc1/PblYtYiK4BOT3h5geWDo9AFBBSYNamPNh8AC5msUbVCcg8kekzAa7r7JPzBX8nZWaXEQVar4t8q/Hg==", "requires": { - "assert": "^2.0.0", + "@meteorjs/crypto-browserify": "^3.12.1", + "assert": "^2.1.0", "browserify-zlib": "^0.2.0", - "buffer": "^6.0.3", + "buffer": "^5.7.1", "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", + "domain-browser": "^4.23.0", "elliptic": "^6.5.4", "events": "^3.3.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", + "path-browserify": "^1.0.1", "process": "^0.11.10", - "punycode": "^2.1.1", + "punycode": "^1.4.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", + "readable-stream": "^3.6.2", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", + "url": "^0.11.3", + "util": "^0.12.5", "vm-browserify": "^1.1.2" }, "dependencies": { + "@meteorjs/crypto-browserify": { + "version": "3.12.1", + "bundled": true, + "requires": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, "asn1.js": { - "version": "5.4.1", + "version": "4.10.1", "bundled": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "minimalistic-assert": "^1.0.0" }, "dependencies": { "bn.js": { @@ -264,17 +291,18 @@ } }, "assert": { - "version": "2.0.0", + "version": "2.1.0", "bundled": true, "requires": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, "available-typed-arrays": { - "version": "1.0.4", + "version": "1.0.5", "bundled": true }, "base64-js": { @@ -329,18 +357,65 @@ } }, "browserify-sign": { - "version": "4.2.1", + "version": "4.2.3", "bundled": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "bundled": true + }, + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "readable-stream": { + "version": "2.3.8", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } + } } }, "browserify-zlib": { @@ -351,11 +426,11 @@ } }, "buffer": { - "version": "6.0.3", + "version": "5.7.1", "bundled": true, "requires": { "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "ieee754": "^1.1.13" } }, "buffer-xor": { @@ -367,11 +442,12 @@ "bundled": true }, "call-bind": { - "version": "1.0.2", + "version": "1.0.5", "bundled": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" } }, "cipher-base": { @@ -390,6 +466,10 @@ "version": "1.0.0", "bundled": true }, + "core-util-is": { + "version": "1.0.3", + "bundled": true + }, "create-ecdh": { "version": "4.0.4", "bundled": true, @@ -427,28 +507,22 @@ "sha.js": "^2.4.8" } }, - "crypto-browserify": { - "version": "3.12.0", + "define-data-property": { + "version": "1.1.1", "bundled": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" } }, "define-properties": { - "version": "1.1.3", + "version": "1.2.1", "bundled": true, "requires": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "des.js": { @@ -475,11 +549,11 @@ } }, "domain-browser": { - "version": "4.19.0", + "version": "4.23.0", "bundled": true }, "elliptic": { - "version": "6.5.4", + "version": "6.5.5", "bundled": true, "requires": { "bn.js": "^4.11.9", @@ -497,41 +571,6 @@ } } }, - "es-abstract": { - "version": "1.18.3", - "bundled": true, - "requires": { - "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", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "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" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "bundled": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "bundled": true - }, "events": { "version": "3.3.0", "bundled": true @@ -544,38 +583,56 @@ "safe-buffer": "^5.1.1" } }, - "foreach": { - "version": "2.0.5", - "bundled": true + "for-each": { + "version": "0.3.3", + "bundled": true, + "requires": { + "is-callable": "^1.1.3" + } }, "function-bind": { - "version": "1.1.1", + "version": "1.1.2", "bundled": true }, "get-intrinsic": { - "version": "1.1.1", + "version": "1.2.2", "bundled": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, - "has": { - "version": "1.0.3", + "gopd": { + "version": "1.0.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "has-property-descriptors": { + "version": "1.0.1", "bundled": true, "requires": { - "function-bind": "^1.1.1" + "get-intrinsic": "^1.2.2" } }, - "has-bigints": { + "has-proto": { "version": "1.0.1", "bundled": true }, "has-symbols": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true }, + "has-tostringtag": { + "version": "1.0.0", + "bundled": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "hash-base": { "version": "3.1.0", "bundled": true, @@ -593,6 +650,13 @@ "minimalistic-assert": "^1.0.1" } }, + "hasown": { + "version": "2.0.0", + "bundled": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "hmac-drbg": { "version": "1.0.1", "bundled": true, @@ -615,34 +679,23 @@ "bundled": true }, "is-arguments": { - "version": "1.1.0", - "bundled": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.2", - "bundled": true - }, - "is-boolean-object": { "version": "1.1.1", "bundled": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-callable": { - "version": "1.2.3", - "bundled": true - }, - "is-date-object": { - "version": "1.0.4", + "version": "1.2.7", "bundled": true }, "is-generator-function": { - "version": "1.0.9", - "bundled": true + "version": "1.0.10", + "bundled": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-nan": { "version": "1.3.2", @@ -652,44 +705,17 @@ "define-properties": "^1.1.3" } }, - "is-negative-zero": { - "version": "2.0.1", - "bundled": true - }, - "is-number-object": { - "version": "1.0.5", - "bundled": true - }, - "is-regex": { - "version": "1.1.3", + "is-typed-array": { + "version": "1.1.12", "bundled": true, "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" + "which-typed-array": "^1.1.11" } }, - "is-string": { - "version": "1.0.6", + "isarray": { + "version": "1.0.0", "bundled": true }, - "is-symbol": { - "version": "1.0.4", - "bundled": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.5", - "bundled": true, - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - } - }, "md5.js": { "version": "1.3.5", "bundled": true, @@ -722,7 +748,7 @@ "bundled": true }, "object-inspect": { - "version": "1.10.3", + "version": "1.13.1", "bundled": true }, "object-is": { @@ -738,12 +764,12 @@ "bundled": true }, "object.assign": { - "version": "4.1.2", + "version": "4.1.4", "bundled": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -756,14 +782,25 @@ "bundled": true }, "parse-asn1": { - "version": "5.1.6", + "version": "5.1.7", "bundled": true, "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } } }, "path-browserify": { @@ -785,6 +822,10 @@ "version": "0.11.10", "bundled": true }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true + }, "public-encrypt": { "version": "4.0.3", "bundled": true, @@ -804,12 +845,15 @@ } }, "punycode": { - "version": "2.1.1", + "version": "1.4.1", "bundled": true }, - "querystring": { - "version": "0.2.0", - "bundled": true + "qs": { + "version": "6.11.2", + "bundled": true, + "requires": { + "side-channel": "^1.0.4" + } }, "querystring-es3": { "version": "0.2.1", @@ -831,7 +875,7 @@ } }, "readable-stream": { - "version": "3.6.0", + "version": "3.6.2", "bundled": true, "requires": { "inherits": "^2.0.3", @@ -851,9 +895,15 @@ "version": "5.2.1", "bundled": true }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true + "set-function-length": { + "version": "1.1.1", + "bundled": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } }, "setimmediate": { "version": "1.0.5", @@ -867,6 +917,15 @@ "safe-buffer": "^5.0.1" } }, + "side-channel": { + "version": "1.0.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "stream-browserify": { "version": "3.0.0", "bundled": true, @@ -885,22 +944,6 @@ "xtend": "^4.0.2" } }, - "string.prototype.trimend": { - "version": "1.0.4", - "bundled": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "bundled": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "string_decoder": { "version": "1.3.0", "bundled": true, @@ -919,39 +962,22 @@ "version": "0.0.1", "bundled": true }, - "unbox-primitive": { - "version": "1.0.1", - "bundled": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, "url": { - "version": "0.11.0", + "version": "0.11.3", "bundled": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "bundled": true - } + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, "util": { - "version": "0.12.4", + "version": "0.12.5", "bundled": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", "which-typed-array": "^1.1.2" } }, @@ -963,28 +989,15 @@ "version": "1.1.2", "bundled": true }, - "which-boxed-primitive": { - "version": "1.0.2", - "bundled": true, - "requires": { - "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" - } - }, "which-typed-array": { - "version": "1.1.4", + "version": "1.1.13", "bundled": true, "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" } }, "xtend": { @@ -1002,9 +1015,9 @@ } }, "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.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "mkdirp": { "version": "0.5.5", @@ -1149,9 +1162,9 @@ } }, "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.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "rimraf": { "version": "3.0.2", diff --git a/tools/tests/apps/ecmascript-regression/package.json b/tools/tests/apps/ecmascript-regression/package.json index 429361864de..f92bde44efc 100644 --- a/tools/tests/apps/ecmascript-regression/package.json +++ b/tools/tests/apps/ecmascript-regression/package.json @@ -7,8 +7,8 @@ "test-app": "TEST_WATCH=1 meteor test --full-app --driver-package meteortesting:mocha --exclude-archs web.browser" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "meteor-node-stubs": "^1.2.1", + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7", "puppeteer": "^10.4.0", "react": "^17.0.2", "react-dom": "^17.0.2" diff --git a/tools/tests/apps/git-commit-hash/package-lock.json b/tools/tests/apps/git-commit-hash/package-lock.json index e65d98864d5..dfaba304dd5 100644 --- a/tools/tests/apps/git-commit-hash/package-lock.json +++ b/tools/tests/apps/git-commit-hash/package-lock.json @@ -4,11 +4,11 @@ "lockfileVersion": 1, "dependencies": { "@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" } }, "@types/mime-types": { @@ -160,44 +160,71 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "meteor-node-stubs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.0.3.tgz", - "integrity": "sha512-JQwIWPfM/Oa2x1Ycwn1Q0wVVQ8b0bOLv+qs4RR/D12b5dPktLlPCRhMzWzRPncZVJtfsnKKBgPLdFmJYUqAwHg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.9.tgz", + "integrity": "sha512-EKRezc1/PblYtYiK4BOT3h5geWDo9AFBBSYNamPNh8AC5msUbVCcg8kekzAa7r7JPzBX8nZWaXEQVar4t8q/Hg==", "requires": { - "assert": "^1.4.1", + "@meteorjs/crypto-browserify": "^3.12.1", + "assert": "^2.1.0", "browserify-zlib": "^0.2.0", - "buffer": "^5.2.1", - "console-browserify": "^1.1.0", + "buffer": "^5.7.1", + "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^1.2.0", + "domain-browser": "^4.23.0", "elliptic": "^6.5.4", - "events": "^3.0.0", + "events": "^3.3.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", + "path-browserify": "^1.0.1", "process": "^0.11.10", - "punycode": "^2.1.1", + "punycode": "^1.4.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.3.0", - "stream-browserify": "^2.0.2", - "stream-http": "^3.0.0", - "string_decoder": "^1.2.0", - "timers-browserify": "^2.0.10", + "readable-stream": "^3.6.2", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.11.1", - "vm-browserify": "^1.1.0" + "url": "^0.11.3", + "util": "^0.12.5", + "vm-browserify": "^1.1.2" }, "dependencies": { + "@meteorjs/crypto-browserify": { + "version": "3.12.1", + "bundled": true, + "requires": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, "asn1.js": { - "version": "5.4.1", + "version": "4.10.1", "bundled": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "minimalistic-assert": "^1.0.0" }, "dependencies": { "bn.js": { @@ -207,22 +234,20 @@ } }, "assert": { - "version": "1.5.0", + "version": "2.1.0", "bundled": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "util": { - "version": "0.10.3", - "bundled": true, - "requires": { - "inherits": "2.0.1" - } - } + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, + "available-typed-arrays": { + "version": "1.0.5", + "bundled": true + }, "base64-js": { "version": "1.5.1", "bundled": true @@ -275,23 +300,64 @@ } }, "browserify-sign": { - "version": "4.2.1", + "version": "4.2.3", "bundled": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" }, "dependencies": { - "inherits": { - "version": "2.0.4", + "bn.js": { + "version": "5.2.1", "bundled": true + }, + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "readable-stream": { + "version": "2.3.8", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } } } }, @@ -318,6 +384,15 @@ "version": "3.0.0", "bundled": true }, + "call-bind": { + "version": "1.0.5", + "bundled": true, + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, "cipher-base": { "version": "1.0.4", "bundled": true, @@ -335,7 +410,7 @@ "bundled": true }, "core-util-is": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true }, "create-ecdh": { @@ -375,21 +450,22 @@ "sha.js": "^2.4.8" } }, - "crypto-browserify": { - "version": "3.12.0", + "define-data-property": { + "version": "1.1.1", "bundled": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "define-properties": { + "version": "1.2.1", + "bundled": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "des.js": { @@ -416,11 +492,11 @@ } }, "domain-browser": { - "version": "1.2.0", + "version": "4.23.0", "bundled": true }, "elliptic": { - "version": "6.5.4", + "version": "6.5.5", "bundled": true, "requires": { "bn.js": "^4.11.9", @@ -435,10 +511,6 @@ "bn.js": { "version": "4.12.0", "bundled": true - }, - "inherits": { - "version": "2.0.4", - "bundled": true } } }, @@ -454,6 +526,56 @@ "safe-buffer": "^5.1.1" } }, + "for-each": { + "version": "0.3.3", + "bundled": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "function-bind": { + "version": "1.1.2", + "bundled": true + }, + "get-intrinsic": { + "version": "1.2.2", + "bundled": true, + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "has-property-descriptors": { + "version": "1.0.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "bundled": true + }, + "has-symbols": { + "version": "1.0.3", + "bundled": true + }, + "has-tostringtag": { + "version": "1.0.0", + "bundled": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "hash-base": { "version": "3.1.0", "bundled": true, @@ -461,12 +583,6 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "hash.js": { @@ -475,12 +591,13 @@ "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } + } + }, + "hasown": { + "version": "2.0.0", + "bundled": true, + "requires": { + "function-bind": "^1.1.2" } }, "hmac-drbg": { @@ -501,9 +618,43 @@ "bundled": true }, "inherits": { - "version": "2.0.1", + "version": "2.0.4", + "bundled": true + }, + "is-arguments": { + "version": "1.1.1", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", "bundled": true }, + "is-generator-function": { + "version": "1.0.10", + "bundled": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-nan": { + "version": "1.3.2", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-typed-array": { + "version": "1.1.12", + "bundled": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, "isarray": { "version": "1.0.0", "bundled": true @@ -539,10 +690,32 @@ "version": "1.0.1", "bundled": true }, - "object-assign": { - "version": "4.1.1", + "object-inspect": { + "version": "1.13.1", + "bundled": true + }, + "object-is": { + "version": "1.1.5", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", "bundled": true }, + "object.assign": { + "version": "4.1.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, "os-browserify": { "version": "0.3.0", "bundled": true @@ -552,14 +725,25 @@ "bundled": true }, "parse-asn1": { - "version": "5.1.6", + "version": "5.1.7", "bundled": true, "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } } }, "path-browserify": { @@ -567,7 +751,7 @@ "bundled": true }, "pbkdf2": { - "version": "3.1.1", + "version": "3.1.2", "bundled": true, "requires": { "create-hash": "^1.1.2", @@ -604,12 +788,15 @@ } }, "punycode": { - "version": "2.1.1", + "version": "1.4.1", "bundled": true }, - "querystring": { - "version": "0.2.0", - "bundled": true + "qs": { + "version": "6.11.2", + "bundled": true, + "requires": { + "side-channel": "^1.0.4" + } }, "querystring-es3": { "version": "0.2.1", @@ -631,18 +818,12 @@ } }, "readable-stream": { - "version": "3.6.0", + "version": "3.6.2", "bundled": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "ripemd160": { @@ -657,9 +838,15 @@ "version": "5.2.1", "bundled": true }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true + "set-function-length": { + "version": "1.1.1", + "bundled": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } }, "setimmediate": { "version": "1.0.5", @@ -673,60 +860,31 @@ "safe-buffer": "^5.0.1" } }, + "side-channel": { + "version": "1.0.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "stream-browserify": { - "version": "2.0.2", + "version": "3.0.0", "bundled": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, "stream-http": { - "version": "3.1.1", + "version": "3.2.0", "bundled": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "string_decoder": { @@ -748,30 +906,22 @@ "bundled": true }, "url": { - "version": "0.11.0", + "version": "0.11.3", "bundled": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "bundled": true - } + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, "util": { - "version": "0.11.1", + "version": "0.12.5", "bundled": true, "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "bundled": true - } + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, "util-deprecate": { @@ -782,6 +932,17 @@ "version": "1.1.2", "bundled": true }, + "which-typed-array": { + "version": "1.1.13", + "bundled": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "xtend": { "version": "4.0.2", "bundled": true @@ -815,9 +976,9 @@ } }, "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.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "mkdirp": { "version": "0.5.5", @@ -897,9 +1058,9 @@ } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "rimraf": { "version": "2.7.1", diff --git a/tools/tests/apps/git-commit-hash/package.json b/tools/tests/apps/git-commit-hash/package.json index 7e930c76bc3..515c283bc32 100644 --- a/tools/tests/apps/git-commit-hash/package.json +++ b/tools/tests/apps/git-commit-hash/package.json @@ -6,8 +6,8 @@ "test": "TEST_BROWSER_DRIVER=puppeteer meteor test --once --full-app --driver-package meteortesting:mocha" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "meteor-node-stubs": "^1.2.1", + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7", "puppeteer": "^2.1.1" }, "meteor": { diff --git a/tools/tests/apps/hot-code-push-test/index.js b/tools/tests/apps/hot-code-push-test/index.js new file mode 100644 index 00000000000..a8430413122 --- /dev/null +++ b/tools/tests/apps/hot-code-push-test/index.js @@ -0,0 +1,17 @@ +if (Meteor.isClient) { + if (Meteor.isCordova) { + Meteor.startup(() => { + WebAppLocalServer.onError((e) => { + console.log("hot code push result: " + e.message) + }); + + WebAppLocalServer.onNewVersionReady(() => { + WebAppLocalServer.switchToPendingVersion(() => { + console.log("hot code push result: " + "app updated to new version"); + }); + }); + + WebAppLocalServer.checkForUpdates(); + }); + } +} diff --git a/tools/tests/apps/link-config-npm-package/package.json b/tools/tests/apps/link-config-npm-package/package.json index 4d3eb646240..f44be427e77 100644 --- a/tools/tests/apps/link-config-npm-package/package.json +++ b/tools/tests/apps/link-config-npm-package/package.json @@ -8,9 +8,9 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.15.3", + "@babel/runtime": "^7.23.5", "config": "file:../config-package", - "meteor-node-stubs": "^1.2.1" + "meteor-node-stubs": "^1.2.7" }, "meteor": { "mainModule": { diff --git a/tools/tests/apps/linked-external-npm-package/package.json b/tools/tests/apps/linked-external-npm-package/package.json index c942f8d1826..494f9892497 100644 --- a/tools/tests/apps/linked-external-npm-package/package.json +++ b/tools/tests/apps/linked-external-npm-package/package.json @@ -8,9 +8,9 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.15.3", + "@babel/runtime": "^7.23.5", "external-package": "file:../external-package", - "meteor-node-stubs": "^1.2.1" + "meteor-node-stubs": "^1.2.7" }, "meteor": { "mainModule": { diff --git a/tools/tests/apps/meteor-ignore/package.json b/tools/tests/apps/meteor-ignore/package.json index d181a4bb798..917dd2b0154 100644 --- a/tools/tests/apps/meteor-ignore/package.json +++ b/tools/tests/apps/meteor-ignore/package.json @@ -5,7 +5,7 @@ "start": "meteor run" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7" } } diff --git a/tools/tests/apps/modules/.meteor/packages b/tools/tests/apps/modules/.meteor/packages index f139c0b7a7e..774a83c1f65 100644 --- a/tools/tests/apps/modules/.meteor/packages +++ b/tools/tests/apps/modules/.meteor/packages @@ -4,27 +4,28 @@ # 'meteor add' and 'meteor remove' will edit this file for you, # but you can also edit it by hand. -meteor-base@1.4.0 # Packages every Meteor app needs to have -mobile-experience@1.1.0 # Packages for a great mobile UX -mongo@1.9.0 # The database Meteor supports right now +meteor-base@1.5.2-beta300.6 # Packages every Meteor app needs to have +mobile-experience@1.1.1-beta300.6 # Packages for a great mobile UX +mongo@2.0.0-beta300.6 # The database Meteor supports right now blaze-html-templates # Compile .html files into Meteor Blaze views -session@1.2.1 # Client-side reactive dictionary for your app +session@1.2.2-beta300.6 # Client-side reactive dictionary for your app jquery # Helpful client-side library -tracker@1.2.1 # Meteor's client-side reactive programming library +tracker@1.3.3-beta300.6 # Meteor's client-side reactive programming library -es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers. -ecmascript@0.14.2 # Enable ECMAScript2015+ syntax in app code +es5-shim@4.8.1-beta300.6 # ECMAScript 5 compatibility for older browsers. +ecmascript@0.16.8-beta300.6 # Enable ECMAScript2015+ syntax in app code coffeescript modules-test-package -standard-minifier-css@1.6.0 -standard-minifier-js@2.6.0 +standard-minifier-css@1.9.3-beta300.6 +standard-minifier-js@3.0.0-beta300.6 client-only-ecmascript modules-test-plugin -shell-server@0.5.0 -dynamic-import@0.5.1 -underscore@1.0.11 +shell-server@0.6.0-beta300.6 +dynamic-import@0.7.4-beta300.6 +underscore@1.0.14-beta300.6 import-local-json-module -akryum:vue-component dummy-compiler -typescript +typescript@5.3.3-beta300.6 +meteortesting:mocha@3.1.0-beta300.0 +meteortesting:mocha-core@8.3.1-beta300.0 diff --git a/tools/tests/apps/modules/.meteor/release b/tools/tests/apps/modules/.meteor/release index d2597811105..ecc41d1d5ae 100644 --- a/tools/tests/apps/modules/.meteor/release +++ b/tools/tests/apps/modules/.meteor/release @@ -1 +1 @@ -METEOR@1.10.1 +METEOR@3.0-beta.6 diff --git a/tools/tests/apps/modules/package-lock.json b/tools/tests/apps/modules/package-lock.json index 4796b4800a9..643f346e94c 100644 --- a/tools/tests/apps/modules/package-lock.json +++ b/tools/tests/apps/modules/package-lock.json @@ -3,6 +3,15 @@ "requires": true, "lockfileVersion": 1, "dependencies": { + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", @@ -11,123 +20,137 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==" + }, "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" } }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.24.5" } }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==" }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + } } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -150,6 +173,30 @@ "@babel/types": "^7.7.0" } }, + "@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "requires": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" + }, "@babel/helper-function-name": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", @@ -168,6 +215,26 @@ "@babel/types": "^7.7.0" } }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "requires": { + "@babel/types": "^7.22.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "requires": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-module-imports": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", @@ -176,10 +243,70 @@ "@babel/types": "^7.7.0" } }, + "@babel/helper-module-transforms": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "requires": { + "@babel/types": "^7.24.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "requires": { + "@babel/types": "^7.24.5" + } + }, + "@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "requires": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==" + }, + "@babel/helper-simple-access": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "requires": { + "@babel/types": "^7.24.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "requires": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + } + } + } }, "@babel/helper-split-export-declaration": { "version": "7.7.0", @@ -189,111 +316,128 @@ "@babel/types": "^7.7.0" } }, + "@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==" + }, + "@babel/helper-validator-identifier": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==" + }, + "@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" + }, "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" } }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "requires": { - "@babel/types": "^7.8.3" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.24.5" } }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==" }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } } } }, @@ -313,34 +457,34 @@ "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==" }, "@babel/plugin-proposal-do-expressions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.8.3.tgz", - "integrity": "sha512-NoMcN+0+SS1DVswjDCfz+Jfm9ViOYuFtv1lm0QInEugbEXK2iH3jeSq38WmIiTP+2QKqo2zt8xku77gqHINZkw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.24.1.tgz", + "integrity": "sha512-tVYbJAE3Duz/T0lV5P27aAgpg2vTfUuV0dXN4NNbnoRk7G989IcgjYIA+1pMHUMMLij7Gun42CC15UN5jWm4LA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-do-expressions": "^7.8.3" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-do-expressions": "^7.24.1" } }, "@babel/plugin-syntax-do-expressions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.8.3.tgz", - "integrity": "sha512-puRiUTVDQ69iRX41eeVWqOftZK31waWqZfwKB/TGzPfgi7097twx/DpwfOfyqEGqYtvpQF3jpHwT6UBzvSyAjw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.24.1.tgz", + "integrity": "sha512-l5ZJA2DB2s/pM3SQzwf1ykWOiBaqN6Eb07EoZ/mH8dUR5RnaWlmPLoav6y4OT8A9Pkl615osBMZOedFbErdOOA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.14.0" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" } } }, @@ -398,6 +542,40 @@ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.4.tgz", "integrity": "sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ==" }, + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "@polymer/lit-element": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@polymer/lit-element/-/lit-element-0.7.1.tgz", @@ -549,6 +727,17 @@ "concat-map": "0.0.1" } }, + "browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "requires": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + } + }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -574,6 +763,11 @@ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, + "caniuse-lite": { + "version": "1.0.30001617", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", + "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -653,12 +847,9 @@ } }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "core-js": { "version": "1.2.7", @@ -711,6 +902,11 @@ "object-keys": "^1.0.12" } }, + "electron-to-chromium": { + "version": "1.4.761", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.761.tgz", + "integrity": "sha512-PIbxpiJGx6Bb8dQaonNc6CGTRlVntdLg/2nMa1YhnrwYOORY9a3ZgGN0UQYE6lAcj/lkyduJN7BPt/JiY+jAQQ==" + }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", @@ -751,6 +947,11 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.9.2.tgz", "integrity": "sha1-0uMJ0fIjsHGGSINaz1uII6gGH4o=" }, + "escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -848,9 +1049,9 @@ "integrity": "sha1-OMYYhRPhQDCUjsblz2VSPZd5KZs=" }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "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==" }, "github": { "version": "0.2.4", @@ -1074,9 +1275,9 @@ "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" }, "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" }, "js-tokens": { "version": "4.0.0", @@ -1089,12 +1290,9 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsx-import-test": { "version": "file:imports/links/jsx-import-test", @@ -1140,6 +1338,14 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, "markdown-escapes": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz", @@ -1179,35 +1385,64 @@ } }, "meteor-node-stubs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.0.1.tgz", - "integrity": "sha512-I4PE/z7eAl45XEsebHA4pcQbgjqEdK3EBGgiUoIZBi3bMQcMq6blLWZo+WdtK4Or9X4NJOiYWw4GmHiubr3egA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.9.tgz", + "integrity": "sha512-EKRezc1/PblYtYiK4BOT3h5geWDo9AFBBSYNamPNh8AC5msUbVCcg8kekzAa7r7JPzBX8nZWaXEQVar4t8q/Hg==", "requires": { - "assert": "^1.4.1", + "@meteorjs/crypto-browserify": "^3.12.1", + "assert": "^2.1.0", "browserify-zlib": "^0.2.0", - "buffer": "^5.2.1", - "console-browserify": "^1.1.0", + "buffer": "^5.7.1", + "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^1.2.0", - "events": "^3.0.0", + "domain-browser": "^4.23.0", + "elliptic": "^6.5.4", + "events": "^3.3.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", + "path-browserify": "^1.0.1", "process": "^0.11.10", - "punycode": "^2.1.1", + "punycode": "^1.4.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.3.0", - "stream-browserify": "^2.0.2", - "stream-http": "^3.0.0", - "string_decoder": "^1.2.0", - "timers-browserify": "^2.0.10", + "readable-stream": "^3.6.2", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.11.1", - "vm-browserify": "^1.1.0" + "url": "^0.11.3", + "util": "^0.12.5", + "vm-browserify": "^1.1.2" }, "dependencies": { + "@meteorjs/crypto-browserify": { + "version": "3.12.1", + "bundled": true, + "requires": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, "asn1.js": { "version": "4.10.1", "bundled": true, @@ -1215,30 +1450,35 @@ "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } } }, "assert": { - "version": "1.4.1", + "version": "2.1.0", "bundled": true, "requires": { - "util": "0.10.3" - }, - "dependencies": { - "util": { - "version": "0.10.3", - "bundled": true, - "requires": { - "inherits": "2.0.1" - } - } + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, + "available-typed-arrays": { + "version": "1.0.5", + "bundled": true + }, "base64-js": { - "version": "1.3.0", + "version": "1.5.1", "bundled": true }, "bn.js": { - "version": "4.11.8", + "version": "5.2.0", "bundled": true }, "brorand": { @@ -1277,24 +1517,73 @@ } }, "browserify-rsa": { - "version": "4.0.1", + "version": "4.1.0", "bundled": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, "browserify-sign": { - "version": "4.0.4", + "version": "4.2.3", "bundled": true, "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "bundled": true + }, + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "readable-stream": { + "version": "2.3.8", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "bundled": true + } + } + } } }, "browserify-zlib": { @@ -1305,11 +1594,11 @@ } }, "buffer": { - "version": "5.2.1", + "version": "5.7.1", "bundled": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-xor": { @@ -1320,6 +1609,15 @@ "version": "3.0.0", "bundled": true }, + "call-bind": { + "version": "1.0.5", + "bundled": true, + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, "cipher-base": { "version": "1.0.4", "bundled": true, @@ -1329,26 +1627,29 @@ } }, "console-browserify": { - "version": "1.1.0", - "bundled": true, - "requires": { - "date-now": "^0.1.4" - } + "version": "1.2.0", + "bundled": true }, "constants-browserify": { "version": "1.0.0", "bundled": true }, "core-util-is": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true }, "create-ecdh": { - "version": "4.0.3", + "version": "4.0.4", "bundled": true, "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } } }, "create-hash": { @@ -1374,29 +1675,26 @@ "sha.js": "^2.4.8" } }, - "crypto-browserify": { - "version": "3.12.0", + "define-data-property": { + "version": "1.1.1", "bundled": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" } }, - "date-now": { - "version": "0.1.4", - "bundled": true + "define-properties": { + "version": "1.2.1", + "bundled": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } }, "des.js": { - "version": "1.0.0", + "version": "1.0.1", "bundled": true, "requires": { "inherits": "^2.0.1", @@ -1410,27 +1708,39 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } } }, "domain-browser": { - "version": "1.2.0", + "version": "4.23.0", "bundled": true }, "elliptic": { - "version": "6.5.3", + "version": "6.5.5", "bundled": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } } }, "events": { - "version": "3.0.0", + "version": "3.3.0", "bundled": true }, "evp_bytestokey": { @@ -1441,12 +1751,63 @@ "safe-buffer": "^5.1.1" } }, + "for-each": { + "version": "0.3.3", + "bundled": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "function-bind": { + "version": "1.1.2", + "bundled": true + }, + "get-intrinsic": { + "version": "1.2.2", + "bundled": true, + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "has-property-descriptors": { + "version": "1.0.1", + "bundled": true, + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "bundled": true + }, + "has-symbols": { + "version": "1.0.3", + "bundled": true + }, + "has-tostringtag": { + "version": "1.0.0", + "bundled": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "hash-base": { - "version": "3.0.4", + "version": "3.1.0", "bundled": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" } }, "hash.js": { @@ -1455,12 +1816,13 @@ "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "bundled": true - } + } + }, + "hasown": { + "version": "2.0.0", + "bundled": true, + "requires": { + "function-bind": "^1.1.2" } }, "hmac-drbg": { @@ -1477,13 +1839,47 @@ "bundled": true }, "ieee754": { - "version": "1.1.13", + "version": "1.2.1", "bundled": true }, "inherits": { - "version": "2.0.1", + "version": "2.0.4", + "bundled": true + }, + "is-arguments": { + "version": "1.1.1", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", "bundled": true }, + "is-generator-function": { + "version": "1.0.10", + "bundled": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-nan": { + "version": "1.3.2", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-typed-array": { + "version": "1.1.12", + "bundled": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, "isarray": { "version": "1.0.0", "bundled": true @@ -1503,6 +1899,12 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } } }, "minimalistic-assert": { @@ -1513,32 +1915,68 @@ "version": "1.0.1", "bundled": true }, + "object-inspect": { + "version": "1.13.1", + "bundled": true + }, + "object-is": { + "version": "1.1.5", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "bundled": true + }, + "object.assign": { + "version": "4.1.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, "os-browserify": { "version": "0.3.0", "bundled": true }, "pako": { - "version": "1.0.10", + "version": "1.0.11", "bundled": true }, "parse-asn1": { - "version": "5.1.4", + "version": "5.1.7", "bundled": true, "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } } }, "path-browserify": { - "version": "1.0.0", + "version": "1.0.1", "bundled": true }, "pbkdf2": { - "version": "3.0.17", + "version": "3.1.2", "bundled": true, "requires": { "create-hash": "^1.1.2", @@ -1553,7 +1991,7 @@ "bundled": true }, "process-nextick-args": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true }, "public-encrypt": { @@ -1566,15 +2004,24 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } } }, "punycode": { - "version": "2.1.1", + "version": "1.4.1", "bundled": true }, - "querystring": { - "version": "0.2.0", - "bundled": true + "qs": { + "version": "6.11.2", + "bundled": true, + "requires": { + "side-channel": "^1.0.4" + } }, "querystring-es3": { "version": "0.2.1", @@ -1596,18 +2043,12 @@ } }, "readable-stream": { - "version": "3.3.0", + "version": "3.6.2", "bundled": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "bundled": true - } } }, "ripemd160": { @@ -1619,9 +2060,19 @@ } }, "safe-buffer": { - "version": "5.1.2", + "version": "5.2.1", "bundled": true }, + "set-function-length": { + "version": "1.1.1", + "bundled": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "setimmediate": { "version": "1.0.5", "bundled": true @@ -1634,61 +2085,42 @@ "safe-buffer": "^5.0.1" } }, + "side-channel": { + "version": "1.0.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "stream-browserify": { - "version": "2.0.2", + "version": "3.0.0", "bundled": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "bundled": true - } - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, "stream-http": { - "version": "3.0.0", + "version": "3.2.0", "bundled": true, "requires": { "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6", - "xtend": "^4.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" } }, "string_decoder": { - "version": "1.2.0", + "version": "1.3.0", "bundled": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "timers-browserify": { - "version": "2.0.10", + "version": "2.0.12", "bundled": true, "requires": { "setimmediate": "^1.0.4" @@ -1699,30 +2131,22 @@ "bundled": true }, "url": { - "version": "0.11.0", + "version": "0.11.3", "bundled": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "bundled": true - } + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, "util": { - "version": "0.11.1", + "version": "0.12.5", "bundled": true, "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "bundled": true - } + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, "util-deprecate": { @@ -1730,11 +2154,22 @@ "bundled": true }, "vm-browserify": { - "version": "1.1.0", + "version": "1.1.2", "bundled": true }, + "which-typed-array": { + "version": "1.1.13", + "bundled": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "xtend": { - "version": "4.0.1", + "version": "4.0.2", "bundled": true } } @@ -1766,9 +2201,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "mkdirp": { "version": "0.5.5", @@ -1776,13 +2211,6 @@ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - } } }, "mobx": { @@ -1835,6 +2263,11 @@ "is-stream": "^1.0.1" } }, + "node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1885,16 +2318,16 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -2127,14 +2560,6 @@ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "requires": { - "path-parse": "^1.0.6" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -2414,6 +2839,15 @@ "unist-util-is": "^3.0.0" } }, + "update-browserslist-db": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "requires": { + "escalade": "^3.1.2", + "picocolors": "^1.0.0" + } + }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -2438,9 +2872,9 @@ } }, "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "vfile": { "version": "2.3.0", @@ -2522,6 +2956,11 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/tools/tests/apps/modules/package.json b/tools/tests/apps/modules/package.json index 86b12e64ffa..f76cfa15ecb 100644 --- a/tools/tests/apps/modules/package.json +++ b/tools/tests/apps/modules/package.json @@ -4,9 +4,9 @@ "description": "Test app exercising many aspects of the Meteor module system.", "private": true, "dependencies": { - "@babel/core": "^7.15.0", - "@babel/plugin-proposal-do-expressions": "^7.8.3", - "@babel/runtime": "^7.15.3", + "@babel/core": "^7.23.5", + "@babel/plugin-proposal-do-expressions": "^7.23.3", + "@babel/runtime": "^7.23.5", "@polymer/lit-element": "0.7.1", "@wry/context": "^0.4.0", "acorn": "file:imports/links/acorn", @@ -15,11 +15,11 @@ "github": "^0.2.4", "graphql": "^14.3.1", "immutable-tuple": "^0.4.4", - "jquery": "^3.5.1", + "jquery": "^3.7.1", "jsx-import-test": "file:imports/links/jsx-import-test", "lodash-es": "^4.17.7", "markdown-to-jsx": "4.0.3", - "meteor-node-stubs": "^1.0.1", + "meteor-node-stubs": "^1.2.7", "mobx": "5.8.0", "moment": "^2.22.2", "mssql": "^3.1.1", diff --git a/tools/tests/apps/modules/packages/modules-test-package/.npm/package/npm-shrinkwrap.json b/tools/tests/apps/modules/packages/modules-test-package/.npm/package/npm-shrinkwrap.json index dc8c2d0563d..22547232a8f 100644 --- a/tools/tests/apps/modules/packages/modules-test-package/.npm/package/npm-shrinkwrap.json +++ b/tools/tests/apps/modules/packages/modules-test-package/.npm/package/npm-shrinkwrap.json @@ -1,5 +1,5 @@ { - "lockfileVersion": 1, + "lockfileVersion": 4, "dependencies": { "@wry/context": { "version": "0.4.0", @@ -9,22 +9,22 @@ "assert": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", - "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=" + "integrity": "sha512-5aKcpD+XnHpZ7EGxsuo6uoILNh0rvm0Ypa17GlkrF2CNSPhvdgi3ft9XsL2ajdVOI2I3xuGZnHvlXAeqTZYvXg==" }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "cheerio": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=" + "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==" }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=" + "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==" }, "css-what": { "version": "2.1.3", @@ -49,7 +49,7 @@ "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=" + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==" }, "entities": { "version": "1.1.2", @@ -67,69 +67,69 @@ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==" }, "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==" }, "lodash.bind": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==" }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==" }, "lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, "lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==" }, "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" }, "lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==" }, "lodash.reject": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==" }, "lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==" }, "nth-check": { "version": "1.0.2", @@ -139,44 +139,44 @@ "os-browserify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.0.tgz", - "integrity": "sha1-SRfR6su/0qoaLuQ5tD1EsPnTx5A=" + "integrity": "sha512-oFcZ4Sqg4duxsVmkbuygtTRg5EEJ6PMoFUHC/vLLONyiJLvs5fvjCDSV47lP6vFLz/nZrhBhKqMrpk8IeoG3eQ==" }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" }, "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": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=" + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + } + } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" } } } diff --git a/tools/tests/apps/modules/packages/modules-test-plugin/.npm/package/npm-shrinkwrap.json b/tools/tests/apps/modules/packages/modules-test-plugin/.npm/package/npm-shrinkwrap.json index e3c638b6c3d..6ba67c8e6e1 100644 --- a/tools/tests/apps/modules/packages/modules-test-plugin/.npm/package/npm-shrinkwrap.json +++ b/tools/tests/apps/modules/packages/modules-test-plugin/.npm/package/npm-shrinkwrap.json @@ -1,60 +1,60 @@ { - "lockfileVersion": 1, + "lockfileVersion": 4, "dependencies": { "arson": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/arson/-/arson-0.2.3.tgz", - "integrity": "sha1-o9jAuQk0DQSDFGFwA+xuASzzi5U=" + "integrity": "sha512-ji2VdOrAlglFvQ3BPIxD9HnoWsJTigg/aVLONK9Q5zBn8KIi44SWCaGl+6La+3ZCwMvaLC4nKijhFUIixazceQ==" }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + "integrity": "sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==" }, "babel-plugin-transform-class-properties": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.9.0.tgz", - "integrity": "sha1-DxgxuPeNcuT4FqC4vVk0Yj5RJms=" + "integrity": "sha512-o9LPoLeuPMsJsotlQ8nhdH0OQKEqew1lq3jD7uBEfPk4GKNEDVt9DIM8fbuY/BSSDg5dzYsu2XnO3IutiVjjvg==" }, "babel-plugin-transform-strict-mode": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.8.0.tgz", - "integrity": "sha1-wM5mIMtfLB+xArIPZXQRVcq8REo=" + "integrity": "sha512-nQXiqomWlfzYwxmiiSqyVo2xs73tX2V8+QyL+Arm1xtAJWsArk+LbYhIIcMrMLHcttKDt07OcbmJxRqYPSspKA==" }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==" }, "core-js": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", - "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=" + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "regenerator-runtime": { "version": "0.11.1", @@ -64,7 +64,7 @@ "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==" }, "vue-template-compiler": { "version": "2.5.16", diff --git a/tools/tests/apps/modules/packages/modules-test-plugin/.npm/plugin/compile-arson/npm-shrinkwrap.json b/tools/tests/apps/modules/packages/modules-test-plugin/.npm/plugin/compile-arson/npm-shrinkwrap.json index ec85e9fa6be..e9d01afb24a 100644 --- a/tools/tests/apps/modules/packages/modules-test-plugin/.npm/plugin/compile-arson/npm-shrinkwrap.json +++ b/tools/tests/apps/modules/packages/modules-test-plugin/.npm/plugin/compile-arson/npm-shrinkwrap.json @@ -1,45 +1,45 @@ { - "lockfileVersion": 1, + "lockfileVersion": 4, "dependencies": { "babel-plugin-syntax-class-properties": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + "integrity": "sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==" }, "babel-plugin-transform-class-properties": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.9.0.tgz", - "integrity": "sha1-DxgxuPeNcuT4FqC4vVk0Yj5RJms=" + "integrity": "sha512-o9LPoLeuPMsJsotlQ8nhdH0OQKEqew1lq3jD7uBEfPk4GKNEDVt9DIM8fbuY/BSSDg5dzYsu2XnO3IutiVjjvg==" }, "babel-plugin-transform-strict-mode": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.8.0.tgz", - "integrity": "sha1-wM5mIMtfLB+xArIPZXQRVcq8REo=" + "integrity": "sha512-nQXiqomWlfzYwxmiiSqyVo2xs73tX2V8+QyL+Arm1xtAJWsArk+LbYhIIcMrMLHcttKDt07OcbmJxRqYPSspKA==" }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==" }, "core-js": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", - "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "regenerator-runtime": { "version": "0.11.1", @@ -49,7 +49,7 @@ "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==" }, "ts-invariant": { "version": "0.4.1", @@ -57,9 +57,9 @@ "integrity": "sha512-fdL8AZinDiVKMsOI0cOWHLprS85LWy2p/eVSctVe6fpZF9BAvO59sQYMEWQ37yybBtlKU2zkmILYmy1jrOf6+g==" }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" } } } diff --git a/tools/tests/apps/modules/tests.js b/tools/tests/apps/modules/tests.js index 2c91a9e8cc6..0ede5cc8eef 100644 --- a/tools/tests/apps/modules/tests.js +++ b/tools/tests/apps/modules/tests.js @@ -99,11 +99,6 @@ describe("app modules", () => { } }); - it("should not be parsed in strictMode", () => { - let foo = 1234; - delete foo; - }); - it("should have access to filename and dirname", () => { assert.strictEqual(require(__filename), exports); assert.strictEqual( diff --git a/tools/tests/apps/shell/package.json b/tools/tests/apps/shell/package.json index b09da53f1b1..2989be6c5dc 100644 --- a/tools/tests/apps/shell/package.json +++ b/tools/tests/apps/shell/package.json @@ -5,7 +5,7 @@ "start": "meteor run" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7" } } diff --git a/tools/tests/apps/standard-app/package.json b/tools/tests/apps/standard-app/package.json index c84d4f932ee..ea048dd5e32 100644 --- a/tools/tests/apps/standard-app/package.json +++ b/tools/tests/apps/standard-app/package.json @@ -8,8 +8,8 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.15.3", - "meteor-node-stubs": "^1.2.1" + "@babel/runtime": "^7.23.5", + "meteor-node-stubs": "^1.2.7" }, "meteor": { "mainModule": false, diff --git a/tools/tests/apps/unicode-asset-app/index.js b/tools/tests/apps/unicode-asset-app/index.js index 8f90a41eea5..cc0f734a794 100644 --- a/tools/tests/apps/unicode-asset-app/index.js +++ b/tools/tests/apps/unicode-asset-app/index.js @@ -13,7 +13,7 @@ let index = 0; for (const filename of filenames) { - console.log(`${++index} - getText: ${await Assets.getText(filename)}`); + console.log(`${++index} - getText: ${await Assets.getTextAsync(filename)}`); } filenames.forEach((filename, index) => { diff --git a/tools/tests/cordova-hcp.js b/tools/tests/cordova-hcp.js index 355bbd13633..a4a73b6d6f0 100644 --- a/tools/tests/cordova-hcp.js +++ b/tools/tests/cordova-hcp.js @@ -88,3 +88,67 @@ selftest.define( await run.stop(); }); + +selftest.define( + "cordova plugin cordova-plugin-meteor-webapp should download manifest file for hot code push with subdirectory, and with trailing forward slash in server url and ROOT_URL", ["cordova", "slow"], function () { + var s = new Sandbox(); + var run; + + var ipAddress = testUtils.getPrivateIPAddress(); + + //url with subdirectory + s.set("ROOT_URL", `http://${ipAddress}:3000/app/`); + s.createApp("myapp", "hot-code-push-test"); + s.cd("myapp"); + + // Add 'android' to the .meteor/platforms file, just so that the + // Cordova boilerplate will be generated and served, without having + // to download the whole Android sdk. + var platforms = s.read(".meteor/platforms"); + s.write(".meteor/platforms", platforms + "\nandroid\n"); + + run = s.run("run", "android", "--mobile-server", `http://${ipAddress}:3000/app/`); + run.waitSecs(30); + run.match("Started your app"); + + //add new file to client side to trigger cordova app to check for new update + let randomString = (Math.random() + 1).toString(36).substring(7); + s.mkdir("client"); + s.write("client/test.js", `xyzVar = '${randomString}'`); + run.match("Client modified -- refreshing"); + //android should download manifest file from correct url and switch to new version of app + run.match("hot code push result: app updated to new version"); + run.stop(); +}); + +selftest.define( + "cordova plugin cordova-plugin-meteor-webapp should download manifest file for hot code push with subdirectory, and without trailing forward slash in server url and ROOT_URL", ["cordova", "slow"], function () { + var s = new Sandbox(); + var run; + + var ipAddress = testUtils.getPrivateIPAddress(); + + //url with subdirectory + s.set("ROOT_URL", `http://${ipAddress}:3000/app`); + s.createApp("myapp", "hot-code-push-test"); + s.cd("myapp"); + + // Add 'android' to the .meteor/platforms file, just so that the + // Cordova boilerplate will be generated and served, without having + // to download the whole Android sdk. + var platforms = s.read(".meteor/platforms"); + s.write(".meteor/platforms", platforms + "\nandroid\n"); + + run = s.run("run", "android", "--mobile-server", `http://${ipAddress}:3000/app`); + run.waitSecs(30); + run.match("Started your app"); + + //add new file to client side to trigger cordova app to check for new update + let randomString = (Math.random() + 1).toString(36).substring(7); + s.mkdir("client"); + s.write("client/test.js", `xyzVar = '${randomString}'`); + run.match("Client modified -- refreshing"); + //android should download manifest file from correct url and switch to new version of app + run.match("hot code push result: app updated to new version"); + run.stop(); +}); \ No newline at end of file diff --git a/tools/tests/top-level-await.js b/tools/tests/top-level-await.js index b2deb6ca118..991e1c1ed66 100644 --- a/tools/tests/top-level-await.js +++ b/tools/tests/top-level-await.js @@ -24,17 +24,17 @@ selftest.define("xxxx top level await - order", async function (options) { const lines = [ 'package sync', 'package 1 - b before', - 'package 2 - b', - 'package 2 - a before', 'package sync - later', 'package 1 - b after', - 'package 2 - b later', - 'package 2 - a after', 'package 1 - b later', 'package 1 - a before', - 'package 2 - a later', 'package 1 - a after', 'package 1 - a later', + 'package 2 - b', + 'package 2 - a before', + 'package 2 - b later', + 'package 2 - a after', + 'package 2 - a later', 'app a.js - before', 'app b.js - before', 'app a.js - after', diff --git a/tools/tests/update-tests.js b/tools/tests/update-tests.js index d7d8fd12c13..28a5f7e75e7 100644 --- a/tools/tests/update-tests.js +++ b/tools/tests/update-tests.js @@ -72,7 +72,7 @@ selftest.define("'meteor update' updates indirect dependencies with patches", as var update = s.run("update"); // we have direct-dependency@=1.0.0, which depends on indirect@1.0.0 // we should update to 1.0.1 (only take patches to indirect dependencies) - update.match(/indirect-dependency.*1.0.1/); + await update.match(/indirect-dependency.*1.0.1/); await update.expectExit(0); }); diff --git a/tools/tool-testing/run.js b/tools/tool-testing/run.js index 62f52c4cd75..e5d2f6e6766 100644 --- a/tools/tool-testing/run.js +++ b/tools/tool-testing/run.js @@ -143,6 +143,7 @@ export default class Run { this._args, { cwd: files.convertToOSPath(this.cwd), env, + ...process.platform === 'win32' && { shell: true }, }); this.proc.on('close', (code, signal) => { diff --git a/tools/tool-testing/test-utils.js b/tools/tool-testing/test-utils.js index fe5529fe19a..58c6a9c91d9 100644 --- a/tools/tool-testing/test-utils.js +++ b/tools/tool-testing/test-utils.js @@ -4,6 +4,7 @@ import { withAccountsConnection } from '../meteor-services/auth.js'; import { fail, markStack } from './selftest.js'; import { request } from '../utils/http-helpers.js'; import { loadIsopackage } from '../tool-env/isopackets.js'; +import { networkInterfaces } from 'os'; export function randomString(charsCount) { var chars = 'abcdefghijklmnopqrstuvwxyz'; @@ -122,3 +123,23 @@ export function markThrowingMethods(prototype) { } }); } + +export function getPrivateIPAddress() { + const nets = networkInterfaces(); + let localIp = ""; + Object.keys(nets).some((name)=> { + let ret = false; + for (const net of nets[name]) { + // Skip over non-IPv4, bridge and internal (i.e. 127.0.0.1) addresses + // 'IPv4' is in Node <= 17, from 18 it's a number 4 or 6 + const familyV4Value = typeof net.family === 'string' ? 'IPv4' : 4 + if ((net.family === familyV4Value && !net.internal) && !name.startsWith('br')) { + localIp = net.address; + ret = true; + break; + } + } + return ret; + }) + return localIp +} \ No newline at end of file diff --git a/tools/utils/archinfo.ts b/tools/utils/archinfo.ts index d05b8a19b68..18c7c3177e2 100644 --- a/tools/utils/archinfo.ts +++ b/tools/utils/archinfo.ts @@ -132,6 +132,7 @@ export const VALID_ARCHITECTURES: Record = { "os.osx.arm64": true, "os.linux.x86_64": true, "os.windows.x86_64": true, + "os.linux.aarch64": true, }; // Returns the fully qualified arch of this host -- something like @@ -173,6 +174,8 @@ export function host() { const machine = run('uname', '-m'); if (["x86_64", "amd64", "ia64"].includes(machine)) { _host = "os.linux.x86_64"; + } else if(machine === "aarch64") { + _host = "os.linux.aarch64"; } else { throw new Error(`Unsupported architecture: ${machine}`); } diff --git a/tools/utils/buildmessage.js b/tools/utils/buildmessage.js index 18b7f1459ab..fe66c19741d 100644 --- a/tools/utils/buildmessage.js +++ b/tools/utils/buildmessage.js @@ -448,7 +448,7 @@ var markBoundary = function (f, context) { // If this is a number instead of 'true', skips that many stack frames. // - downcase: if true, the first character of `message` will be // converted to lower case. -// - secondary: ignore this error if there are are already other +// - secondary: ignore this error if there are already other // errors in this job (the implication is that it's probably // downstream of the other error, ie, a consequence of our attempt // to continue past other errors) diff --git a/tools/utils/processes.ts b/tools/utils/processes.ts index 4d18ad766ad..881302d872d 100644 --- a/tools/utils/processes.ts +++ b/tools/utils/processes.ts @@ -107,7 +107,7 @@ export function execFileAsync( spawnArgs.forEach(arg => { command += ' ' + arg; }); - child = child_process.exec(command, { cwd, env }); + child = child_process.spawn(command, { cwd, env, shell: true }); } let capturedStdout = ''; diff --git a/v3-docs/docs/.gitignore b/v3-docs/docs/.gitignore new file mode 100644 index 00000000000..bcd2cabb669 --- /dev/null +++ b/v3-docs/docs/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/.vitepress/cache +/.vitepress/dist + +/data/data.js +/data/names.json \ No newline at end of file diff --git a/v3-docs/docs/.vitepress/config.mts b/v3-docs/docs/.vitepress/config.mts new file mode 100644 index 00000000000..6a52d92d2aa --- /dev/null +++ b/v3-docs/docs/.vitepress/config.mts @@ -0,0 +1,302 @@ +import { defineConfig } from "vitepress"; + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "Meteor Docs", + description: "Meteor.js API Docs", + head: [["link", { rel: "icon", href: "/logo.png" }]], + lastUpdated: true, + sitemap: { + hostname: "https://v3-docs.meteor.com", + }, + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + nav: [ + { text: "Deploy", link: "https://www.meteor.com/cloud" }, + { + text: "Tutorials", + link: "https://www.meteor.com/developers/tutorials", + }, + { text: "Forums", link: "https://forums.meteor.com/" }, + ], + sidebar: [ + { + text: "About", + items: [ + { + text: "What is Meteor?", + link: "/about/what-is#what-is-meteor", + }, + { + text: "Meteor resources", + link: "/about/what-is#learning-more", + }, + { + text: "Roadmap", + link: "/about/roadmap", + }, + ], + collapsed: true, + }, + { + text: "Quick Start", + items: [ + { + text: "Install Meteor", + link: "/about/install", + }, + // TODO: Your first app meteor app + ], + collapsed: true, + }, + { + text: "API", + link: "/api/index", + items: [ + { + text: "Accounts", + link: "/api/accounts", + items: [ + { text: "Accounts-Base", link: "/api/accounts#accounts-base" }, + { text: "Multi-server", link: "/api/accounts#multi-server" }, + { text: "Passwords", link: "/api/accounts#passwords" }, + ], + collapsed: true, + }, + { + text: "Meteor", + link: "/api/meteor", + items: [ + { text: "Core", link: "/api/meteor#core" }, + { text: "Methods", link: "/api/meteor#methods" }, + { text: "Publish and Subscribe", link: "/api/meteor#pubsub" }, + { text: "Server connections", link: "/api/meteor#connections" }, + { text: "Timers", link: "/api/meteor#timers" }, + ], + }, + { + text: "Collections", + link: "/api/collections", + }, + { + text: "DDPRateLimiter", + link: "/api/DDPRateLimiter", + }, + { + text: "Check", + link: "/api/check", + }, + { + text: "Session", + link: "/api/session", + }, + { + text: "Blaze", + link: "/api/blaze", + }, + { + text: "Templates", + link: "/api/templates", + }, + { + text: "Email", + link: "/api/email", + }, + { + text: "Tracker", + link: "/api/Tracker", + }, + { + text: "Reactive Var", + link: "/api/ReactiveVar", + }, + { + text: "Reactive Dict", + link: "/api/ReactiveDict", + }, + { + text: "EJSON", + link: "/api/EJSON", + }, + { + text: "Assets", + link: "/api/assets", + }, + { + text: "Mobile Configuration", + link: "/api/app", + }, + { + text: "Package.js", + link: "/api/package", + }, + ], + collapsed: false, + }, + { + text: "Packages", + items: [ + { + text: "accounts-ui", + link: "/packages/accounts-ui", + }, + { + text: "accounts-passwordless", + link: "/packages/accounts-passwordless", + }, + { + text: "accounts-2fa", + link: "/packages/accounts-2fa", + }, + { + text: "appcache", + link: "/packages/appcache", + }, + { + text: "audit-arguments-checks", + link: "/packages/audit-argument-checks", + }, + { + text: "autoupdate", + link: "/packages/autoupdate", + }, + { + text: "browser-policy", + link: "/packages/browser-policy", + }, + { + text: "bundler-visualizer", + link: "/packages/bundle-visualizer", + }, + { + text: "coffeescript", + link: "/packages/coffeescript", + }, + { + text: "ecmascript", + link: "/packages/ecmascript", + }, + { + text: "fetch", + link: "/packages/fetch", + }, + { + text: "hot-module-replacement", + link: "/packages/hot-module-replacement", + }, + { + text: "less", + link: "/packages/less", + }, + { + text: "logging", + link: "/packages/logging", + }, + { + text: "markdown", + link: "/packages/markdown", + }, + { + text: "modules", + link: "/packages/modules", + }, + { + text: "oauth-encryption", + link: "/packages/oauth-encryption", + }, + { + text: "random", + link: "/packages/random", + }, + { + text: "server-render", + link: "/packages/server-render", + }, + { + text: "standard-minifier-css", + link: "/packages/standard-minifier-css", + }, + { + text: "underscore", + link: "/packages/underscore", + }, + { + text: "url", + link: "/packages/url", + }, + { + text: "webapp", + link: "/packages/webapp", + }, + { + link: "packages/packages-listing", + text: "Maintained Packages", + }, + ], + collapsed: true, + }, + { + text: "Troubleshooting", + items: [ + { + text: "Expired Certificates", + link: "/troubleshooting/expired-certificate", + }, + { text: "Windows", link: "/troubleshooting/windows" }, + { + text: "Known issues in 2.13", + link: "/troubleshooting/known-issues", + }, + ], + collapsed: true, + }, + { + text: "Command Line", + items: [ + { link: "cli/index", text: "CLI" }, + { link: "cli/using-core-types", text: "Using Core Types" }, + { link: "cli/environment-variables", text: "Environment Variables" }, + ], + collapsed: true, + }, + { + text: "Changelog", + items: [ + // TODO: Open issue in Vitepress about this + { link: "/history", text: "Current" }, + { + link: "https://docs.meteor.com/changelog#v2020210120", + text: "Pre-2.0", + }, + ], + collapsed: true, + }, + ], + + socialLinks: [{ icon: "github", link: "https://github.com/meteor/meteor" }], + logo: { dark: "/meteor-logo.png", light: "/meteor-blue.png" }, + + search: { + provider: 'algolia', + options: { + appId: '2RBX3PR26I', + apiKey: '7fcba92008b84946f04369df2afa1744', + indexName: 'meteor_docs_v3', + searchParameters: { + facetFilters: ["lang:en"], + }, + } + }, + + footer: { + message: + 'Released under the MIT License.', + copyright: + 'Copyright (c) 2011 - present Meteor Software.', + }, + editLink: { + pattern: "https://github.com/meteor/meteor/edit/main/v3-docs/docs/:path", + text: "Edit this page on GitHub", + }, + }, +}); diff --git a/v3-docs/docs/.vitepress/theme/Layout.vue b/v3-docs/docs/.vitepress/theme/Layout.vue new file mode 100644 index 00000000000..67036ae37ee --- /dev/null +++ b/v3-docs/docs/.vitepress/theme/Layout.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/v3-docs/docs/.vitepress/theme/index.ts b/v3-docs/docs/.vitepress/theme/index.ts new file mode 100644 index 00000000000..afddc3f9606 --- /dev/null +++ b/v3-docs/docs/.vitepress/theme/index.ts @@ -0,0 +1,17 @@ +// .vitepress/theme/index.ts +import type { Theme } from "vitepress"; +import DefaultTheme from "vitepress/theme"; +import ApiBox from "../../components/ApiBox.vue"; +import ApiMap from "../../components/ApiMap.vue"; +import Layout from "./Layout.vue"; +import "./theme.css"; + +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + // register your custom global components + app.component("ApiBox", ApiBox); + app.component("ApiMap", ApiMap); + }, + Layout, +} satisfies Theme; diff --git a/v3-docs/docs/.vitepress/theme/redirects/redirects.json b/v3-docs/docs/.vitepress/theme/redirects/redirects.json new file mode 100644 index 00000000000..f6dc86f3819 --- /dev/null +++ b/v3-docs/docs/.vitepress/theme/redirects/redirects.json @@ -0,0 +1,4 @@ +{ + "meteor_call": "meteor-call", + "ddp_connect": "DDP-connect" +} diff --git a/v3-docs/docs/.vitepress/theme/redirects/script.js b/v3-docs/docs/.vitepress/theme/redirects/script.js new file mode 100644 index 00000000000..0e7268824c9 --- /dev/null +++ b/v3-docs/docs/.vitepress/theme/redirects/script.js @@ -0,0 +1,18 @@ +// import json from './redirects.json'; +/** + * + * @param {string} path + */ +export const redirect = (path) => { + let shouldRedirect = false; + console.log(path) + if (path.includes("_")) { + shouldRedirect = true; + path = path.replace("_", "-"); + } + + return { + path, + shouldRedirect + }; +}; diff --git a/v3-docs/docs/.vitepress/theme/theme.css b/v3-docs/docs/.vitepress/theme/theme.css new file mode 100644 index 00000000000..9b35d1dafcd --- /dev/null +++ b/v3-docs/docs/.vitepress/theme/theme.css @@ -0,0 +1,559 @@ +/** + * Colors: Solid + * -------------------------------------------------------------------------- */ + + :root { + --vp-c-white: #ffffff; + --vp-c-black: #000000; + + --vp-c-neutral: var(--vp-c-black); + --vp-c-neutral-inverse: var(--vp-c-white); +} + +.dark { + --vp-c-neutral: var(--vp-c-white); + --vp-c-neutral-inverse: var(--vp-c-black); +} + +/** + * Colors: Palette + * + * The primitive colors used for accent colors. These colors are referenced + * by functional colors such as "Text", "Background", or "Brand". + * + * Each colors have exact same color scale system with 3 levels of solid + * colors with different brightness, and 1 soft color. + * + * - `XXX-1`: The most solid color used mainly for colored text. It must + * satisfy the contrast ratio against when used on top of `XXX-soft`. + * + * - `XXX-2`: The color used mainly for hover state of the button. + * + * - `XXX-3`: The color for solid background, such as bg color of the button. + * It must satisfy the contrast ratio with pure white (#ffffff) text on + * top of it. + * + * - `XXX-soft`: The color used for subtle background such as custom container + * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors + * on top of it. + * + * The soft color must be semi transparent alpha channel. This is crucial + * because it allows adding multiple "soft" colors on top of each other + * to create a accent, such as when having inline code block inside + * custom containers. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-gray-1: #dddde3; + --vp-c-gray-2: #e4e4e9; + --vp-c-gray-3: #ebebef; + --vp-c-gray-soft: rgba(142, 150, 170, 0.14); + + --vp-c-indigo-1: #3451b2; + --vp-c-indigo-2: #3a5ccc; + --vp-c-indigo-3: #5672cd; + --vp-c-indigo-soft: rgba(100, 108, 255, 0.14); + + --vp-c-blue-1: #383695; + --vp-c-blue-2: #3e3e9e; + --vp-c-blue-3: #4c4ca7; + --vp-c-blue-soft: rgba(100, 108, 255, 0.14); + + --vp-c-green-1: #18794e; + --vp-c-green-2: #299764; + --vp-c-green-3: #30a46c; + --vp-c-green-soft: rgba(16, 185, 129, 0.14); + + --vp-c-orange-1: #FF6A3E; + --vp-c-orange-2: #FF7A4D; + --vp-c-orange-3: #FF8A5C; + --vp-c-orange-soft: rgba(255, 106, 62, 0.14); + + --vp-c-meteor-red-1: #BF212E; + --vp-c-meteor-red-2: #A01A24; + --vp-c-meteor-red-3: #7F141D; + --vp-c-meteor-red-soft: rgba(191, 33, 46, 0.16); + + --vp-c-yellow-1: #915930; + --vp-c-yellow-2: #946300; + --vp-c-yellow-3: #9f6a00; + --vp-c-yellow-soft: rgba(234, 179, 8, 0.14); + + --vp-c-red-1: #b8272c; + --vp-c-red-2: #d5393e; + --vp-c-red-3: #e0575b; + --vp-c-red-soft: rgba(244, 63, 94, 0.14); + + --vp-c-sponsor: #db2777; +} + +.dark { + --vp-c-gray-1: #515c67; + --vp-c-gray-2: #414853; + --vp-c-gray-3: #32363f; + --vp-c-gray-soft: rgba(101, 117, 133, 0.16); + + --vp-c-indigo-1: #a8b1ff; + --vp-c-indigo-2: #5c73e7; + --vp-c-indigo-3: #3e63dd; + --vp-c-indigo-soft: rgba(100, 108, 255, 0.16); + + --vp-c-blue-1: #4b6cb7; + --vp-c-blue-2: #3e4f8c; + --vp-c-blue-3: #36436b; + --vp-c-blue-soft: rgba(100, 108, 255, 0.16); + + --vp-c-green-1: #3dd68c; + --vp-c-green-2: #30a46c; + --vp-c-green-3: #298459; + --vp-c-green-soft: rgba(16, 185, 129, 0.16); + + --vc-c-orange-1: #ff7e17; + --vc-c-orange-2: #e66c00; + --vc-c-orange-3: #b35e00; + --vc-c-orange-soft: rgba(255, 126, 23, 0.16); + + --vc-c-meteor-red-1: #BF212E; + --vc-c-meteor-red-2: #A01A24; + --vc-c-meteor-red-3: #7F141D; + --vc-c-meteor-red-soft: rgba(191, 33, 46, 0.16); + + --vp-c-yellow-1: #f9b44e; + --vp-c-yellow-2: #da8b17; + --vp-c-yellow-3: #a46a0a; + --vp-c-yellow-soft: rgba(234, 179, 8, 0.16); + + --vp-c-red-1: #f66f81; + --vp-c-red-2: #f14158; + --vp-c-red-3: #b62a3c; + --vp-c-red-soft: rgba(244, 63, 94, 0.16); +} + +/** + * Colors: Background + * + * - `bg`: The bg color used for main screen. + * + * - `bg-alt`: The alternative bg color used in places such as "sidebar", + * or "code block". + * + * - `bg-elv`: The elevated bg color. This is used at parts where it "floats", + * such as "dialog". + * + * - `bg-soft`: The bg color to slightly distinguish some components from + * the page. Used for things like "carbon ads" or "table". + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-bg: #ffffff; + --vp-c-bg-alt: #f6f6f7; + --vp-c-bg-elv: #ffffff; + --vp-c-bg-soft: #f6f6f7; +} + +.dark { + + --vp-c-bg: #101926; + --vp-c-bg-alt: #0a0f1f; + --vp-c-bg-elv: #101926; + --vp-c-bg-soft: #0a0f1f; +} + +/** + * Colors: Borders + * + * - `divider`: This is used for separators. This is used to divide sections + * within the same components, such as having separator on "h2" heading. + * + * - `border`: This is designed for borders on interactive components. + * For example this should be used for a button outline. + * + * - `gutter`: This is used to divide components in the page. For example + * the header and the lest of the page. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-border: #c2c2c4; + --vp-c-divider: #e2e2e3; + --vp-c-gutter: #e2e2e3; +} + +.dark { + --vp-c-border: #3c3f44; + --vp-c-divider: #2e2e32; + --vp-c-gutter: #000000; +} + +/** + * Colors: Text + * + * - `text-1`: Used for primary text. + * + * - `text-2`: Used for muted texts, such as "inactive menu" or "info texts". + * + * - `text-3`: Used for subtle texts, such as "placeholders" or "caret icon". + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-text-1: rgba(60, 60, 67); + --vp-c-text-2: rgba(60, 60, 67, 0.78); + --vp-c-text-3: rgba(60, 60, 67, 0.56); +} + +.dark { + --vp-c-text-1: rgba(255, 255, 245, 0.86); + --vp-c-text-2: rgba(235, 235, 245, 0.6); + --vp-c-text-3: rgba(235, 235, 245, 0.38); +} + +/** + * Colors: Function + * + * - `default`: The color used purely for subtle indication without any + * special meanings attached to it such as bg color for menu hover state. + * + * - `brand`: Used for primary brand colors, such as link text, button with + * brand theme, etc. + * + * - `tip`: Used to indicate useful information. The default theme uses the + * brand color for this by default. + * + * - `warning`: Used to indicate warning to the users. Used in custom + * container, badges, etc. + * + * - `danger`: Used to show error, or dangerous message to the users. Used + * in custom container, badges, etc. + * + * To understand the scaling system, refer to "Colors: Palette" section. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-default-1: var(--vp-c-gray-1); + --vp-c-default-2: var(--vp-c-gray-2); + --vp-c-default-3: var(--vp-c-gray-3); + --vp-c-default-soft: var(--vp-c-gray-soft); + + --vp-c-brand-1: var(--vp-c-meteor-red-1); + --vp-c-brand-2: var(--vp-c-meteor-red-2); + --vp-c-brand-3: var(--vp-c-meteor-red-3); + --vp-c-brand-soft: var(--vp-c-blue-soft); + + /* DEPRECATED: Use `--vp-c-brand-1` instead. */ + --vp-c-brand: var(--vp-c-brand-1); + + --vp-c-tip-1: var(--vp-c-brand-1); + --vp-c-tip-2: var(--vp-c-brand-2); + --vp-c-tip-3: var(--vp-c-brand-3); + --vp-c-tip-soft: var(--vp-c-brand-soft); + + --vp-c-warning-1: var(--vp-c-yellow-1); + --vp-c-warning-2: var(--vp-c-yellow-2); + --vp-c-warning-3: var(--vp-c-yellow-3); + --vp-c-warning-soft: var(--vp-c-yellow-soft); + + --vp-c-danger-1: var(--vp-c-red-1); + --vp-c-danger-2: var(--vp-c-red-2); + --vp-c-danger-3: var(--vp-c-red-3); + --vp-c-danger-soft: var(--vp-c-red-soft); +} + +/** + * Typography + * -------------------------------------------------------------------------- */ + +:root { + --vp-font-family-base: 'Chinese Quotes', 'Inter var', 'Inter', ui-sans-serif, + system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + 'Helvetica Neue', Helvetica, Arial, 'Noto Sans', sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --vp-font-family-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, + Consolas, 'Liberation Mono', 'Courier New', monospace; +} + +/** + * Shadows + * -------------------------------------------------------------------------- */ + +:root { + --vp-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.06); + --vp-shadow-2: 0 3px 12px rgba(0, 0, 0, 0.07), 0 1px 4px rgba(0, 0, 0, 0.07); + --vp-shadow-3: 0 12px 32px rgba(0, 0, 0, 0.1), 0 2px 6px rgba(0, 0, 0, 0.08); + --vp-shadow-4: 0 14px 44px rgba(0, 0, 0, 0.12), 0 3px 9px rgba(0, 0, 0, 0.12); + --vp-shadow-5: 0 18px 56px rgba(0, 0, 0, 0.16), 0 4px 12px rgba(0, 0, 0, 0.16); +} + +/** + * Z-indexes + * -------------------------------------------------------------------------- */ + +:root { + --vp-z-index-footer: 10; + --vp-z-index-local-nav: 20; + --vp-z-index-nav: 30; + --vp-z-index-layout-top: 40; + --vp-z-index-backdrop: 50; + --vp-z-index-sidebar: 60; +} + +/** + * Icons + * -------------------------------------------------------------------------- */ + +:root { + --vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E"); + --vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E"); +} + +/** + * Layouts + * -------------------------------------------------------------------------- */ + +:root { + --vp-layout-max-width: 1440px; +} + +/** + * Component: Header Anchor + * -------------------------------------------------------------------------- */ + +:root { + --vp-header-anchor-symbol: '#'; +} + +/** + * Component: Code + * -------------------------------------------------------------------------- */ + +:root { + --vp-code-line-height: 1.7; + --vp-code-font-size: 0.875em; + --vp-code-color: var(--vp-c-brand-1); + --vp-code-link-color: var(--vp-c-brand-1); + --vp-code-link-hover-color: var(--vp-c-brand-2); + --vp-code-bg: var(--vp-c-default-soft); + + --vp-code-block-color: var(--vp-c-text-2); + --vp-code-block-bg: var(--vp-c-bg-alt); + --vp-code-block-divider-color: var(--vp-c-gutter); + + --vp-code-lang-color: var(--vp-c-text-3); + + --vp-code-line-highlight-color: var(--vp-c-default-soft); + --vp-code-line-number-color: var(--vp-c-text-3); + + --vp-code-line-diff-add-color: var(--vp-c-green-soft); + --vp-code-line-diff-add-symbol-color: var(--vp-c-green-1); + + --vp-code-line-diff-remove-color: var(--vp-c-red-soft); + --vp-code-line-diff-remove-symbol-color: var(--vp-c-red-1); + + --vp-code-line-warning-color: var(--vp-c-yellow-soft); + --vp-code-line-error-color: var(--vp-c-red-soft); + + --vp-code-copy-code-border-color: var(--vp-c-divider); + --vp-code-copy-code-bg: var(--vp-c-bg-soft); + --vp-code-copy-code-hover-border-color: var(--vp-c-divider); + --vp-code-copy-code-hover-bg: var(--vp-c-bg); + --vp-code-copy-code-active-text: var(--vp-c-text-2); + --vp-code-copy-copied-text-content: 'Copied'; + + --vp-code-tab-divider: var(--vp-code-block-divider-color); + --vp-code-tab-text-color: var(--vp-c-text-2); + --vp-code-tab-bg: var(--vp-code-block-bg); + --vp-code-tab-hover-text-color: var(--vp-c-text-1); + --vp-code-tab-active-text-color: var(--vp-c-text-1); + --vp-code-tab-active-bar-color: var(--vp-c-brand-1); +} + +/** + * Component: Button + * -------------------------------------------------------------------------- */ + +:root { + --vp-button-brand-border: transparent; + --vp-button-brand-text: var(--vp-c-white); + --vp-button-brand-bg: var(--vp-c-blue-3); + --vp-button-brand-hover-border: transparent; + --vp-button-brand-hover-text: var(--vp-c-white); + --vp-button-brand-hover-bg: var(--vp-c-blue-2); + --vp-button-brand-active-border: transparent; + --vp-button-brand-active-text: var(--vp-c-white); + --vp-button-brand-active-bg: var(--vp-c-blue-1); + + --vp-button-alt-border: transparent; + --vp-button-alt-text: var(--vp-c-text-1); + --vp-button-alt-bg: var(--vp-c-default-3); + --vp-button-alt-hover-border: transparent; + --vp-button-alt-hover-text: var(--vp-c-text-1); + --vp-button-alt-hover-bg: var(--vp-c-default-2); + --vp-button-alt-active-border: transparent; + --vp-button-alt-active-text: var(--vp-c-text-1); + --vp-button-alt-active-bg: var(--vp-c-default-1); + + --vp-button-sponsor-border: var(--vp-c-text-2); + --vp-button-sponsor-text: var(--vp-c-text-2); + --vp-button-sponsor-bg: transparent; + --vp-button-sponsor-hover-border: var(--vp-c-sponsor); + --vp-button-sponsor-hover-text: var(--vp-c-sponsor); + --vp-button-sponsor-hover-bg: transparent; + --vp-button-sponsor-active-border: var(--vp-c-sponsor); + --vp-button-sponsor-active-text: var(--vp-c-sponsor); + --vp-button-sponsor-active-bg: transparent; +} + +/** + * Component: Custom Block + * -------------------------------------------------------------------------- */ + +:root { + --vp-custom-block-font-size: 14px; + --vp-custom-block-code-font-size: 13px; + + --vp-custom-block-info-border: transparent; + --vp-custom-block-info-text: var(--vp-c-text-1); + --vp-custom-block-info-bg: var(--vp-c-default-soft); + --vp-custom-block-info-code-bg: var(--vp-c-default-soft); + + --vp-custom-block-tip-border: transparent; + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--vp-c-brand-soft); + --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); + + --vp-custom-block-warning-border: transparent; + --vp-custom-block-warning-text: var(--vp-c-text-1); + --vp-custom-block-warning-bg: var(--vp-c-warning-soft); + --vp-custom-block-warning-code-bg: var(--vp-c-warning-soft); + + --vp-custom-block-danger-border: transparent; + --vp-custom-block-danger-text: var(--vp-c-text-1); + --vp-custom-block-danger-bg: var(--vp-c-danger-soft); + --vp-custom-block-danger-code-bg: var(--vp-c-danger-soft); + + --vp-custom-block-details-border: var(--vp-custom-block-info-border); + --vp-custom-block-details-text: var(--vp-custom-block-info-text); + --vp-custom-block-details-bg: var(--vp-custom-block-info-bg); + --vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg); +} + +/** + * Component: Input + * -------------------------------------------------------------------------- */ + +:root { + --vp-input-border-color: var(--vp-c-border); + --vp-input-bg-color: var(--vp-c-bg-alt); + + --vp-input-switch-bg-color: var(--vp-c-gray-soft); +} + +/** + * Component: Nav + * -------------------------------------------------------------------------- */ + +:root { + --vp-nav-height: 64px; + --vp-nav-bg-color: var(--vp-c-bg); + --vp-nav-screen-bg-color: var(--vp-c-bg); + --vp-nav-logo-height: 24px; +} + +.hide-nav { + --vp-nav-height: 0px; +} + +.hide-nav .VPSidebar { + --vp-nav-height: 22px; +} + +/** + * Component: Local Nav + * -------------------------------------------------------------------------- */ + +:root { + --vp-local-nav-bg-color: var(--vp-c-bg); +} + +/** + * Component: Sidebar + * -------------------------------------------------------------------------- */ + +:root { + --vp-sidebar-width: 272px; + --vp-sidebar-bg-color: var(--vp-c-bg-alt); +} + +/** + * Colors Backdrop + * -------------------------------------------------------------------------- */ + +:root { + --vp-backdrop-bg-color: rgba(0, 0, 0, 0.6); +} + +/** + * Component: Home + * -------------------------------------------------------------------------- */ + +:root { + --vp-home-hero-name-color: var(--vp-c-brand-1); + --vp-home-hero-name-background: transparent; + + --vp-home-hero-image-background-image: none; + --vp-home-hero-image-filter: none; +} + +/** + * Component: Badge + * -------------------------------------------------------------------------- */ + +:root { + --vp-badge-info-border: transparent; + --vp-badge-info-text: var(--vp-c-text-2); + --vp-badge-info-bg: var(--vp-c-default-soft); + + --vp-badge-tip-border: transparent; + --vp-badge-tip-text: var(--vp-c-brand-1); + --vp-badge-tip-bg: var(--vp-c-brand-soft); + + --vp-badge-warning-border: transparent; + --vp-badge-warning-text: var(--vp-c-warning-1); + --vp-badge-warning-bg: var(--vp-c-warning-soft); + + --vp-badge-danger-border: transparent; + --vp-badge-danger-text: var(--vp-c-danger-1); + --vp-badge-danger-bg: var(--vp-c-danger-soft); +} + +/** + * Component: Carbon Ads + * -------------------------------------------------------------------------- */ + +:root { + --vp-carbon-ads-text-color: var(--vp-c-text-1); + --vp-carbon-ads-poweredby-color: var(--vp-c-text-2); + --vp-carbon-ads-bg-color: var(--vp-c-bg-soft); + --vp-carbon-ads-hover-text-color: var(--vp-c-brand-1); + --vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1); +} + +/** + * Component: Local Search + * -------------------------------------------------------------------------- */ + +:root { + --vp-local-search-bg: var(--vp-c-bg); + --vp-local-search-result-bg: var(--vp-c-bg); + --vp-local-search-result-border: var(--vp-c-divider); + --vp-local-search-result-selected-bg: var(--vp-c-bg); + --vp-local-search-result-selected-border: var(--vp-c-brand-1); + --vp-local-search-highlight-bg: var(--vp-c-brand-1); + --vp-local-search-highlight-text: var(--vp-c-neutral-inverse); +} + +::selection { + background: var(--vp-c-brand-soft); +} + +:root { + --vp-z-index-nav: 100; +} diff --git a/v3-docs/docs/about/install.md b/v3-docs/docs/about/install.md new file mode 100644 index 00000000000..7d706fe59b1 --- /dev/null +++ b/v3-docs/docs/about/install.md @@ -0,0 +1,141 @@ + +# Install + +You need to install the Meteor command line tool to create, run, and manage your Meteor.js projects. Check the prerequisites and follow the installation process below. + + +## Prerequisites {#prereqs} + + +### Operating System (OS) {#prereqs-os} + +- Meteor currently supports **OS X, Windows, and Linux**. Only 64-bit is supported. +- Meteor supports Windows 7 / Windows Server 2008 R2 and up. +- Apple M1 is natively supported from Meteor 2.5.1 onward (for older versions, rosetta terminal is required). +- If you are on a Mac M1 (Arm64 version) you need to have Rosetta 2 installed, as Meteor uses it for running MongoDB. Check how to install it [here](https://osxdaily.com/2020/12/04/how-install-rosetta-2-apple-silicon-mac/). +- Disabling antivirus (Windows Defender, etc.) will improve performance. +- For compatibility, Linux binaries are built with CentOS 6.4 i386/amd64. + + +### Mobile Development {#prereqs-mobile} + +- iOS development requires the latest Xcode. + + +## Installation + +Install the latest official version of Meteor.js from your terminal by running one of the commands below. You can check our [changelog](https://v3-docs.meteor.com/history.html) for the release notes. + +For Windows, Linux and OS X, you can run the following command: + +```bash +npx meteor@rc +``` + +::: tip + +If you get an error with the installation `npx` you can try running `npx clear-npx-cache` + +or `rm -rf ~/.npm/_npx` + +if the error persists, please try to install Meteor using `npm`: + +```bash +npm install -g meteor --foreground-script +``` + +Make sure you have Node.js v20 or higher installed. + +::: + +An alternative for Linux and OS X, is to install Meteor by using curl: + +```bash +curl https://install.meteor.com/ | sh +``` + +You can also install a specific Meteor.js version by using curl: + +```bash +curl https://install.meteor.com/\?release\=2.8 | sh +``` + +> Do not install the npm Meteor Tool in your project's package.json. This library is just an installer. + + +## Troubleshooting {#troubleshooting} + +If your user doesn't have permission to install global binaries, and you need to use sudo, it's necessary to append *--unsafe-perm* to the above command: + +```bash +sudo npm install -g meteor --unsafe-perm +``` + +We strongly discourage the usage of Node.js or Meteor with root permissions. +Only run the above command with sudo if you know what you are doing. + +If you only use sudo because of a distribution default permission system, [check this link for fixing it](https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally). + +In some cases you can get this error `npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules` because your Node.js installation was performed with wrong permissions. An easy way to fix this is to install Node.js using [nvm](https://github.com/nvm-sh/nvm) and forcing it to be used in your terminal. You can force it in the current session of your terminal by running `nvm use 14`. + + +## PATH management {#path-management} + +By default, the Meteor installer adds its install path (by default, `~/.meteor/`) to your PATH by updating either your `.bashrc`, `.bash_profile`, or `.zshrc` as appropriate. To disable this behavior, install Meteor by running: + +```bash +npm install -g meteor --ignore-meteor-setup-exec-path --foreground-script +``` + + + +(or by setting the environment variable `npm_config_ignore_meteor_setup_exec_path=true`) + + +## Old Versions on Apple M1 {#old-versions-m1} + +For Apple M1 computers, you can append Rosetta prefix as following, if you need to run older versions of Meteor (before 2.5.1): + +```bash +arch -x86_64 npm install -g meteor +``` + +or select Terminal in the Applications folder, press CMD(⌘)+I and check the "Open using Rosetta" option. + + +## Meteor Docker image {#meteor-docker} + +You can also use a Docker container for running Meteor inside your CI, or even in your local development toolchain. + +We do provide the meteor/meteor-base ubuntu-based Docker image, that comes pre-bundled with Node.JS and Meteor, and runs it as a local user (not as root). + +You can refer to our meteor/galaxy-images repository to see how to use it, and the latest version. [More about meteor-base here.](https://github.com/meteor/galaxy-images/blob/master/meteor-base/README.md) + + + +## Note for Windows users {#windows} + +On Windows, the installer runs faster when [Windows Developer Mode](https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development) is enabled. The installation extracts a large number of small files, which Windows Defender can cause to be very slow. + + + +## Node version manager {#nvm} + +If you use a node version manager that uses a separate global `node_modules` folder for each Node version, you will need to re-install the `meteor` npm package when changing to a Node version for the first time. Otherwise, the `meteor` command will no longer be found. + + +## Note for fish shell users (Linux) {#fish-shell} + +To be able to user `meteor` command from fish it's needed to include `/home//.meteor` in `$PATH`; to do that just add this line in `/home//.config/fish/config.fish` file (replace `` with your username): + +`set PATH /home//.meteor $PATH` + + +## Uninstalling Meteor {#uninstall} + +If you installed Meteor using npm, you can remove it by running: +`meteor-installer uninstall` + +If you installed Meteor using curl, you can remove it by running: +`rm -rf ~/.meteor` +`sudo rm /usr/local/bin/meteor`  diff --git a/v3-docs/docs/about/roadmap.md b/v3-docs/docs/about/roadmap.md new file mode 100644 index 00000000000..20461821046 --- /dev/null +++ b/v3-docs/docs/about/roadmap.md @@ -0,0 +1,84 @@ +# Roadmap + +Describes the high-level features and actions for the Meteor project in the near-to-medium term future. + +## Introduction + +**Quick update moving items to Finished: June 1, 2023** + +**Last new items added: September 14, 2022.** + +The description of many items include sentences and ideas from Meteor community members. + +Contributors are encouraged to focus their efforts on work that aligns with the roadmap then we can work together in these areas. + + +> As with any roadmap, this is a living document that will evolve as priorities and dependencies shift. + +> If you have new feature requests or ideas you should open a new [discussion](https://github.com/meteor/meteor/discussions/new). + +### Meteor 3.0 release + +- Change how Meteor executes Async code; ([Discussion](https://github.com/meteor/meteor/discussions/11505)) + - Provide new async APIs where Fibers are required; + - Mongo package with Async API; ([PR](https://github.com/meteor/meteor/pull/12028)) + - Provide async versions for Accounts and core packages; + - Adapt Meteor Promise implementation; +- Enable Top-Level Await (TLA) on Meteor server-side; ([PR](https://github.com/meteor/meteor/pull/12095)) +- Support Top-Level Await (TLA) on Reify; +- Remove Fibers dependency from Meteor Public APIs; +- Remove Fibers entirely; +- Update Cordova integration to Meteor 3.0; +- Run Meteor on Node.js 18; +- Change web engine from Connect to Express; + +### Next releases + +- Improve TypeScript support for Meteor and packages; ([Discussion](https://github.com/meteor/meteor/discussions/12080)) +- Linux ARM Support; ([PR](https://github.com/meteor/meteor/pull/11809)) +- Improve release quality with test coverage and CI automation; +- Review and help to modernize Meteor tools; ([Discussion](https://github.com/meteor/meteor/discussions/12073)) +- Improve support for Windows 11 or adopt Windows with WSL; +- Improve Meteor build time; ([Discussion](https://github.com/meteor/meteor/discussions/11587)) +- HTTP/3 Support; +- Tree-shaking; ([PR](https://github.com/meteor/meteor/pull/11164)) +- Support package.json exports fields; ([Discussion](https://github.com/meteor/meteor/discussions/11727)) + +### Candidate items +We need to discuss further to decide whether or not to proceed with these implementations. + +- Update and fix Meteor Client Bundler or Improve DDP Client; +- Improve Passwordless package; ([Discussion](https://github.com/meteor/meteor/discussions/12075)) +- Support building mobile apps using CapacitorJS; +- Bring Redis-oplog to core; ([Repository](https://github.com/Meteor-Community-Packages/redis-oplog)) +- MongoDB Change Streams support; ([Discussion](https://github.com/meteor/meteor/discussions/11842)) +- Better file upload support via DDP; ([Discussion](https://github.com/meteor/meteor/discussions/11523)) + +### Next educational items + +- Create a new Meteor Guide; ([Current Guide](https://guide.meteor.com/)) +- Scaling Meteor Apps course; ([Meteor University](https://university.meteor.com/)) + +### Finished items + +- New Async Tracker; ([Blog Post](https://blog.meteor.com/new-meteor-js-2-10-and-the-async-tracker-feature-ffdbe817c801)) +- New Suspense hooks for React + Meteor; ([Blog Post](https://blog.meteor.com/new-suspense-hooks-for-meteor-5391570b3007)) +- Release Blaze 2.7 supporting async calls; ([Changelog](https://www.blazejs.org/changelog.html)) +- New Scaffold API / generate command; ([Blog Post](https://blog.meteor.com/new-meteor-2-9-and-the-scaffold-api-8b5b2b2b2b2b)) +- Types added to the core; ([Blog Post](https://blog.meteor.com/new-meteor-2-8-1-and-adding-types-to-the-core-8a6ee56f0141)) +- Update Apollo skeleton NPM dependencies; +- MongoDB 6.0 Support; ([Discussion](https://github.com/meteor/meteor/discussions/12092) / [Blog Post](https://blog.meteor.com/new-meteor-2-11-and-the-new-embedded-mongodb-19767076961b)) +- Vite integration; +- SolidJS integration; +- Vue 3 integration; ([Forums](https://forums.meteor.com/t/status-of-vue-3-meteor/57915/25) / [Discussion](https://github.com/meteor/meteor/discussions/11521)) +- SolidJS starter template; +- Login and Accounts Course; ([Meteor University](https://university.meteor.com/)) +- Updated MongoDB driver to 4.8; ([PR](https://github.com/meteor/meteor/pull/12097)) +- Make MongoDB integration stable by fixing critical issues; +- New skeleton for creating Meteor apps with Chakra UI; +- Evaluate and improve support for Meteor in VSCode; ([Repository](https://github.com/matheusccastroo/vscode-meteor-toolbox)) +- Release Blaze 2.6.2; ([Blog Post](https://blog.meteor.com/new-meteor-js-2-12-and-the-blaze-2-6-2-release-b72c2a7a593f)) + +----------- + +For more completed items, refer to our [changelog](https://docs.meteor.com/changelog.html). diff --git a/v3-docs/docs/about/what-is.md b/v3-docs/docs/about/what-is.md new file mode 100644 index 00000000000..fc0a76f1c32 --- /dev/null +++ b/v3-docs/docs/about/what-is.md @@ -0,0 +1,53 @@ + + + + +# Introduction {#introduction} + +:::info You are reading the Meteor 3 documentation! + +- Searching for the Meteor 2 documentation? Access the [Meteor 2 Docs](https://docs.meteor.com/). +- Upgrading from Meteor 2? Check out the [Migration Guide](https://v3-migration-docs.meteor.com/). + ::: + +Meteor is a full-stack JavaScript platform for developing modern web and mobile applications. Meteor includes a key set of technologies for building connected-client reactive applications, a build tool, and a curated set of packages from the Node.js and general JavaScript community. + +- Meteor allows you to develop in **one language**, JavaScript, in all environments: application server, web browser, and mobile device. + +- Meteor uses **data on the wire**, meaning the server sends data, not HTML, and the client renders it. + +- Meteor **embraces the ecosystem**, bringing the best parts of the extremely active JavaScript community to you in a careful and considered way. + +- Meteor provides **full stack reactivity**, allowing your UI to seamlessly reflect the true state of the world with minimal development effort. + +## Meteor Resources {#learning-more} + +### Learning Meteor + +- Start by learning how to install Meteor in the [Installation Section](/about/install.html). + +- For beginners, the [Tutorials](https://www.meteor.com/developers/tutorials) are the perfect place to start with Meteor. Build a simple app to manage a task list! Available for [React](https://react-tutorial.meteor.com/), [Blaze](https://blaze-tutorial.meteor.com/), [Svelte](https://svelte-tutorial.meteor.com/), and [Vue 3](https://vue3-tutorial.meteor.com/). + +- Participate in Meteor's fully professional, engaging and interactive online school. Join [Meteor University](https://university.meteor.com/). + +- Subscribe to our official [Youtube channel](https://www.youtube.com/@MeteorVideos) and watch the latest MeteorJS videos and presentations. + +### Developer Resources + +- Explore and contribute to our [GitHub repository](https://github.com/meteor). You can access our code, request new features, and start contributing. + +- Enhance your coding experience with the [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=meteor-toolbox.meteor-toolbox), which provides IntelliSense support for Meteor's core and packages. + +- Use the [Chrome Extension](https://chrome.google.com/webstore/detail/meteor-devtools-evolved/ibniinmoafhgbifjojidlagmggecmpgf) or [Firefox Extension](https://addons.mozilla.org/en-US/firefox/addon/meteor-devtools-evolved/) for insights into your app's performance and to understand what is going on under the hood of your application. + +- Discover [Meteor Examples](https://github.com/meteor/examples) to see a range of projects built with Meteor. + +- Visit [Atmosphere](https://atmospherejs.com), the dedicated repository for Meteor community packages. + +### Join Our Community + +- Participate in the [Official Forum](https://forums.meteor.com) for project news, support, community discussions, and updates on core features. + +- Engage with peers in the [Meteor Slack Community](https://join.slack.com/t/meteor-community/shared_invite/enQtODA0NTU2Nzk5MTA3LWY5NGMxMWRjZDgzYWMyMTEyYTQ3MTcwZmU2YjM5MTY3MjJkZjQ0NWRjOGZlYmIxZjFlYTA5Mjg4OTk3ODRiOTc) for technical support, meeting new developers, and exchanging ideas. + +- Join the discussion and stay updated with announcements on the [Meteor Discord Community](https://discord.gg/mukjwCA56P). \ No newline at end of file diff --git a/v3-docs/docs/api-examples.md b/v3-docs/docs/api-examples.md new file mode 100644 index 00000000000..6bd8bb5c170 --- /dev/null +++ b/v3-docs/docs/api-examples.md @@ -0,0 +1,49 @@ +--- +outline: deep +--- + +# Runtime API Examples + +This page demonstrates usage of some of the runtime APIs provided by VitePress. + +The main `useData()` API can be used to access site, theme, and page data for the current page. It works in both `.md` and `.vue` files: + +```md + + +## Results + +### Theme Data +
{{ theme }}
+ +### Page Data +
{{ page }}
+ +### Page Frontmatter +
{{ frontmatter }}
+``` + + + +## Results + +### Theme Data +
{{ theme }}
+ +### Page Data +
{{ page }}
+ +### Page Frontmatter +
{{ frontmatter }}
+ +## More + +Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata). diff --git a/v3-docs/docs/api/DDPRateLimiter.md b/v3-docs/docs/api/DDPRateLimiter.md new file mode 100644 index 00000000000..d5c56679a86 --- /dev/null +++ b/v3-docs/docs/api/DDPRateLimiter.md @@ -0,0 +1,81 @@ +# DDPRateLimiter + +Customize rate limiting for methods and subscriptions to avoid a high load of WebSocket messages in your app. + +> Galaxy (Meteor hosting) offers additional App Protection, [read more](https://galaxy-guide.meteor.com/protection.html) and try it with our [free 30-day trial](https://www.meteor.com/hosting). + +By default, `DDPRateLimiter` is configured with a single rule. This rule +limits login attempts, new user creation, and password resets to 5 attempts +every 10 seconds per connection. It can be removed by calling +`Accounts.removeDefaultRateLimit()`. + +To use `DDPRateLimiter` for modifying the default rate-limiting rules, +add the `ddp-rate-limiter` package to your project in your terminal: + +```bash +meteor add ddp-rate-limiter +``` + + + +Custom rules can be added by calling `DDPRateLimiter.addRule`. The rate +limiter is called on every method and subscription invocation. + +A rate limit is reached when a bucket has surpassed the rule's predefined +capacity, at which point errors will be returned for that input until the +buckets are reset. Buckets are regularly reset after the end of a time +interval. + + +Here's example of defining a rule and adding it into the `DDPRateLimiter`: +```js +// Define a rule that matches login attempts by non-admin users. +const loginRule = { + userId(userId) { + const user = Meteor.users.findOne(userId); + return user && user.type !== 'admin'; + }, + + type: 'method', + name: 'login' +}; + +// Add the rule, allowing up to 5 messages every 1000 milliseconds. +DDPRateLimiter.addRule(loginRule, 5, 1000); + +``` + + + + + +Allows developers to specify custom error messages for each rule instead of being +limited to one global error message for every rule. +It adds some clarity to what rules triggered which errors, allowing for better UX +and also opens the door for i18nable error messages per rule instead of the +default English error message. + +Here is an example with a custom error message: +```js +const setupGoogleAuthenticatorRule = { + userId(userId) { + const user = Meteor.users.findOne(userId); + return user; + }, + type: 'method', + name: 'Users.setupGoogleAuthenticator', +}; + +// Add the rule, allowing up to 1 google auth setup message every 60 seconds +const ruleId = DDPRateLimiter.addRule(setupGoogleAuthenticatorRule, 1, 60000); +DDPRateLimiter.setErrorMessageOnRule(ruleId, function (data) { + return `You have reached the maximum number of Google Authenticator attempts. Please try again in ${Math.ceil(data.timeToReset / 1000)} seconds.`; +}); +``` + +Or a more simple approach: + +```js +const ruleId = DDPRateLimiter.addRule(setupGoogleAuthenticatorRule, 1, 60000); +DDPRateLimiter.setErrorMessageOnRule(ruleId, 'Example as a single string error message'); +``` diff --git a/v3-docs/docs/api/EJSON.md b/v3-docs/docs/api/EJSON.md new file mode 100644 index 00000000000..df817913b2d --- /dev/null +++ b/v3-docs/docs/api/EJSON.md @@ -0,0 +1,130 @@ +# EJSON + +EJSON is an extension of JSON to support more types. It supports all JSON-safe types, as well as: + +- **Date** (JavaScript `Date`) +- **Binary** (JavaScript `Uint8Array` or the + result of [`EJSON.newBinary`](#EJSON-newBinary)) +- **Special numbers** (JavaScript `NaN`, `Infinity`, and `-Infinity`) +- **Regular expressions** (JavaScript `RegExp`) +- **User-defined types** (see [`EJSON.addType`](#EJSON-addType). For example, + [`Mongo.ObjectID`](./collections.md#Mongo-ObjectID) is implemented this way.) + +All EJSON serializations are also valid JSON. For example an object with a date +and a binary buffer would be serialized in EJSON as: + +```json +{ + "d": { "$date": 1358205756553 }, + "b": { "$binary": "c3VyZS4=" } +} +``` + +Meteor supports all built-in EJSON data types in publishers, method arguments +and results, Mongo databases, and [`Session`](./session.md) variables. + + + + + +```js +import { EJSON } from "meteor/ejson"; + +EJSON.stringify( + { num: 42, someProp: "foo" }, + options // this param is optional +); +``` + + + + + + + + + + + +Buffers of binary data are represented by `Uint8Array` instances on JavaScript +platforms that support them. On implementations of JavaScript that do not +support `Uint8Array`, binary data buffers are represented by standard arrays +containing numbers ranging from 0 to 255, and the `$Uint8ArrayPolyfill` key +set to `true`. + + + + + +The factory function passed to the `EJSON.addType` method should create an instance of our custom type and initialize it with values from an object passed as the first argument of the factory function. Here is an example: + +```js +class Distance { + constructor(value, unit) { + this.value = value; + this.unit = unit; + } + + // Convert our type to JSON. + toJSONValue() { + return { + value: this.value, + unit: this.unit, + }; + } + + // Unique type name. + typeName() { + return "Distance"; + } +} + +EJSON.addType("Distance", function fromJSONValue(json) { + return new Distance(json.value, json.unit); +}); + +EJSON.stringify(new Distance(10, "m")); +// Returns '{"$type":"Distance","$value":{"value":10,"unit":"m"}}' +``` + +When you add a type to EJSON, Meteor will be able to use that type in: + +- publishing objects of your type if you pass them to publish handlers. +- allowing your type in the return values or arguments to + [methods](./meteor.md#methods). +- storing your type client-side in Minimongo. +- allowing your type in [`Session`](./session.md) variables. + +Instances of your type must implement [`typeName`](#EJSON-CustomType-typeName) and +[`toJSONValue`](#EJSON-CustomType-toJSONValue) methods, and may implement +[`clone`](#EJSON-CustomType-clone) and [`equals`](#EJSON-CustomType-equals) methods if the +default implementations are not sufficient. + + + + +For example, the `toJSONValue` method for +[`Mongo.ObjectID`](./collections.md#Mongo-ObjectID) could be: + +```js +function () { + return this.toHexString(); +} +``` + + + +If your type does not have a `clone` method, `EJSON.clone` will use +[`toJSONValue`](#EJSON-CustomType-toJSONValue) and the factory instead. + + + +The `equals` method should define an [equivalence relation](http://en.wikipedia.org/wiki/Equivalence_relation). It should have +the following properties: + +- _Reflexivity_ - for any instance `a`: `a.equals(a)` must be true. +- _Symmetry_ - for any two instances `a` and `b`: `a.equals(b)` if and only if `b.equals(a)`. +- _Transitivity_ - for any three instances `a`, `b`, and `c`: `a.equals(b)` and `b.equals(c)` implies `a.equals(c)`. + +If your type does not have an `equals` method, `EJSON.equals` will compare the +result of calling [`toJSONValue`](#EJSON-CustomType-toJSONValue) instead. diff --git a/v3-docs/docs/api/ReactiveDict.md b/v3-docs/docs/api/ReactiveDict.md new file mode 100644 index 00000000000..0304f3fddad --- /dev/null +++ b/v3-docs/docs/api/ReactiveDict.md @@ -0,0 +1,119 @@ +# Reactive Dict + +A ReactiveDict stores an arbitrary set of key-value pairs. Use it to manage +internal state in your components, ie. like the currently selected item in a list. +Each key is individully reactive such that calling `set` for a key will +invalidate any Computations that called `get` with that key, according to the +usual contract for reactive data sources. + +That means if you call [`ReactiveDict#get`](#ReactiveDict-get)`('currentList')` +from inside a Blaze template helper, the template will automatically be rerendered +whenever [`ReactiveDict#set`](#ReactiveDict-set)`('currentList', x)` is called. + +To use `ReactiveDict`, add the `reactive-dict` package to your project by running +in your terminal: + +```bash +meteor add reactive-dict +``` + + + + +If you provide a name to its constructor, its contents will be saved across Hot +Code Push client code updates. + + + +Example: + +```js +import { ReactiveDict } from "meteor/reactive-dict"; +import { Tracker } from "meteor/tracker"; +import { Meteor } from "meteor/meteor"; + +const state = new ReactiveDict(); +state.set("currentRoomId", "random"); + +Tracker.autorun(() => { + Meteor.subscribe("chatHistory", { room: state.get("currentRoomId") }); +}); + +// Causes the function passed to `Tracker.autorun` to be rerun, so that the +// 'chatHistory' subscription is moved to the room 'general'. +state.set("currentRoomId", "general"); +``` + +`ReactiveDict.set` can also be called with an object of keys and values, which is +equivalent to calling `ReactiveDict.set` individually on each key/value pair. + +```js +import { ReactiveDict } from "meteor/reactive-dict"; +const state = new ReactiveDict(); +state.set({ + a: "foo", + b: "bar", +}); +``` + + + +This is useful in initialization code, to avoid re-initializing your state +every time a new version of your app is loaded. + + + +Example in Blaze: + +::: code-group + +```html [main.html] + +``` + +```js [main.js] +Template.main.onCreated(function () { + this.state = new ReactiveDict(); + this.state.set("enemy", "Eastasia"); +}); +Template.main.helpers({ + theEnemy() { + const inst = Template.instance(); + return inst.state.get("enemy"); + }, +}); +Template.main.events({ + "click .change-enemy"(event, inst) { + inst.state.set("enemy", "Eurasia"); + }, +}); + +// Clicking the button will change the page to say "We've always been at war with Eurasia" +``` +::: + + + + + +If value is a scalar, then these two expressions do the same thing: + +```js +import { ReactiveDict } from "meteor/reactive-dict"; +const state = new ReactiveDict(); +// ... +state.get("key") === value; +state.equals("key", value); +``` + +However, the second is recommended, as it triggers fewer invalidations +(template redraws), making your program more efficient. + + + + + + diff --git a/v3-docs/docs/api/ReactiveVar.md b/v3-docs/docs/api/ReactiveVar.md new file mode 100644 index 00000000000..76218bce14e --- /dev/null +++ b/v3-docs/docs/api/ReactiveVar.md @@ -0,0 +1,41 @@ +# ReactiveVar + +To use `ReactiveVar`, add the `reactive-var` package to your project by running +in your terminal: + +```bash +meteor add reactive-var +``` + + + + +A ReactiveVar holds a single value that can be get and set, such that calling +`set` will invalidate any Computations that called `get`, according to the +usual contract for reactive data sources. + +A ReactiveVar is similar to a Session variable, with a few differences: + +- ReactiveVars don't have global names, like the "foo" in `Session.get('foo')`. + Instead, they may be created and used locally, for example attached to a + template instance, as in: `this.foo.get()`. + +- ReactiveVars are not automatically migrated across hot code pushes, + whereas Session state is. + +- ReactiveVars can hold any value, while Session variables are limited to + JSON or EJSON. + +An important property of ReactiveVars — which is sometimes a +reason for using one — is that setting the value to the same +value as before has no effect; it does not trigger any invalidations. +So if one autorun sets a ReactiveVar, and another autorun gets the +ReactiveVar, a re-run of the first autorun won't necessarily trigger +the second. By default, only primitive values are compared this way, +while calling `set` on an argument that is an _object_ (not a +primitive) always counts as a change. You can configure this behavior +using the `equalsFunc` argument. + + + + diff --git a/v3-docs/docs/api/Tracker.md b/v3-docs/docs/api/Tracker.md new file mode 100644 index 00000000000..b5242b548d5 --- /dev/null +++ b/v3-docs/docs/api/Tracker.md @@ -0,0 +1,410 @@ +# Tracker + +Meteor has a simple dependency tracking system which allows it to +automatically rerun templates and other computations whenever +[`Session`](./session.md) variables, database queries, and other data +sources change. + +Unlike most other systems, you don't have to manually declare these +dependencies & it "just works". The mechanism is simple and +efficient. When you call a function that supports reactive updates +(such as a database query), it automatically saves the current +Computation object, if any (representing, for example, the current +template being rendered). Later, when the data changes, the function +can "invalidate" the Computation, causing it to rerun (rerendering the +template). + +Applications will find [`Tracker.autorun`](#Tracker-autorun) useful, while more +advanced facilities such as `Tracker.Dependency` and `onInvalidate` +callbacks are intended primarily for package authors implementing new +reactive data sources. + + + +`Tracker.autorun` allows you to run a function that depends on reactive data +sources, in such a way that if there are changes to the data later, +the function will be rerun. + +For example, you can monitor a cursor (which is a reactive data +source) and aggregate it into a session variable: + +```js +Tracker.autorun(() => { + const oldest = _.max(Monkeys.find().fetch(), (monkey) => { + return monkey.age; + }); + + if (oldest) { + Session.set('oldest', oldest.name); + } +}); +``` + +Or you can wait for a session variable to have a certain value, and do +something the first time it does, calling `stop` on the computation to +prevent further rerunning: + +```js +Tracker.autorun((computation) => { + if (!Session.equals('shouldAlert', true)) { + return; + } + + computation.stop(); + alert('Oh no!'); +}); +``` + +The function is invoked immediately, at which point it may alert and +stop right away if `shouldAlert` is already true. If not, the +function is run again when `shouldAlert` becomes true. + +A change to a data dependency does not cause an immediate rerun, but +rather "invalidates" the computation, causing it to rerun the next +time a flush occurs. A flush will occur automatically as soon as +the system is idle if there are invalidated computations. You can +also use [`Tracker.flush`](#Tracker-flush) to cause an immediate flush of +all pending reruns. + +If you nest calls to `Tracker.autorun`, then when the outer call stops or +reruns, the inner call will stop automatically. Subscriptions and +observers are also automatically stopped when used as part of a +computation that is rerun, allowing new ones to be established. See +[`Meteor.subscribe`](./meteor.md#Meteor-subscribe) for more information about +subscriptions and reactivity. + +If the initial run of an autorun throws an exception, the computation +is automatically stopped and won't be rerun. + +### Tracker.autorun and async callbacks +`Tracker.autorun` can accept an `async` callback function. + To preserve reactivity for the reactive variables inside the async callback function, you must use a `Tracker.withComputation`Β call as described below: + + + +```javascript +Tracker.autorun(async function example1(computation) { + // Code before the first await will stay reactive. + reactiveVar1.get(); // This will trigger a rerun. + + let links = await LinksCollection.findAsync({}).fetch(); // First async call will stay reactive. + + // Code after the first await looses Tracker.currentComputation: no reactivity. + reactiveVar2.get(); // This won't trigger a rerun. + + // You can bring back reactivity with the Tracker.withCompuation wrapper: + let users = await Tracker.withComputation(computation, () => Meteor.users.findAsync({}).fetch()); + + // Code below will again not be reactive, so you will need another Tracker.withComputation. + const value = Tracker.withComputation(computation, () => reactiveVar3.get()); // This will trigger a rerun. +}); +``` + +As a rule of thumb, you are okay with wrapping all reactive statements inside a `Tracker.withComputation` to preserve current computation. +But it comes at a performance cost - it should be used only where needed. + +Reason behind is, that an await implicitly *"moves"* the code below in a Promise resolved function. When this function runs (after it has been fetched from the micro task queue), `Tracker.withComputation` preserves the reference to the computation of the `Tracker.autorun`. + +The `react-meteor-data` package uses `Tracker.withComputation` to make the `useTracker` accept async callbacks. +More can be seen [here](https://github.com/meteor/react-packages/tree/master/packages/react-meteor-data#maintaining-the-reactive-context) + +### Using async callbacks in versions of Meteor prior to 2.10 +`Tracker.autorun` can accept an `async` callback function. +However, the async call back function will only be dependent on reactive functions called prior to any called functions that return a promise. + +Example 1 - autorun `example1()` **is not** dependent on reactive changes to the `Meteor.users` collection. Because it is dependent on nothing reactive it will run only once: +```javascript + Tracker.autorun(async function example1() { + let asyncData = await asyncDataFunction(); + let users = Meteor.users.find({}).fetch(); + }); +``` + +However, simply changing the order so there are no `async` calls prior to the reactive call to `Meteor.users.find`, will make the async autorun `example2()` dependent on reactive changes to the `Meteor.users` collection. + +Example 2 - autorun `example2()` **is** dependent on reactive changes to the Meteor.users collection. Changes to the `Meteor.users` collection will cause a rerun of `example2()`: +```javascript + Tracker.autorun(async function example2() { + let users = Meteor.users.find({}).fetch(); + let asyncData = await asyncDataFunction(); + }); +``` + + +Normally, when you make changes (like writing to the database), +their impact (like updating the DOM) is delayed until the system is +idle. This keeps things predictable — you can know that the DOM +won't go changing out from under your code as it runs. It's also one +of the things that makes Meteor fast. + +`Tracker.flush` forces all of the pending reactive updates to complete. +For example, if an event handler changes a Session +variable that will cause part of the user interface to rerender, the +handler can call `flush` to perform the rerender immediately and then +access the resulting DOM. + +An automatic flush occurs whenever the system is idle which performs +exactly the same work as `Tracker.flush`. The flushing process consists +of rerunning any invalidated computations. If additional +invalidations happen while flushing, they are processed as part of the +same flush until there is no more work to be done. Callbacks +registered with [`Tracker.afterFlush`](#Tracker-afterFlush) are called +after processing outstanding invalidations. + +It is illegal to call `flush` from inside a `flush` or from a running +computation. + +The [Tracker manual](https://github.com/meteor/docs/blob/master/long-form/tracker-manual.md#the-flush-cycle) +describes the motivation for the flush cycle and the guarantees made by +`Tracker.flush` and `Tracker.afterFlush`. + + + +Calls `func` with `Tracker.currentComputation` temporarily set to `null` +and returns `func`'s own return value. If `func` accesses reactive data +sources, these data sources will never cause a rerun of the enclosing +computation. + + + +This value is useful for data source implementations to determine +whether they are being accessed reactively or not. + + + +This value indicates, whether a flush is in progress or not. + + + +It's very rare to need to access `currentComputation` directly. The +current computation is used implicitly by +[`Tracker.active`](#Tracker-active) (which tests whether there is one), +[`dependency.depend()`](#Tracker-Dependency-depend) (which registers that it depends on a +dependency), and [`Tracker.onInvalidate`](#Tracker-onInvalidate) (which +registers a callback with it). + + + +See [`computation.onInvalidate`](#Tracker-Computation-onInvalidate) for more +details. + + + +Functions scheduled by multiple calls to `afterFlush` are guaranteed +to run in the order that `afterFlush` was called. Functions are +guaranteed to be called at a time when there are no invalidated +computations that need rerunning. This means that if an `afterFlush` +function invalidates a computation, that computation will be rerun +before any other `afterFlush` functions are called. + + +## Tracker.Computation {#tracker_computation} + +A Computation object represents code that is repeatedly rerun in +response to reactive data changes. Computations don't have return +values; they just perform actions, such as rerendering a template on +the screen. Computations are created using [`Tracker.autorun`](#Tracker-autorun). +Use [`stop`](#Tracker-Computation-stop) to prevent further rerunning of a +computation. + +Each time a computation runs, it may access various reactive data +sources that serve as inputs to the computation, which are called its +dependencies. At some future time, one of these dependencies may +trigger the computation to be rerun by invalidating it. When this +happens, the dependencies are cleared, and the computation is +scheduled to be rerun at flush time. + +The *current computation* +([`Tracker.currentComputation`](#Tracker-currentComputation)) is the +computation that is currently being run or rerun (computed), and the +one that gains a dependency when a reactive data source is accessed. +Data sources are responsible for tracking these dependencies using +[`Tracker.Dependency`](#Tracker-Dependency) objects. + +Invalidating a computation sets its `invalidated` property to true +and immediately calls all of the computation's `onInvalidate` +callbacks. When a flush occurs, if the computation has been invalidated +and not stopped, then the computation is rerun by setting the +`invalidated` property to `false` and calling the original function +that was passed to `Tracker.autorun`. A flush will occur when the current +code finishes running, or sooner if `Tracker.flush` is called. + +Stopping a computation invalidates it (if it is valid) for the purpose +of calling callbacks, but ensures that it will never be rerun. + +Example: + +```js +// If we're in a computation, then perform some clean-up when the current +// computation is invalidated (rerun or stopped). +if (Tracker.active) { + Tracker.onInvalidate(() => { + x.destroy(); + y.finalize(); + }); +} +``` + + + +Stopping a computation is irreversible and guarantees that it will +never be rerun. You can stop a computation at any time, including +from the computation's own run function. Stopping a computation that +is already stopped has no effect. + +Stopping a computation causes its `onInvalidate` callbacks to run +immediately if it is not currently invalidated, as well as its +`stop` callbacks. + +Nested computations are stopped automatically when their enclosing +computation is rerun. + + + +Invalidating a computation marks it to be rerun at +[flush time](#Tracker-flush), at +which point the computation becomes valid again. It is rare to +invalidate a computation manually, because reactive data sources +invalidate their calling computations when they change. Reactive data +sources in turn perform this invalidation using one or more +[`Tracker.Dependency`](#Tracker-Dependency) objects. + +Invalidating a computation immediately calls all `onInvalidate` +callbacks registered on it. Invalidating a computation that is +currently invalidated or is stopped has no effect. A computation can +invalidate itself, but if it continues to do so indefinitely, the +result will be an infinite loop. + + + +`onInvalidate` registers a one-time callback that either fires +immediately or as soon as the computation is next invalidated or +stopped. It is used by reactive data sources to clean up resources or +break dependencies when a computation is rerun or stopped. + +To get a callback after a computation has been recomputed, you can +call [`Tracker.afterFlush`](#Tracker-afterFlush) from `onInvalidate`. + + + + + + + +This property is initially false. It is set to true by `stop()` and +`invalidate()`. It is reset to false when the computation is +recomputed at flush time. + + + +This property is a convenience to support the common pattern where a +computation has logic specific to the first run. + + + +`Computation.firstRunPromise` will be set to the result of the call of the autorun function after the initial computation has been completed. If the autorun function is an async function, it'll then contain its promise, thus making the completion of the execution await-able. That allows us to manually synchronize autoruns like this: + +```js + +await Tracker.autorun(async () => { + await Meteor.userAsync(); + (...more async code...) +}).firstRunPromise; + +await Tracker.autorun(async () => { + await asyncSomeOrOther(); + (...more async code...) +}).firstRunPromise; + +``` + +For a better developer experience `firstRunPromise` is automatically appended to your async `autorun` calls so you don't have to write them yourself. Meaning this also works: + +```js + +await Tracker.autorun(async () => { + await Meteor.userAsync(); + (...more async code...) +}); + +await Tracker.autorun(async () => { + await asyncSomeOrOther(); + (...more async code...) +}); + +``` + + +## Tracker.Dependency {#Tracker-Dependency} + +A Dependency represents an atomic unit of reactive data that a +computation might depend on. Reactive data sources such as Session or +Minimongo internally create different Dependency objects for different +pieces of data, each of which may be depended on by multiple +computations. When the data changes, the computations are +invalidated. + +Dependencies don't store data, they just track the set of computations to +invalidate if something changes. Typically, a data value will be +accompanied by a Dependency object that tracks the computations that depend +on it, as in this example: + +```js +let weather = 'sunny'; +const weatherDep = new Tracker.Dependency(); + +function getWeather() { + weatherDep.depend(); + return weather; +} + +function setWeather(newWeather) { + weather = newWeather; + + // Note: We could add logic here to only call `changed` if the new value is + // different from the old value. + weatherDep.changed(); +} +``` + +This example implements a weather data source with a simple getter and +setter. The getter records that the current computation depends on +the `weatherDep` dependency using `depend()`, while the setter +signals the dependency to invalidate all dependent computations by +calling `changed()`. + +The reason Dependencies do not store data themselves is that it can be +useful to associate multiple Dependencies with the same piece of data. +For example, one Dependency might represent the result of a database +query, while another might represent just the number of documents in +the result. A Dependency could represent whether the weather is sunny +or not, or whether the temperature is above freezing. +[`Session.equals`](./session.md#Session-equals) is implemented this way for +efficiency. When you call `Session.equals('weather', 'sunny')`, the +current computation is made to depend on an internal Dependency that +does not change if the weather goes from, say, `rainy` to `cloudy`. + +Conceptually, the only two things a Dependency can do are gain a +dependent and change. + +A Dependency's dependent computations are always valid (they have +`invalidated === false`). If a dependent is invalidated at any time, +either by the Dependency itself or some other way, it is immediately +removed. + +See the [Tracker manual](https://github.com/meteor/docs/blob/master/long-form/tracker-manual.md#creating-a-reactive-value-using-trackerdependency) +to learn how to create a reactive data source using `Tracker.Dependency`. + + + + + +`dependency.depend()` is used in reactive data source implementations to record +the fact that `dependency` is being accessed from the current computation. + + + +For reactive data sources that create many internal Dependencies, +this function is useful to determine whether a particular Dependency is +still tracking any dependency relationships or if it can be cleaned up +to save memory. diff --git a/v3-docs/docs/api/accounts.md b/v3-docs/docs/api/accounts.md new file mode 100644 index 00000000000..87247466786 --- /dev/null +++ b/v3-docs/docs/api/accounts.md @@ -0,0 +1,968 @@ +# Accounts + +## Accounts-base {#accounts-base} + +The Meteor Accounts system builds on top of the `userId` support in +[`publish`](./meteor#Subscription-userId) and [`methods`](./meteor#methods-userId). The core +packages add the concept of user documents stored in the database, and +additional packages add [secure password authentication](#passwords), +[integration with third party login services](#Meteor-loginWith%3CExternalService%3E), +and a [pre-built userinterface](/packages/accounts-ui.html). + +The basic Accounts system is in the `accounts-base` package, but +applications typically include this automatically by adding one of the +login provider packages: `accounts-password`, `accounts-facebook`, +`accounts-github`, `accounts-google`, `accounts-meetup`, +`accounts-twitter`, or `accounts-weibo`. + +Read more about customizing user accounts in the [Accounts](http://guide.meteor.com/accounts.html) article in the Meteor Guide. + +### Accounts with Session Storage {#accounts-session-storage} + +By default, Meteor uses Local Storage to store, among other things, login tokens in your browser session. But, for some applications, it makes sense to use Session Storage instead. You can achieve this by adding this to your settings: + +```json +{ + // ... all other settings, + "public": { + // ... all your public settings + "packages": { + "accounts": { + "clientStorage": "session" + } + } + } +} +``` + + + +Retrieves the user record for the current user from +the [`Meteor.users`](#Meteor-users) collection. + +On the client, the available fields will be those that +are published from the server (other fields won't be available on the +client). By default the server publishes `username`, `emails`, and +`profile` (writable by user). See [`Meteor.users`](#Meteor-users) for more on +the fields used in user documents. + +On the server, this will fetch the record from the database. To improve the +latency of a method that uses the user document multiple times, save the +returned record to a variable instead of re-calling `Meteor.user()`. + +Fetching the full user document can cause unnecessary database usage on the +server and over-reactivity on the client, particularly if you store lots of +custom data on it. Therefore it is recommended to use the `options` +parameter to only fetch the fields you need: + +```js +import { Meteor } from "meteor/meteor"; +const userName = Meteor.user({ fields: { "profile.name": 1 } }).profile.name; +``` + + + +Same as [`Meteor.user`](#Meteor-user), but returns a promise and is available on the server. + +```js +import { Meteor } from "meteor/meteor"; +const user = await Meteor.userAsync(); +``` + + + + + +This collection contains one document per registered user. Here's an example +user document: + +```js +{ + _id: 'QwkSmTCZiw5KDx3L6', // Meteor.userId() + username: 'cool_kid_13', // Unique name + emails: [ + // Each email address can only belong to one user. + { address: 'cool@example.com', verified: true }, + { address: 'another@different.com', verified: false } + ], + createdAt: new Date('Wed Aug 21 2013 15:16:52 GMT-0700 (PDT)'), + profile: { + // The profile is writable by the user by default. + name: 'Joe Schmoe' + }, + services: { + facebook: { + id: '709050', // Facebook ID + accessToken: 'AAACCgdX7G2...AbV9AZDZD' + }, + resume: { + loginTokens: [ + { token: '97e8c205-c7e4-47c9-9bea-8e2ccc0694cd', + when: 1349761684048 } + ] + } + } +} +``` + +A user document can contain any data you want to store about a user. Meteor +treats the following fields specially: + +- `username`: a unique String identifying the user. +- `emails`: an Array of Objects with keys `address` and `verified`; + an email address may belong to at most one user. `verified` is + a Boolean which is true if the user has [verified the address](#Accounts-verifyEmail) with a token sent over email. +- `createdAt`: the Date at which the user document was created. +- `profile`: an Object which the user can create and update with any data. + Do not store anything on `profile` that you wouldn't want the user to edit + unless you have a deny rule on the `Meteor.users` collection. +- `services`: an Object containing data used by particular + login services. For example, its `reset` field contains + tokens used by [forgot password](#Accounts-forgotPassword) links, + and its `resume` field contains tokens used to keep you + logged in between sessions. + +Like all [Mongo.Collection](./collections.md)s, you can access all +documents on the server, but only those specifically published by the server are +available on the client. You can also use all Collection methods, for instance +`Meteor.users.remove` on the server to delete a user. + +By default, the current user's `username`, `emails` and `profile` are +published to the client. You can publish additional fields for the +current user with: + +::: code-group + +```js [server.js] +Meteor.publish("userData", function () { + if (this.userId) { + return Meteor.users.find( + { _id: this.userId }, + { + fields: { other: 1, things: 1 }, + } + ); + } else { + this.ready(); + } +}); +``` + +```js [client.js] +Meteor.subscribe("userData"); +``` + +::: +If the autopublish package is installed, information about all users +on the system is published to all clients. This includes `username`, +`profile`, and any fields in `services` that are meant to be public +(eg `services.facebook.id`, +`services.twitter.screenName`). Additionally, when using autopublish +more information is published for the currently logged in user, +including access tokens. This allows making API calls directly from +the client for services that allow this. + +Users are by default allowed to specify their own `profile` field with +[`Accounts.createUser`](#Accounts-createUser) and modify it with +`Meteor.users.update`. To allow users to edit additional fields, use +[`Meteor.users.allow`](./collections.md#Mongo-Collection-allow). To forbid users from making any modifications to +their user document: + +```js +import { Meteor } from "meteor/meteor"; +Meteor.users.deny({ update: () => true }); +``` + + + +For example, [the `accounts-ui` package](../packages/accounts-ui.md) uses this to display an +animation while the login request is being processed. + + + + + + + +For example, when called in a user's browser, connections in that browser +remain logged in, but any other browsers or DDP clients logged in as that user +will be logged out. + + + +If there are multiple users with a username or email only differing in case, a case sensitive match is required. Although `createUser` won't let you create users with ambiguous usernames or emails, this could happen with existing databases or if you modify the users collection directly. + +This method can fail throwing one of the following errors: + +- "Unrecognized options for login request [400]" if `user` or `password` is undefined. +- "Match failed [400]" if `user` isn't an Object or String, or `password` isn't a String. +- "User not found [403]" if the email or username provided in `user` doesn't belong to a registered user. +- "Incorrect password [403]" if the password provided is incorrect. +- "User has no password set [403]" if `user` doesn't have a password. + +This function is provided by the `accounts-password` package. See the +[Passwords](#passwords) section below. + + + +Available functions are: + +- `Meteor.loginWithMeteorDeveloperAccount` +- `Meteor.loginWithFacebook` + - `options` may also include [Facebook's `auth_type` parameter](https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow#reaskperms) +- `Meteor.loginWithGithub` +- `Meteor.loginWithGoogle` + - `options` may also include [Google's additional URI parameters](https://developers.google.com/identity/protocols/OpenIDConnect#authenticationuriparameters) +- `Meteor.loginWithMeetup` +- `Meteor.loginWithTwitter` + - `options` may also include [Twitter's `force_login` parameter](https://dev.twitter.com/oauth/reference/get/oauth/authenticate) +- `Meteor.loginWithWeibo` + +These functions initiate the login process with an external +service (eg: Facebook, Google, etc), using OAuth. When called they open a new pop-up +window that loads the provider's login page. Once the user has logged in +with the provider, the pop-up window is closed and the Meteor client +logs in to the Meteor server with the information provided by the external +service. + +

Requesting Permissions

+ +In addition to identifying the user to your application, some services +have APIs that allow you to take action on behalf of the user. To +request specific permissions from the user, pass the +`requestPermissions` option the login function. This will cause the user +to be presented with an additional page in the pop-up dialog to permit +access to their data. The user's `accessToken` — with permissions +to access the service's API — is stored in the `services` field of +the user document. The supported values for `requestPermissions` differ +for each login service and are documented on their respective developer +sites: + +- Facebook: +- GitHub: +- Google: +- Meetup: +- Twitter, Weibo, Meteor developer accounts: `requestPermissions` currently not supported + +External login services typically require registering and configuring +your application before use. The easiest way to do this is with the +[`accounts-ui` package](../packages/accounts-ui.md) which presents a step-by-step guide +to configuring each service. However, the data can be also be entered +manually in the `ServiceConfiguration.configurations` collection, which +is exported by the `service-configuration` package. + +## Configuring Services {#service-configuration} + +First, add the service configuration package: + +```bash +meteor add service-configuration +``` + +Then, inside the server of your app (this example is for the Weebo service), import `ServiceConfiguration`: + +```js +import { ServiceConfiguration } from "meteor/service-configuration"; +ServiceConfiguration.configurations.upsert( + { service: "weibo" }, + { + $set: { + loginStyle: "popup", + clientId: "1292962797", // See table below for correct property name! + secret: "75a730b58f5691de5522789070c319bc", + }, + } +); +``` + +Since Meteor 2.7 you no longer need to manually set the configuration and instead can use Meteor settings by setting your services under `Meteor.settings.packages.service-configuration.`. All the properties can be set under the service and will be added to the database as is, so make sure that they are correct. For the example above, the settings would look like: + +```json +{ + "packages": { + "service-configuration": { + "weibo": { + "loginStyle": "popup", + "clientId": "1292962797", + "secret": "75a730b58f5691de5522789070c319bc" + } + } + } +} +``` + +The correct property name to use for the API identifier (i.e. `clientId` in the above example) depends on the login service being used, so be sure to use the correct one: + +| Property Name | Services | +| ------------- | -------------------------------------------------------- | +| `appId` | Facebook | +| `clientId` | Github, Google, Meetup, Meteor Developer Accounts, Weibo | +| `consumerKey` | Twitter | + +Additionally, each external service has its own login provider package and login function. For +example, to support GitHub login, run the following in your terminal: + +```bash +meteor add accounts-github +``` + +and use the `Meteor.loginWithGithub` function: + +```js +import { Meteor } from "meteor/meteor"; +Meteor.loginWithGithub( + { + requestPermissions: ["user", "public_repo"], + }, + (error) => { + if (error) { + Session.set("errorMessage", error.reason || "Unknown error"); + } + } +); +``` + +Login service configuration is sent from the server to the client over DDP when +your app starts up; you may not call the login function until the configuration +is loaded. The function `Accounts.loginServicesConfigured()` is a reactive data +source that will return true once the login service is configured; you should +not make login buttons visible or active until it is true. + +Ensure that your [`$ROOT_URL`](./meteor.md#Meteor-absoluteUrl) matches the authorized +domain and callback URL that you configure with the external service (for +instance, if you are running Meteor behind a proxy server, `$ROOT_URL` should be +the externally-accessible URL, not the URL inside your proxy). + +## Manual service configuration {#manual-service-configuration} + +You can use `Accounts.loginServiceConfiguration` to view and edit the settings collection: + +```js +import { Accounts } from "meteor/accounts-base"; +Accounts.loginServiceConfiguration.find(); +``` + +## Popup versus redirect flow {#popup-vs-redirect-flow} + +When configuring OAuth login with a provider (such as Facebook or Google), Meteor lets you choose a popup- or redirect-based flow. In a popup-based flow, when a user logs in, they will be prompted to login at the provider in a popup window. In a redirect-based flow, the user's whole browser window will be redirected to the login provider, and the window will redirect back to your app when the login is completed. + +You can also pick which type of login to do by passing an option to [`Meteor.loginWith`](#Meteor-loginWith%3CExternalService%3E) + +Usually, the popup-based flow is preferable because the user will not have to reload your whole app at the end of the login flow. However, the popup-based flow requires browser features such as `window.close` and `window.opener` that are not available in all mobile environments. In particular, we recommend using `Meteor.loginWith({ loginStyle: 'redirect' })` in the following environments: + +- Inside UIWebViews (when your app is loaded inside a mobile app) +- In Safari on iOS8 (`window.close` is not supported due to a bug) + + + + + + + +Example: + +```js +import { Accounts } from "meteor/accounts-base"; + +Accounts.ui.config({ + requestPermissions: { + facebook: ["user_likes"], + github: ["user", "repo"], + }, + requestOfflineToken: { + google: true, + }, + passwordSignupFields: "USERNAME_AND_OPTIONAL_EMAIL", +}); +``` + +Since Meteor 2.7 you can configure these in your Meteor settings under `Meteor.settings.public.packages.accounts-ui-unstyled`. + +## Multi-server {#multi-server} + +The `accounts-base` package exports two constructors, called +`AccountsClient` and `AccountsServer`, which are used to create the +`Accounts` object that is available on the client and the server, +respectively. + +This predefined `Accounts` object (along with similar convenience methods +of `Meteor`, such as [`Meteor.logout`](#Meteor-logout)) is sufficient to +implement most accounts-related logic in Meteor apps. Nevertheless, these +two constructors can be instantiated more than once, to create multiple +independent connections between different accounts servers and their +clients, in more complicated authentication situations. + + + +The `AccountsClient` and `AccountsServer` classes share a common +superclass, `AccountsCommon`. Methods defined on +`AccountsCommon.prototype` will be available on both the client and the +server, via the predefined `Accounts` object (most common) or any custom +`accountsClientOrServer` object created using the `AccountsClient` or +`AccountsServer` constructors (less common). + +Here are a few of those methods: + + + + + + + +From Meteor 2.5 you can set these in your Meteor settings under `Meteor.settings.packages.accounts-base`. Note that due to the nature of settings file you won't be able to set parameters that require functions. + + + +See description of [AccountsCommon#onLoginFailure](#AccountsCommon-onLoginFailure) +for details. + + + +Either the `onLogin` or the `onLoginFailure` callbacks will be called +for each login attempt. The `onLogin` callbacks are called after the +user has been successfully logged in. The `onLoginFailure` callbacks are +called after a login attempt is denied. + +These functions return an object with a single method, `stop`. Calling +`stop()` unregisters the callback. + +On the server, the callbacks get a single argument, the same attempt info +object as [`validateLoginAttempt`](#AccountsServer-validateLoginAttempt). On the +client, the callback argument is an object containing a single `error` +property set to the `Error`-object which was received from the failed login +attempt. + + + +On the server, the `func` callback receives a single argument with the object below. On the +client, no arguments are passed. + +```js +import { AccountsCommon } from "meteor/accounts-base"; +const options = { + //... +}; +const accountsCommon = new AccountsCommon(options); + +accountsCommon.onLogout(({ user, connection, collection }) => { + console.log(user); + // Λ†Λ†Λ†Λ†Λ†Λ† The Meteor user object of the user which just logged out + console.log(connection); + // Λ†Λ†Λ†Λ†Λ†Λ† The connection object the request came in on. See + // `Meteor.onConnection` for details. + + console.log(collection); + // Λ†Λ†Λ†Λ†Λ†Λ† The `collection` The name of the Mongo.Collection or the + // Mongo.Collection object to hold the users. +}); +``` + + + +At most one of `options.connection` and `options.ddpUrl` should be +provided in any instantiation of `AccountsClient`. If neither is provided, +`Meteor.connection` will be used as the `.connection` property of the +`AccountsClient` instance. + +Note that `AccountsClient` is currently available only on the client, due +to its use of browser APIs such as `window.localStorage`. In principle, +though, it might make sense to establish a client connection from one +server to another remote accounts server. Please [let us +know](https://github.com/meteor/meteor/wiki/Contributing-to-Meteor#feature-requests) +if you find yourself needing this server-to-server functionality. + +These methods are defined on `AccountsClient.prototype`, and are thus +available only on the client: + + + + + + + + + +These methods are defined on `AccountsServer.prototype`, and are thus +available only on the server: + + + +This can be called multiple times. If any of the functions return `false` or +throw an error, the new user creation is aborted. To set a specific error +message (which will be displayed by [`accounts-ui`](../packages/accounts-ui.md)), throw a new +[`Meteor.Error`](./meteor#meteor-api). + +Example: + +```js +import { Accounts } from "meteor/accounts-base"; + +// Validate username, sending a specific error message on failure. +Accounts.validateNewUser((user) => { + if (user.username && user.username.length >= 3) { + return true; + } else { + throw new Meteor.Error(403, "Username must have at least 3 characters"); + } +}); + +// Validate username, without a specific error message. +Accounts.validateNewUser((user) => { + return user.username !== "root"; +}); +``` + +If the user is being created as part of a login attempt from a client (eg, +calling [`Accounts.createUser`](#Accounts-createUser) from the client, or +[logging in for the first time with an external +service](#meteor_loginwithexternalservice)), these callbacks are called _before_ +the [`Accounts.validateLoginAttempt`](#Accounts-validateLoginAttempt) +callbacks. If these callbacks succeed but those fail, the user will still be +created but the connection will not be logged in as that user. + + + +Use this when you need to do more than simply accept or reject new user +creation. With this function you can programatically control the +contents of new user documents. + +The function you pass will be called with two arguments: `options` and +`user`. The `options` argument comes +from [`Accounts.createUser`](#Accounts-createUser) for +password-based users or from an external service login flow. `options` may come +from an untrusted client so make sure to validate any values you read from +it. The `user` argument is created on the server and contains a +proposed user object with all the automatically generated fields +required for the user to log in, including the `_id`. + +The function should return the user document (either the one passed in or a +newly-created object) with whatever modifications are desired. The returned +document is inserted directly into the [`Meteor.users`](#Meteor-users) collection. + +The default create user function simply copies `options.profile` into +the new user document. Calling `onCreateUser` overrides the default +hook. This can only be called once. + +Example: + +```js +import { Accounts } from "meteor/accounts-base"; +// Support for playing D&D: Roll 3d6 for dexterity. +Accounts.onCreateUser((options, user) => { + const customizedUser = Object.assign( + { + dexterity: _.random(1, 6) + _.random(1, 6) + _.random(1, 6), + }, + user + ); + + // We still want the default hook's 'profile' behavior. + if (options.profile) { + customizedUser.profile = options.profile; + } + + return customizedUser; +}); +``` + + + +Call `validateLoginAttempt` with a callback to be called on login +attempts. It returns an object with a single method, `stop`. Calling +`stop()` unregisters the callback. + +When a login attempt is made, the registered validate login callbacks +are called with a single argument, you can check the example: + +```js +import { AccountsServer } from "meteor/accounts-base"; +const options = { + //... +}; +const accountsServer = new AccountsServer(options); + +accountsServer.validateLoginAttempt( + ({ + type, // String + allowed, // Boolean + error, // Error + user, // Object + connection, // Object + collection, // Object + methodName, // String + methodArguments, // Array + }) => { + console.log(type); + // Λ†Λ†Λ†Λ†Λ†Λ† The service name, such as "password" or "twitter". + + console.log(allowed); + // Λ†Λ†Λ†Λ†Λ†Λ† Whether this login is allowed and will be successful (if not aborted + // by any of the validateLoginAttempt callbacks). False if the login + // will not succeed (for example, an invalid password or the login was + // aborted by a previous validateLoginAttempt callback). + + console.log(error); + // Λ†Λ†Λ†Λ†Λ†Λ† When `allowed` is false, the exception describing why the login + // failed. It will be a `Meteor.Error` for failures reported to the + // user (such as invalid password), and can be a another kind of + // exception for internal errors. + + console.log(user); + // Λ†Λ†Λ†Λ†Λ†Λ† When it is known which user was attempting to login, + // the Meteor user object. This will always be present for successful logins. + + console.log(connection); + // Λ†Λ†Λ†Λ†Λ†Λ† The `connection` object the request came in on. See + // [`Meteor.onConnection`](#meteor_onconnection) for details. + + console.log(collection); + // Λ†Λ†Λ†Λ†Λ†Λ† The `collection` The name of the Mongo.Collection or the + // Mongo.Collection object to hold the users. + + console.log(methodName); + // Λ†Λ†Λ†Λ†Λ†Λ† The name of the Meteor method being used to login. + // For example, "login", "loginWithPassword", or "loginWith". + + console.log(methodArguments); + // Λ†Λ†Λ†Λ†Λ†Λ† An array of the arguments passed to the login method. + // For example, `["username", "password"]` + } +); +``` + +A validate login callback must return a truthy value for the login to +proceed. If the callback returns a falsy value or throws an +exception, the login is aborted. Throwing a `Meteor.Error` will +report the error reason to the user. + +All registered validate login callbacks are called, even if one of the callbacks +aborts the login. The later callbacks will see the `allowed` field set to +`false` since the login will now not be successful. This allows later callbacks +to override an error from a previous callback; for example, you could override +the "Incorrect password" error with a different message. + +Validate login callbacks that aren't explicitly trying to override a previous +error generally have no need to run if the attempt has already been determined +to fail, and should start with + +```js +if (!attempt.allowed) { + return false; +} +``` + + + +Use this hook if you need to validate that user from an external service should +be allowed to login or create account. + +```js +import { AccountsServer } from "meteor/accounts-base"; +const options = { + //... +}; +const accountsServer = new AccountsServer(options); + +accountsServer.beforeExternalLogin(({ type, data, user }) => { + console.log(type); + // Λ†Λ†Λ†Λ†Λ†Λ† The service name, such as "google" or "twitter". Is a String + + console.log(data); + // Λ†Λ†Λ†Λ†Λ†Λ† Data retrieved from the service (eg: email, name, etc) + // Is an Object. + + console.log(user); + // Λ†Λ†Λ†Λ†Λ†Λ† If user was found in the database that matches the criteria from the service, + // their data will be provided here. Is an Object. +}); +``` + +You should return a `Boolean` value, `true` if the login/registration should +proceed or `false` if it should terminate. In case of termination +the login attempt will throw an error `403`, with the message: `Login forbidden`. + + + +When allowing your users to authenticate with an external service, the process will +eventually call `Accounts.updateOrCreateUserFromExternalService`. By default, this +will search for a user with the `service..id`, and if not found will +create a new user. As that is not always desirable, you can use this hook as an +escape hatch to look up a user with a different selector, probably by `emails.address` or `username`. Note the function will only be called if no user was found with the +`service..id` selector. + +The function will be called with a single argument, the info object: + +```js +import { AccountsServer } from "meteor/accounts-base"; +const options = { + //... +}; +const accountsServer = new AccountsServer(options); + +accountsServer.setAdditionalFindUserOnExternalLogin( + ({ serviceName, serviceData, options }) => { + // serviceName: String + // The external service name, such as "google" or "twitter". + // serviceData: Object + // The data returned by the service oauth request. + // options: Object + // An optional arugment passed down from the oauth service that may contain + // additional user profile information. As the data in `options` comes from an + // external source, make sure you validate any values you read from it. + } +); +``` + +The function should return either a user document or `undefined`. Returning a user +will result in the populating the `service.` in your user document, +while returning `undefined` will result in a new user account being created. +If you would prefer that a new account not be created, you could throw an error +instead of returning. + +Example: + +```js +// If a user has already been created, and used their Google email, this will +// allow them to sign in with the Meteor.loginWithGoogle method later, without +// creating a new user. +Accounts.setAdditionalFindUserOnExternalLogin( + ({ serviceName, serviceData }) => { + if (serviceName === "google") { + // Note: Consider security implications. If someone other than the owner + // gains access to the account on the third-party service they could use + // the e-mail set there to access the account on your app. + // Most often this is not an issue, but as a developer you should be aware + // of how bad actors could play. + return Accounts.findUserByEmail(serviceData.email); + } + } +); +``` + + + +Use this to register your own custom authentication method. This is also used by all of the other inbuilt accounts packages to integrate with the accounts system. + +There can be multiple login handlers that are registered. When a login request is made, it will go through all these handlers to find its own handler. + +The registered handler callback is called with a single argument, the `options` object which comes from the login method. For example, if you want to login with a plaintext password, `options` could be `{ user: { username: }, password: }`,or `{ user: { email: }, password: }`. + +The login handler should return `undefined` if it's not going to handle the login request or else the login result object. + +

Rate Limiting

+ +By default, there are rules added to the [`DDPRateLimiter`](./DDPRateLimiter.md) +that rate limit logins, new user registration and password reset calls to a +limit of 5 requests per 10 seconds per session. These are a basic solution +to dictionary attacks where a malicious user attempts to guess the passwords +of legitimate users by attempting all possible passwords. + +These rate limiting rules can be removed by calling +`Accounts.removeDefaultRateLimit()`. Please see the +[`DDPRateLimiter`](./DDPRateLimiter.md) docs for more information. + + + + + +## Passwords {#passwords} + +The `accounts-password` package contains a full system for password-based +authentication. In addition to the basic username and password-based +sign-in process, it also supports email-based sign-in including +address verification and password recovery emails. + +The Meteor server stores passwords using the +[bcrypt](http://en.wikipedia.org/wiki/Bcrypt) algorithm. This helps +protect against embarrassing password leaks if the server's database is +compromised. + +To add password support to your application, run this command in your terminal: + +```bash +meteor add accounts-password +``` + +> In addition to configuring the [`email`](./email.md) package's `MAIL_URL`, it is critical that you set proper values (specifically the `from` address) in [`Accounts.emailTemplates`](#Accounts-emailTemplates) to ensure proper delivery of e-mails! + +You can construct your own user interface using the +functions below, or use the [`accounts-ui` package](../packages/accounts-ui.md) to +include a turn-key user interface for password-based sign-in. + + + +On the client, this function logs in as the newly created user on +successful completion. On the server, it returns the newly created user +id. + +On the client, you must pass `password` and at least one of `username` or `email` — enough information for the user to be able to log in again later. If there are existing users with a username or email only differing in case, `createUser` will fail. The callback's `error.reason` will be `'Username already exists.'` or `'Email already exists.'` In the latter case, the user can then either [login](accounts.html#Meteor-loginWithPassword) or [reset their password](#Accounts-resetPassword). + +On the server, you do not need to specify `password`, but the user will not be able to log in until it has a password (eg, set with [`Accounts.setPasswordAsync`](#Accounts-setPasswordAsync)). To create an account without a password on the server and still let the user pick their own password, call `createUser` with the `email` option and then call [`Accounts.sendEnrollmentEmail`](#Accounts-sendEnrollmentEmail). This will send the user an email with a link to set their initial password. + +By default the `profile` option is added directly to the new user document. To +override this behavior, use [`Accounts.onCreateUser`](#Accounts-onCreateUser). + +This function is only used for creating users with passwords. The external +service login flows do not use this function. + +Instead of modifying documents in the [`Meteor.users`](#Meteor-users) collection +directly, use these convenience functions which correctly check for case +insensitive duplicates before updates. + + + + + + + + + +By default, an email address is added with `{ verified: false }`. Use +[`Accounts.sendVerificationEmail`](#Accounts-sendVerificationEmail) to send an +email with a link the user can use to verify their email address. + + + + + +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). + + + + + +Use the below functions to initiate password changes or resets from the server +or the client. + + + + + +This triggers a call +to [`Accounts.sendResetPasswordEmail`](#Accounts-sendResetPasswordEmail) +on the server. When the user visits the link in this email, the callback +registered with [`Accounts.onResetPasswordLink`](#Accounts-onResetPasswordLink) +will be called. + +If you are using the [`accounts-ui` package](../packages/accounts-ui.md), this is handled +automatically. Otherwise, it is your responsibility to prompt the user for the +new password and call `resetPassword`. + + + +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. + + + + + +When the user visits the link in this email, the callback registered with +[`AccountsClient#onResetPasswordLink`](#Accounts-onResetPasswordLink) will be called. + +To customize the contents of the email, see +[`Accounts.emailTemplates`](#Accounts-emailTemplates). + + + +When the user visits the link in this email, the callback registered with +[`Accounts.onEnrollmentLink`](#Accounts-onEnrollmentLink) will be called. + +To customize the contents of the email, see +[`Accounts.emailTemplates`](#Accounts-emailTemplates). + + + +When the user visits the link in this email, the callback registered with +[`Accounts.onEmailVerificationLink`](#Accounts-onEmailVerificationLink) will +be called. + +To customize the contents of the email, see +[`Accounts.emailTemplates`](#Accounts-emailTemplates). + + + + + + + + + +This is an `Object` with several fields that are used to generate text/html +for the emails sent by `sendResetPasswordEmail`, `sendEnrollmentEmail`, +and `sendVerificationEmail`. + +Set the fields of the object by assigning to them: + +- `from`: (**required**) A `String` with an [RFC5322](http://tools.ietf.org/html/rfc5322) From + address. By default, the email is sent from `no-reply@example.com`. **If you + want e-mails to send correctly, this should be changed to your own domain + as most e-mail providers will reject mail sent from `example.com`.** +- `siteName`: The public name of your application. Defaults to the DNS name of + the application (eg: `awesome.meteor.com`). +- `headers`: An `Object` for custom email headers as described in + [`Email.send`](./email.md#Email-send). +- `resetPassword`: An `Object` with the fields: +- `from`: A `Function` used to override the `from` address defined + by the `emailTemplates.from` field. +- `subject`: A `Function` that takes a user object and returns + a `String` for the subject line of a reset password email. +- `text`: An optional `Function` that takes a user object and a url, and + returns the body text for a reset password email. +- `html`: An optional `Function` that takes a user object and a + url, and returns the body html for a reset password email. +- `enrollAccount`: Same as `resetPassword`, but for initial password setup for + new accounts. +- `verifyEmail`: Same as `resetPassword`, but for verifying the users email + address. + +Example: + +```js +import { Accounts } from "meteor/accounts-base"; + +Accounts.emailTemplates.siteName = "AwesomeSite"; +Accounts.emailTemplates.from = "AwesomeSite Admin "; + +Accounts.emailTemplates.enrollAccount.subject = (user) => { + return `Welcome to Awesome Town, ${user.profile.name}`; +}; + +Accounts.emailTemplates.enrollAccount.text = (user, url) => { + return ( + "You have been selected to participate in building a better future!" + + " To activate your account, simply click the link below:\n\n" + + url + ); +}; + +Accounts.emailTemplates.resetPassword.from = () => { + // Overrides the value set in `Accounts.emailTemplates.from` when resetting + // passwords. + return "AwesomeSite Password Reset "; +}; +Accounts.emailTemplates.verifyEmail = { + subject() { + return "Activate your account now!"; + }, + text(user, url) { + return `Hey ${user}! Verify your e-mail by following this link: ${url}`; + }, +}; +``` + +

Enable 2FA for this package

+ +You can add 2FA to your login flow by +using the package [accounts-2fa](../packages/accounts-2fa.md). +You can find an example showing how this would look like [here](../packages/accounts-2fa.md#working-with-accounts-password). diff --git a/v3-docs/docs/api/app.md b/v3-docs/docs/api/app.md new file mode 100644 index 00000000000..fc316921544 --- /dev/null +++ b/v3-docs/docs/api/app.md @@ -0,0 +1,107 @@ +# Mobile Configuration + + + +If your Meteor application targets mobile platforms such as iOS or +Android, you can configure your app's metadata and build process +in a special top-level file called +`mobile-config.js` which is *not* included in your application and is used only +for this configuration. + +The code snippet below is an example `mobile-config.js` file. The rest of this +section will explain the specific API commands in greater detail. + +```js +// This section sets up some basic app metadata, the entire section is optional. +App.info({ + id: 'com.example.matt.uber', + name: 'ΓΌber', + description: 'Get ΓΌber power in one button click', + author: 'Matt Development Group', + email: 'contact@example.com', + website: 'http://example.com' +}); + +// Set up resources such as icons and launch screens. +App.icons({ + 'iphone_2x': 'icons/icon-60@2x.png', + 'iphone_3x': 'icons/icon-60@3x.png', + // More screen sizes and platforms... +}); + +// Before Meteor 2.6 we had to pass device specific splash screens for iOS, but this behavior was dropped in favor of story board images. +App.launchScreens({ + // iOS + // For most cases you will only need to use the 'ios_universal' and 'ios_universal_3x'. + 'ios_universal': { src: 'splash/Default@2x.png', srcDarkMode: 'splash/Default@2x~dark.png' }, // (2732x2732) - All @2x devices, if device/mode specific is not declared + 'ios_universal_3x': 'splash/Default@3x.png', // (2208x2208) - All @3x devices, if device/mode specific is not declared + + // If you still want to use a universal splash, but want to fine-tune for the device mode (landscape, portrait), then use the following keys: + 'Default@2x~universal~comany': 'splash/Default@2x~universal~comany.png', // (1278x2732) - All @2x devices in portrait mode. + 'Default@2x~universal~comcom': 'splash/Default@2x~universal~comcom.png', // (1334x750) - All @2x devices in landscape (narrow) mode. + 'Default@3x~universal~anycom': 'splash/Default@3x~universal~anycom.png', // (2208x1242) - All @3x devices in landscape (wide) mode. + 'Default@3x~universal~comany': 'splash/Default@3x~universal~comany.png', // (1242x2208) - All @3x devices in portrait mode. + + // However, if you need to fine tune the splash screens for the device idiom (iPhone, iPad, etc). + 'Default@2x~iphone~anyany': 'splash/Default@2xiphoneanyany.png', // (1334x1334) - iPhone SE/6s/7/8/XR + 'Default@2x~iphone~comany': 'splash/Default@2xiphonecomany.png', // (750x1334) - iPhone SE/6s/7/8/XR - portrait mode + 'Default@2x~iphone~comcom': 'splash/Default@2xiphonecomcom.png', // (1334x750) - iPhone SE/6s/7/8/XR - landscape (narrow) mode + 'Default@3x~iphone~anyany': 'Default@3xiphoneanyany.png', // (2208x2208) - iPhone 6s Plus/7 Plus/8 Plus/X/XS/XS Max + 'Default@3x~iphone~anycom': { src: 'splash/Default@3xiphoneanycom.png', srcDarkMode: 'splash/Default@3xiphoneanycom~dark.png' }, // (2208x1242) - iPhone 6s Plus/7 Plus/8 Plus/X/XS/XS Max - landscape (wide) mode + 'Default@3x~iphone~comany': 'Default@3xiphonecomany.png', // (1242x2208) - iPhone 6s Plus/7 Plus/8 Plus/X/XS/XS Max - portrait mode + 'Default@2x~ipad~anyany': 'Default@2xipadanyany.png', // (2732x2732) - iPad Pro 12.9"/11"/10.5"/9.7"/7.9" + 'Default@2x~ipad~comany': 'Default@2xipadcomany.png', // (1278x2732) - iPad Pro 12.9"/11"/10.5"/9.7"/7.9" - portrait mode + + // Android + 'android_universal': 'splash/android_universal.png', // (320x480) +}); + +// Set PhoneGap/Cordova preferences. +App.setPreference('BackgroundColor', '0xff0000ff'); +App.setPreference('HideKeyboardFormAccessoryBar', true); +App.setPreference('Orientation', 'default'); +App.setPreference('Orientation', 'all', 'ios'); + +// Pass preferences for a particular PhoneGap/Cordova plugin. +App.configurePlugin('com.phonegap.plugins.facebookconnect', { + APP_ID: '1234567890', + API_KEY: 'supersecretapikey' +}); + +// Add custom tags for a particular PhoneGap/Cordova plugin to the end of the +// generated config.xml. 'Universal Links' is shown as an example here. +App.appendToConfig(` + + + +`); +``` + + + + + +For example this Cordova whitelist syntax: + +```xml + + +``` + +is equivalent to: + +```js +App.accessRule('https://www.google-analytics.com'); +App.accessRule('https://example.com', { type: 'navigation' }); +``` + + + +> Note: When using `App.configurePlugin` to re-configure a plugin which has been previously configured, the changes may not be reflected without manually clearing the existing Cordova build. To clear the existing Cordova build, remove the `.meteor/local/cordova-build` directory and re-build the application using either `meteor run` or `meteor build`. + + + + + + +> Note: The resource file is copied in two steps : from the **src** of your meteor project to the root of the cordova project, then to the **target** diff --git a/v3-docs/docs/api/assets.md b/v3-docs/docs/api/assets.md new file mode 100644 index 00000000000..42e80af68ff --- /dev/null +++ b/v3-docs/docs/api/assets.md @@ -0,0 +1,23 @@ +# Assets + +> Currently, it is not possible to import `Assets` as an ES6 module. Any of the `Assets` methods below can simply be called directly in any Meteor server code. + +`Assets` allows server code in a Meteor application to access static server +assets, which are located in the `private` subdirectory of an application's +tree. Assets are not processed as source files and are copied directly +into your application's bundle. + + + + + +Static server assets are included by placing them in the application's `private` +subdirectory. For example, if an application's `private` subdirectory includes a +directory called `nested` with a file called `data.txt` inside it, then server +code can read `data.txt` by running: + +```js +const data = await Assets.getTextAsync('nested/data.txt'); +``` + +Note: Packages can only access their own assets. If you need to read the assets of a different package, or of the enclosing app, you need to get a reference to that package's `Assets` object. diff --git a/v3-docs/docs/api/blaze.md b/v3-docs/docs/api/blaze.md new file mode 100644 index 00000000000..97880bd6ac7 --- /dev/null +++ b/v3-docs/docs/api/blaze.md @@ -0,0 +1,6 @@ + +# Blaze + +How to use Blaze, Meteor's reactive rendering engine. + +This documentation has moved to the [Blaze Community Site](http://blazejs.org/api/templates). diff --git a/v3-docs/docs/api/check.md b/v3-docs/docs/api/check.md new file mode 100644 index 00000000000..d5159028385 --- /dev/null +++ b/v3-docs/docs/api/check.md @@ -0,0 +1,233 @@ +# Check + +Documentation on how to use check, Meteor's type checking library. + +The `check` package includes pattern checking functions useful for checking the types and structure +of variables and an [extensible library of patterns](#matchpatterns) to specify which types you are +expecting. + +To add `check` (or `Match`) to your application, run this command in your terminal: + +```bash +meteor add check +``` + + + +Meteor methods and publish functions can take arbitrary [EJSON](./EJSON.md) types as arguments, but most +functions expect their arguments to be of a particular type. `check` is a lightweight function for +checking that arguments and other values are of the expected type. For example: + +```js [server.js] +import { check } from "meteor/check"; +import { Meteor } from "meteor/meteor"; +Meteor.publish("chatsInRoom", function (roomId) { + // Make sure `roomId` is a string, not an arbitrary Mongo selector object. + check(roomId, String); + return Chats.find({ room: roomId }); +}); + +Meteor.methods({ + addChat(roomId, message) { + check(roomId, String); + check(message, { + text: String, + timestamp: Date, + // Optional, but if present must be an array of strings. + tags: Match.Maybe([String]), + }); + + // Do something with the message... + }, +}); +``` + +If the match fails, `check` throws a `Match.Error` describing how it failed. If +this error gets sent over the wire to the client, it will appear only as +`Meteor.Error(400, 'Match Failed')`. The failure details will be written to the +server logs but not revealed to the client. + + + +`Match.test` can be used to identify if a variable has a certain structure. + +```js +import { Match } from "meteor/check"; + +// Will return true for `{ foo: 1, bar: 'hello' }` or similar. +Match.test(value, { foo: Match.Integer, bar: String }); + +// Will return true if `value` is a string. +Match.test(value, String); + +// Will return true if `value` is a string or an array of numbers. +Match.test(value, Match.OneOf(String, [Number])); +``` + +This can be useful if you have a function that accepts several different kinds +of objects, and you want to determine which was passed in. + +## Match Patterns { #matchpatterns } + +The following patterns can be used as pattern arguments to +[`check`](#check) and `Match.test`: + +### `Match.Any` + +Matches any value. + +```js +import { Match } from "meteor/check"; +// Will return true for any value. +Match.test(value, Match.Any); +``` + +### `String`, `Number`, `Boolean`, `undefined`, `null` + +Matches a primitive of the given type. + +```js +import { Match } from "meteor/check"; +let result; +// Will return true if `value` is a string. +result = Match.test(value, String); +console.log(result); // true + +// Will return true if `value` is a number. +result = Match.test(value, Number); +console.log(result); // true + +// Will return true if `value` is a boolean. +result = Match.test(value, Boolean); +console.log(result); // true +``` + +### `Match.Integer` + +Matches a signed 32-bit integer. Doesn't match `Infinity`, `-Infinity`, or `NaN`. + +```js +import { Match } from "meteor/check"; +let result; +// Will return true if `value` is an integer. +result = Match.test(value, Match.Integer); +console.log(result); // true +``` + +### `[pattern]` { #arraypattern } + +A one-element array matches an array of elements, each of which match +_pattern_. For example, `[Number]` matches a (possibly empty) array of numbers; +`[Match.Any]` matches any array. + +```js +import { Match } from "meteor/check"; +let result; +// Will return true if `value` is an array of numbers. +result = Match.test(value, [Number]); +console.log(result); // true +``` + +### `{ key1: pattern1, key2: pattern2, ... }` + +Matches an Object with the given keys, with values matching the given patterns. +If any _pattern_ is a `Match.Maybe` or `Match.Optional`, that key does not need to exist +in the object. The value may not contain any keys not listed in the pattern. +The value must be a plain Object with no special prototype. + +```js +import { Match } from "meteor/check"; +let result; +// Will return true if `value` is an object with keys 'foo' and 'bar'. +result = Match.test(value, { foo: String, bar: Number }); +console.log(result); // true +``` + +### `Match.ObjectIncluding({ key1: pattern1, key2: pattern2, ... })` + +Matches an Object with the given keys; the value may also have other keys +with arbitrary values. + +```js +import { Match } from "meteor/check"; +let result; +// Will return true if `value` is an object with keys 'foo' and 'bar'. +result = Match.test(value, Match.ObjectIncluding({ foo: String, bar: Number })); +console.log(result); // true +``` + +### `Object` + +Matches any plain Object with any keys; equivalent to +`Match.ObjectIncluding({})`. + +```js +import { Match } from "meteor/check"; +let result; +// Will return true if `value` is an object. +result = Match.test(value, Object); +console.log(result); // true +``` + +### `Match.Maybe(pattern)` { #maybepattern } + +Matches either `undefined`, `null`, or _pattern_. If used in an object, matches only if the key is +not set as opposed to the value being set to `undefined` or `null`. This set of conditions was +chosen because `undefined` arguments to Meteor Methods are converted to `null` when sent over the +wire. + +```js +import { Match, check } from "meteor/check"; +// In an object +const pattern = { name: Match.Maybe(String) }; + +check({ name: "something" }, pattern); // OK +check({}, pattern); // OK +check({ name: undefined }, pattern); // Throws an exception +check({ name: null }, pattern); // Throws an exception + +// Outside an object +check(null, Match.Maybe(String)); // OK +check(undefined, Match.Maybe(String)); // OK +``` + +### `Match.Optional(pattern)` { #optionalpattern } + +Behaves like `Match.Maybe` except it doesn't accept `null`. If used in an object, the behavior is +identical to `Match.Maybe`. + +### `Match.OneOf(pattern1, pattern2, ...)` + +Matches any value that matches at least one of the provided patterns. + +### Any constructor function (eg, `Date`) + +Matches any element that is an instance of that type. + +```js +import { Match } from "meteor/check"; +let result; + +// Will return true if `value` is a Date. +result = Match.test(value, Date); +``` + +### `Match.Where(condition)` + +Calls the function _condition_ with the value as the argument. If _condition_ +returns true, this matches. If _condition_ throws a `Match.Error` or returns +false, this fails. If _condition_ throws any other error, that error is thrown +from the call to `check` or `Match.test`. Examples: + +```js +import { Match, check } from "meteor/check"; + +check(buffer, Match.Where(EJSON.isBinary)); + +const NonEmptyString = Match.Where((x) => { + check(x, String); + return x.length > 0; +}); + +check(arg, NonEmptyString); +``` diff --git a/v3-docs/docs/api/collections.md b/v3-docs/docs/api/collections.md new file mode 100644 index 00000000000..90f8f3d8929 --- /dev/null +++ b/v3-docs/docs/api/collections.md @@ -0,0 +1,1186 @@ +# Collections + +Meteor stores data in _collections_. To get started, declare a +collection with `new Mongo.Collection`. + + + +Calling this function is analogous to declaring a model in a traditional ORM +(Object-Relation Mapper)-centric framework. It sets up a _collection_ (a storage +space for records, or "documents") that can be used to store a particular type +of information, like users, posts, scores, todo items, or whatever matters to +your application. Each document is a EJSON object. It includes an `_id` +property whose value is unique in the collection, which Meteor will set when you +first create the document. + +```js +// Common code on client and server declares a DDP-managed Mongo collection. +const Chatrooms = new Mongo.Collection("chatrooms"); +const Messages = new Mongo.Collection("messages"); +``` + +The function returns an object with methods to [`insert`](#Mongo-Collection-insert) +documents in the collection, [`update`](#Mongo-Collection-update) their properties, and +[`remove`](#Mongo-Collection-remove) them, and to [`find`](#Mongo-Collection-find) the documents in the +collection that match arbitrary criteria. The way these methods work is +compatible with the popular Mongo database API. The same database API +works on both the client and the server (see below). + +```js +// Return an array of my messages. +const myMessages = await Messages.find({ userId: Meteor.userId() }).fetchAsync(); + +// Create a new message. +await Messages.insertAsync({ text: "Hello, world!" }); + +// Mark my first message as important. +await Messages.updateAsync(myMessages[0]._id, { $set: { important: true } }); +``` + + +If you pass a `name` when you create the collection, then you are +declaring a persistent collection — one that is stored on the +server and seen by all users. Client code and server code can both +access the same collection using the same API. + +Specifically, when you pass a `name`, here's what happens: + +- On the server (if you do not specify a `connection`), a collection with that + name is created on a backend Mongo server. When you call methods on that + collection on the server, they translate directly into normal Mongo operations + (after checking that they match your [access control rules](#Mongo-Collection-allow)). + +- On the client (and on the server if you specify a `connection`), a Minimongo + instance is created. Minimongo is essentially an in-memory, non-persistent + implementation of Mongo in pure JavaScript. It serves as a local cache that + stores just the subset of the database that this client is working with. Queries + ([`find`](#Mongo-Collection-find)) on these collections are served directly out of this cache, + without talking to the server. + +- When you write to the database on the client ([`insert`](#Mongo-Collection-insert), + [`update`](#Mongo-Collection-update), [`remove`](#Mongo-Collection-remove)), the command is executed locally + immediately, and, simultaneously, it's sent to the server and executed + there too. This happens via [stubs](./meteor.md#meteor-methods), because writes are + implemented as methods. + +> When, on the server, you write to a collection which has a specified +> `connection` to another server, it sends the corresponding method to the other +> server and receives the changed values back from it over DDP. Unlike on the +> client, it does not execute the write locally first. + +::: danger +On Meteor 3.x and later using `insert`, `update`, `upsert`, +`remove`, `findOne` on the server will throw and error. Use the +`*Async` counterparts instead. + +For example, instead of `collection.insert(doc)`, use `collection.insertAsync(doc)`. +::: + +If you pass a name to a client-only collection, it will not be synchronized +with the server and you need to populate the collection "manually" using the +low-level publication interface (`added/changed/removed`). +See [`added`](./meteor.md#Subscription-added) for more information. + +If you pass `null` as the `name`, then you're creating a local +collection. It's not synchronized anywhere; it's just a local scratchpad +that supports Mongo-style [`find`](#Mongo-Collection-find), [`insert`](#Mongo-Collection-insert), +[`update`](#Mongo-Collection-update), and [`remove`](#Mongo-Collection-remove) operations. (On both the +client and the server, this scratchpad is implemented using Minimongo.) + +By default, Meteor automatically publishes every document in your +collection to each connected client. To turn this behavior off, remove +the `autopublish` package, in your terminal: + +```bash +meteor remove autopublish +``` + +and instead call [`Meteor.publish`](./meteor.md#Meteor-publish) to specify which parts of +your collection should be published to which users. + +```js +// client.js +// Create a collection called `Posts` and put a document in it. The document +// will be immediately visible in the local copy of the collection. It will be +// written to the server-side database a fraction of a second later, and a +// fraction of a second after that, it will be synchronized down to any other +// clients that are subscribed to a query that includes it (see +// `Meteor.subscribe` and `autopublish`). +const Posts = new Mongo.Collection("posts"); +Posts.insert({ title: "Hello world", body: "First post" }); + +// Changes are visible immediatelyβ€”no waiting for a round trip to the server. +assert(Posts.find().count() === 1); + +// Create a temporary, local collection. It works just like any other collection +// but it doesn't send changes to the server, and it can't receive any data from +// subscriptions. +const Scratchpad = new Mongo.Collection(); + +for (let i = 0; i < 10; i += 1) { + Scratchpad.insert({ number: i * 2 }); +} + +assert(Scratchpad.find({ number: { $lt: 9 } }).count() === 5); +``` + +Generally, you'll assign `Mongo.Collection` objects in your app to global +variables. You can only create one `Mongo.Collection` object for each +underlying Mongo collection. + +If you specify a `transform` option to the `Collection` or any of its retrieval +methods, documents are passed through the `transform` function before being +returned or passed to callbacks. This allows you to add methods or otherwise +modify the contents of your collection from their database representation. You +can also specify `transform` on a particular `find`, `findOne`, `allow`, or +`deny` call. Transform functions must return an object and they may not change +the value of the document's `_id` field (though it's OK to leave it out). + +```js +// An animal class that takes a document in its constructor. +class Animal { + constructor(doc) { + _.extend(this, doc); + } + + makeNoise() { + console.log(this.sound); + } +} + +// Define a collection that uses `Animal` as its document. +const Animals = new Mongo.Collection("animals", { + transform: (doc) => new Animal(doc), +}); + +// Create an animal and call its `makeNoise` method. +Animals.insert({ name: "raptor", sound: "roar" }); +Animals.findOne({ name: "raptor" }).makeNoise(); // Prints 'roar' +``` + +`transform` functions are not called reactively. If you want to add a +dynamically changing attribute to an object, do it with a function that computes +the value at the time it's called, not by computing the attribute at `transform` +time. + +::: warning +In this release, Minimongo has some limitations: + +- `$pull` in modifiers can only accept certain kinds + of selectors. +- `findAndModify`, aggregate functions, and + map/reduce aren't supported. + +All of these will be addressed in a future release. For full +Minimongo release notes, see packages/minimongo/NOTES +in the repository. +::: + + +::: warning +Minimongo doesn't currently have indexes. It's rare for this to be an +issue, since it's unusual for a client to have enough data that an +index is worthwhile. +::: + +Read more about collections and how to use them in the [Collections](http://guide.meteor.com/collections.html) article in the Meteor Guide. + + + + + +`find` returns a cursor. It does not immediately access the database or return +documents. Cursors provide `fetch` to return all matching documents, `map` and +`forEach` to iterate over all matching documents, and `observeAsync` and +`observeChangesAsync` to register callbacks when the set of matching documents +changes. Cursors also implement ES2015's [iteration protocols](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols). + +::: warning +Collection cursors are not query snapshots. If the database changes +between calling `Collection.find` and fetching the +results of the cursor, or while fetching results from the cursor, +those changes may or may not appear in the result set. +::: + +Cursors are a reactive data source. On the client, the first time you retrieve a +cursor's documents with `fetch`, `map`, or `forEach` inside a +reactive computation (eg, a template or +[`autorun`](./Tracker.md#Tracker-autorun)), Meteor will register a +dependency on the underlying data. Any change to the collection that +changes the documents in a cursor will trigger a recomputation. To +disable this behavior, pass `{reactive: false}` as an option to +`find`. + +Note that when `fields` are specified, only changes to the included +fields will trigger callbacks in `observeAsync`, `observeChangesAsync` and +invalidations in reactive computations using this cursor. Careful use +of `fields` allows for more fine-grained reactivity for computations +that don't depend on an entire document. + +On the client, there will be a period of time between when the page loads and +when the published data arrives from the server during which your client-side +collections will be empty. + + + + +::: warning +Client only. +For server/isomorphic usage see [findOneAsync](#Mongo-Collection-findOneAsync). +::: + +Equivalent to [`find`](#Mongo-Collection-find)`(selector, options).`[`fetch`](#Mongo-Cursor-fetch)`()[0]` with +`options.limit = 1`. + + + +Async version of [`findOne`](#Mongo-Collection-findOne) that return a `Promise`. + + + +Similar to `cursor.count`, but returns a `Promise`. For a faster version, see `estimatedDocumentCount`. + + + +Returns a `Promise` that resolves to the number of documents in the cursor's result set. The count is an estimate and not guaranteed to be exact. + + + +::: warning +Client only. +For server/isomorphic usage see [insertAsync](#Mongo-Collection-insertAsync). +::: + +Add a document to the collection. A document is just an object, and +its fields can contain any combination of EJSON-compatible datatypes +(arrays, objects, numbers, strings, `null`, true, and false). + +`insert` will generate a unique ID for the object you pass, insert it +in the database, and return the ID. When `insert` is called from +untrusted client code, it will be allowed only if passes any +applicable [`allow`](#Mongo-Collection-allow) and [`deny`](#Mongo-Collection-deny) rules. + +On the server, it should be used `insertAsync` that will return a promise with the `ID` of your +object. + +On the client, `insert` never blocks. If you do not provide a callback +and the insert fails on the server, then Meteor will log a warning to +the console. If you provide a callback, Meteor will call that function +with `error` and `result` arguments. In an error case, `result` is +undefined. If the insert is successful, `error` is undefined and +`result` is the new document ID. + +Example: + +```js +const groceriesId = Lists.insert({ name: "Groceries" }); + +Items.insert({ list: groceriesId, name: "Watercress" }); +Items.insert({ list: groceriesId, name: "Persimmons" }); +``` + + + + +Async version of [`insert`](#Mongo-Collection-insert) that return a `Promise`. + + + +::: warning +Client only. +For server/isomorphic usage see [updateAsync](#Mongo-Collection-updateAsync). +::: + +Modify documents that match `selector` according to `modifier` (see +[modifier documentation](#modifiers)). + +The behavior of `update` differs depending on whether it is called by +trusted or untrusted code. Trusted code includes server code and +method code. Untrusted code includes client-side code such as event +handlers and a browser's JavaScript console. + +- Trusted code can modify multiple documents at once by setting + `multi` to true, and can use an arbitrary [Mongo + selector](#selectors) to find the documents to modify. It bypasses + any access control rules set up by [`allow`](#Mongo-Collection-allow) and + [`deny`](#Mongo-Collection-deny). The number of affected documents will be returned + from the `update` call if you don't pass a callback. + +- Untrusted code can only modify a single document at once, specified + by its `_id`. The modification is allowed only after checking any + applicable [`allow`](#Mongo-Collection-allow) and [`deny`](#Mongo-Collection-deny) rules. The number + of affected documents will be returned to the callback. Untrusted + code cannot perform upserts, except in insecure mode. + +On the server, it should be used `updateAsync`. + +On the client, `update` never blocks. If you do not provide a callback +and the update fails on the server, then Meteor will log a warning to +the console. If you provide a callback, Meteor will call that function +with an error argument if there was an error, or a second argument +indicating the number of affected documents if the update was successful. + +::: code-group + +```js [server.js] +// Give the 'Winner' badge to each user with a score greater than 10. If they +// are logged in and their badge list is visible on the screen, it will update +// automatically as they watch. +Meteor.methods({ + async declareWinners() { + await Players.updateAsync( + { score: { $gt: 10 } }, + { + $addToSet: { badges: "Winner" }, + }, + { multi: true } + ); + }, +}); +``` + +```js [client.js] +// When the 'give points' button in the admin dashboard is pressed, give 5 +// points to the current player. The new score will be immediately visible on +// everyone's screens. +Template.adminDashboard.events({ + "click .give-points"() { + Players.update(Session.get("currentPlayer"), { + $inc: { score: 5 }, + }); + }, +}); +``` + + +You can use `update` to perform a Mongo upsert by setting the `upsert` +option to true. You can also use the [`upsert`](#Mongo-Collection-upsert) method to perform an +upsert that returns the `_id` of the document that was inserted (if there was one) +in addition to the number of affected documents. + + + +Async version of [`update`](#Mongo-Collection-update) that return a `Promise`. + + + +::: warning +Client only. +For server/isomorphic usage see [upsertAsync](#Mongo-Collection-upsertAsync). +::: + +Modify documents that match `selector` according to `modifier`, or insert +a document if no documents were modified. `upsert` is the same as calling +`update` with the `upsert` option set to true, except that the return +value of `upsert` is an object that contain the keys `numberAffected` +and `insertedId`. (`update` returns only the number of affected documents.) + + + +Async version of [`upsert`](#Mongo-Collection-upsert) that return a `Promise`. + + + +::: warning +Client only. +For server/isomorphic usage see [removeAsync](#Mongo-Collection-removeAsync). +::: + +Find all of the documents that match `selector` and delete them from +the collection. + +The behavior of `remove` differs depending on whether it is called by +trusted or untrusted code. Trusted code includes server code and +method code. Untrusted code includes client-side code such as event +handlers and a browser's JavaScript console. + +- Trusted code can use an arbitrary [Mongo selector](#selectors) to + find the documents to remove, and can remove more than one document + at once by passing a selector that matches multiple documents. It + bypasses any access control rules set up by [`allow`](#Mongo-Collection-allow) and + [`deny`](#Mongo-Collection-deny). The number of removed documents will be returned + from `remove` if you don't pass a callback. + + As a safety measure, if `selector` is omitted (or is `undefined`), + no documents will be removed. Set `selector` to `{}` if you really + want to remove all documents from your collection. + +- Untrusted code can only remove a single document at a time, + specified by its `_id`. The document is removed only after checking + any applicable [`allow`](#Mongo-Collection-allow) and [`deny`](#Mongo-Collection-deny) rules. The + number of removed documents will be returned to the callback. + +On the server, it should be used `removeAsync`. + +On the client, `remove` never blocks. If you do not provide a callback +and the remove fails on the server, then Meteor will log a warning to the +console. If you provide a callback, Meteor will call that function with an +error argument if there was an error, or a second argument indicating the number +of removed documents if the remove was successful. + +::: code-group + +```js [server.js] +// When the server starts, clear the log and delete all players with a karma of +// less than -2. +Meteor.startup(async () => { + if (Meteor.isServer) { + await Logs.removeAsync({}); + await Players.removeAsync({ karma: { $lt: -2 } }); + } +}); +``` + +```js [client.js] +// When the 'remove' button is clicked on a chat message, delete that message. +Template.chat.events({ + "click .remove"() { + Messages.remove(this._id); + }, +}); +``` + +::: + + + + + +Async version of [`remove`](#Mongo-Collection-remove) that return a `Promise`. + + + +For efficient and performant queries you will sometimes need to define indexes other than the default `_id` field. +You should add indexes to fields (or combinations of fields) you use to lookup documents in a collection. +This is where `createIndex` comes into play. It takes in 2 objects. First is the key and index type specification (which field and how they should be indexed) and second are options like the index name. +For details on how indexes work read the [MongoDB documentation](https://docs.mongodb.com/manual/indexes/). + +> Note that indexes only apply to server and MongoDB collection. They are not implemented for Minimongo at this time. + +Example defining a simple index on Players collection in Meteor: + +```js +Players.createIndex({ userId: 1 }, { name: "user reference on players" }); +``` + + + +Sometimes you or a package might change an already established indexes. This might throw an error and prevent a startup. +For cases where you can afford to re-build indexes or the change affect too many indexes you can set the `reCreateIndexOnOptionMismatch` +to true in your `settings.json`: + +```json +{ + "packages": { + "mongo": { + "reCreateIndexOnOptionMismatch": true + } + } +} +``` + +> You should use this option only when you are dealing with a change across many indexes and it is not feasible to fix them manually and you can afford the re-building of the indexes as this will destroy the old index and create a new one. Use this carefully. + + + +Async version of [`createIndex`](#Mongo-Collection-createIndex) that return a `Promise`. + + + + +::: warning +While `allow` and `deny` make it easy to get started building an app, it's +harder than it seems to write secure `allow` and `deny` rules. We recommend +that developers avoid `allow` and `deny`, and switch directly to custom methods +once they are ready to remove `insecure` mode from their app. See +[the Meteor Guide on security](https://guide.meteor.com/security.html#allow-deny) +for more details. +::: + +When a client calls `insert`, `update`, or `remove` on a collection, the +collection's `allow` and [`deny`](#Mongo-Collection-deny) callbacks are called +on the server to determine if the write should be allowed. If at least +one `allow` callback allows the write, and no `deny` callbacks deny the +write, then the write is allowed to proceed. + +These checks are run only when a client tries to write to the database +directly, for example by calling `update` from inside an event +handler. Server code is trusted and isn't subject to `allow` and `deny` +restrictions. That includes methods that are called with `Meteor.call` +— they are expected to do their own access checking rather than +relying on `allow` and `deny`. + +You can call `allow` as many times as you like, and each call can +include any combination of `insert`, `update`, and `remove` +functions. The functions should return `true` if they think the +operation should be allowed. Otherwise they should return `false`, or +nothing at all (`undefined`). In that case Meteor will continue +searching through any other `allow` rules on the collection. + +The available callbacks are: + +### Callbacks + +- `insert(userId, doc)` - The user `userId` wants to insert the + document `doc` into the collection. Return `true` if this should be + allowed. + + `doc` will contain the `_id` field if one was explicitly set by the client, or + if there is an active `transform`. You can use this to prevent users from + specifying arbitrary `_id` fields. + +- `update(userId, doc, fieldNames, modifier)` - The user `userId` + wants to update a document `doc` in the database. (`doc` is the + current version of the document from the database, without the + proposed update.) Return `true` to permit the change. + + `fieldNames` is an array of the (top-level) fields in `doc` that the + client wants to modify, for example + `['name', 'score']`. + + `modifier` is the raw Mongo modifier that + the client wants to execute; for example, + `{ $set: { 'name.first': 'Alice' }, $inc: { score: 1 } }`. + + Only Mongo modifiers are supported (operations like `$set` and `$push`). + If the user tries to replace the entire document rather than use + \$-modifiers, the request will be denied without checking the `allow` + functions. + +- `remove(userId, doc)` - the user `userId` wants to remove `doc` from the database. Return + `true` to permit this. + + +When calling `update` or `remove` Meteor will by default fetch the +entire document `doc` from the database. If you have large documents +you may wish to fetch only the fields that are actually used by your +functions. Accomplish this by setting `fetch` to an array of field +names to retrieve. + +Example: + +```js +// Create a collection where users can only modify documents that they own. +// Ownership is tracked by an `owner` field on each document. All documents must +// be owned by the user that created them and ownership can't be changed. Only a +// document's owner is allowed to delete it, and the `locked` attribute can be +// set on a document to prevent its accidental deletion. +const Posts = new Mongo.Collection("posts"); + +Posts.allow({ + insert(userId, doc) { + // The user must be logged in and the document must be owned by the user. + return userId && doc.owner === userId; + }, + + update(userId, doc, fields, modifier) { + // Can only change your own documents. + return doc.owner === userId; + }, + + remove(userId, doc) { + // Can only remove your own documents. + return doc.owner === userId; + }, + + fetch: ["owner"], +}); + +Posts.deny({ + update(userId, doc, fields, modifier) { + // Can't change owners. + return _.contains(fields, "owner"); + }, + + remove(userId, doc) { + // Can't remove locked documents. + return doc.locked; + }, + + fetch: ["locked"], // No need to fetch `owner` +}); +``` + +If you never set up any `allow` rules on a collection then all client +writes to the collection will be denied, and it will only be possible to +write to the collection from server-side code. In this case you will +have to create a method for each possible write that clients are allowed +to do. You'll then call these methods with `Meteor.call` rather than +having the clients call `insert`, `update`, and `remove` directly on the +collection. + + +Meteor also has a special "insecure mode" for quickly prototyping new +applications. In insecure mode, if you haven't set up any `allow` or `deny` +rules on a collection, then all users have full write access to the +collection. This is the only effect of insecure mode. If you call `allow` or +`deny` at all on a collection, even `Posts.allow({})`, then access is checked +just like normal on that collection. **New Meteor projects start in insecure +mode by default.** To turn it off just run in your terminal: + +```bash +meteor remove insecure +``` + + + +::: warning +While `allow` and `deny` make it easy to get started building an app, it's +harder than it seems to write secure `allow` and `deny` rules. We recommend +that developers avoid `allow` and `deny`, and switch directly to custom methods +once they are ready to remove `insecure` mode from their app. See +[the Meteor Guide on security](https://guide.meteor.com/security.html#allow-deny) +for more details. +::: + +This works just like [`allow`](#Mongo-Collection-allow), except it lets you +make sure that certain writes are definitely denied, even if there is an +`allow` rule that says that they should be permitted. + +When a client tries to write to a collection, the Meteor server first +checks the collection's `deny` rules. If none of them return true then +it checks the collection's `allow` rules. Meteor allows the write only +if no `deny` rules return `true` and at least one `allow` rule returns +`true`. + + + +The methods (like `update` or `insert`) you call on the resulting _raw_ collection return promises and can be used outside of a Fiber. + + + + +## Cursors {#mongo_cursor} + +To create a cursor, use [`find`](#Mongo-Collection-find). To access the documents in a +cursor, use [`forEach`](#Mongo-Cursor-forEach), [`map`](##Mongo-Cursor-map), [`fetch`](#Mongo-Cursor-fetch), +[`forEachAsync`](#Mongo-Cursor-forEachAsync), [`mapAsync`](#Mongo-Cursor-mapAsync), [`fetchAsync`](#Mongo-Cursor-fetchAsync) or ES2015's [iteration protocols](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols). + + + +This interface is compatible with [Array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach). + +When called from a reactive computation, `forEach` registers dependencies on +the matching documents. + +Examples: + +```js +// Print the titles of the five top-scoring posts. +const topPosts = Posts.find({}, { sort: { score: -1 }, limit: 5 }); +let count = 0; + +topPosts.forEach((post) => { + console.log(`Title of post ${count}: ${post.title}`); + count += 1; +}); +``` + +::: warning +Client only. +For server/isomorphic usage see [removeAsync](#Mongo-Cursor-forEachAsync). +::: + + + +Async version of [`forEach`](#Mongo-Cursor-forEach) that return a `Promise`. + +The same example as from `forEach` but using `forEachAsync`: + +```js + +// Print the titles of the five top-scoring posts. +const topPosts = Posts.find({}, { sort: { score: -1 }, limit: 5 }); +let count = 0; + +await topPosts.forEachAsync((post) => { + console.log(`Title of post ${count}: ${post.title}`); + count += 1; +}); + +console.log("All done!"); // This will be printed after all the posts are printed. + +``` + + + +This interface is compatible with [Array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map). + +When called from a reactive computation, `map` registers dependencies on +the matching documents. + + + +On the server, if `callback` yields, other calls to `callback` may occur while +the first call is waiting. If strict sequential execution is necessary, use +`forEach` instead. + +::: warning +Client only. +For server/isomorphic usage see [mapAsync](#Mongo-Cursor-mapAsync). +::: + + + + +Async version of [`map`](#Mongo-Cursor-map) that return a `Promise`. + + + +When called from a reactive computation, `fetch` registers dependencies on +the matching documents. + +::: warning +Client only. +For server/isomorphic usage see [fetchAsync](#Mongo-Cursor-fetchAsync). +::: + + + +Async version of [`fetch`](#Mongo-Cursor-fetch) that return a `Promise`. + + + + +Unlike the other functions, `count` registers a dependency only on the +number of matching documents. (Updates that just change or reorder the +documents in the result set will not trigger a recomputation.) + +::: warning +Client only. +For server/isomorphic usage see [countAsync](#Mongo-Cursor-countAsync). +::: + + + +Async version of [`count`](#Mongo-Cursor-count) that return a `Promise`. + + + +Establishes a _live query_ that invokes callbacks when the result of +the query changes. The callbacks receive the entire contents of the +document that was affected, as well as its old contents, if +applicable. If you only need to receive the fields that changed, see +[`observeChangesAsync`](#Mongo-Cursor-observeChangesAsync). + +`callbacks` may have the following functions as properties: + + +### Callbacks + +- `added(document)` or `addedAt(document, atIndex, before)` + A new document `document` entered the result set. The new document + appears at position `atIndex`. It is immediately before the document + whose `_id` is `before`. `before` will be `null` if the new document + is at the end of the results. + +- `changed(newDocument, oldDocument)` or `changedAt(newDocument, oldDocument, atIndex)` + The contents of a document were previously `oldDocument` and are now + `newDocument`. The position of the changed document is `atIndex`. + +- `removed(oldDocument)` or `removedAt(oldDocument, atIndex)` + The document `oldDocument` is no longer in the result set. It used + to be at position `atIndex`. + +- `movedTo(document, fromIndex, toIndex, before)` + A document changed its position in the result set, from `fromIndex` + to `toIndex` (which is before the document with id `before`). Its + current contents is `document`. + +Use `added`, `changed`, and `removed` when you don't care about the +order of the documents in the result set. They are more efficient than +`addedAt`, `changedAt`, and `removedAt`. + +Before `observeAsync` returns, `added` (or `addedAt`) will be called zero +or more times to deliver the initial results of the query. + + +`observeAsync` returns a promise of the live query handle, which is an object with a `stop` method. +Call `stop` with no arguments to stop calling the callback functions and tear +down the query. **The query will run forever until you call this.** If +`observeAsync` is called from a `Tracker.autorun` computation, it is automatically +stopped when the computation is rerun or stopped. + +::: tip +`observeAsync` is recommended to keep code isomorphism in the client and server. + +`observe` stays sync for easier client-side handler management. +::: + +(If the cursor was created with the option `reactive` set to false, it will +only deliver the initial results and will not call any further callbacks; +it is not necessary to call `stop` on the handle.) + + + + +Establishes a _live query_ that invokes callbacks when the result of +the query changes. In contrast to [`observeAsync`](#Mongo-Cursor-observeAsync), +`observeChangesAsync` provides only the difference between the old and new +result set, not the entire contents of the document that changed. + +`callbacks` may have the following functions as properties: + +### Callbacks + + +- `added(id, fields)` or `addedBefore(id, fields, before)` + A new document entered the result set. It has the `id` and `fields` + specified. `fields` contains all fields of the document excluding the + `_id` field. The new document is before the document identified by + `before`, or at the end if `before` is `null`. + +- `changed(id, fields)` + The document identified by `id` changed its contents. `fields` + contains the changed fields with their new values. If a field was + removed from the document then it will be present in `fields` with a + value of `undefined`. + +- `removed(id)` + The document identified by `id` is no longer in the result set. + +- `movedBefore(id, before)` + The document identified by `id` changed its position in the result + set, and now appears before the document identified by `before`. + +`observeChangesAsync` is significantly more efficient if you do not use +`addedBefore` or `movedBefore`. + +Before `observeChangesAsync` returns, `added` (or `addedBefore`) will be called +zero or more times to deliver the initial results of the query. + +`observeChangesAsync` returns a promise of the live query handle, which is an object with a `stop` +method. Call `stop` with no arguments to stop calling the callback functions +and tear down the query. **The query will run forever until you call this.** +If +`observeChangesAsync` is called from a `Tracker.autorun` computation, it is automatically +stopped when the computation is rerun or stopped. + +::: tip +`observeChangesAsync` is recommended to keep code isomorphism in the client and server. + +`observeChanges` stays sync for easier client-side handler management. +::: + +(If the cursor was created with the option `reactive` set to false, it will +only deliver the initial results and will not call any further callbacks; +it is not necessary to call `stop` on the handle.) + +> Unlike `observeAsync`, `observeChangesAsync` does not provide absolute position +> information (that is, `atIndex` positions rather than `before` +> positions.) This is for efficiency. + +Example: + +```js +// Keep track of how many administrators are online. +let count = 0; +const cursor = Users.find({ admin: true, onlineNow: true }); + +const handle = await cursor.observeChangesAsync({ + added(id, user) { + count += 1; + console.log(`${user.name} brings the total to ${count} admins.`); + }, + + removed() { + count -= 1; + console.log(`Lost one. We're now down to ${count} admins.`); + }, +}); + +// After five seconds, stop keeping the count. +setTimeout(() => handle.stop(), 5000); +``` + + + + +`Mongo.ObjectID` follows the same API as the [Node MongoDB driver `ObjectID`](http://mongodb.github.io/node-mongodb-native/3.0/api/ObjectID.html) +class. Note that you must use the `equals` method (or [`EJSON.equals`](./EJSON.md#EJSON-equals)) to +compare them; the `===` operator will not work. If you are writing generic code +that needs to deal with `_id` fields that may be either strings or `ObjectID`s, use +[`EJSON.equals`](./EJSON.md#EJSON-equals) instead of `===` to compare them. + +> `ObjectID` values created by Meteor will not have meaningful answers to their `getTimestamp` +> method, since Meteor currently constructs them fully randomly. + + + +## Selectors {#selectors} + +The simplest selectors are just a string or +[`Mongo.ObjectID`](#Mongo-ObjectID). These selectors match the +document with that value in its `_id` field. + +A slightly more complex form of selector is an object containing a set of keys +that must match in a document: + +```js +// Matches all documents where `deleted` is false. +{ deleted: false } + +// Matches all documents where the `name` and `cognomen` are as given. +{ name: 'Rhialto', cognomen: 'the Marvelous' } + +// Matches every document. +{} +``` + + +But they can also contain more complicated tests: + +```js +// Matches documents where `age` is greater than 18. +{ + age: { + $gt: 18; + } +} + +// Matches documents where `tags` is an array containing 'popular'. +{ + tags: "popular"; +} + +// Matches documents where `fruit` is one of three possibilities. +{ + fruit: { + $in: ["peach", "plum", "pear"]; + } +} +``` + +See the [complete documentation](http://docs.mongodb.org/manual/reference/operator/). + +## Modifiers {#modifiers} + + +A modifier is an object that describes how to update a document in +place by changing some of its fields. Some examples: + +```js +// Set the `admin` property on the document to true. +{ $set: { admin: true } } + +// Add 2 to the `votes` property and add 'Traz' to the end of the `supporters` +// array. +{ $inc: { votes: 2 }, $push: { supporters: 'Traz' } } +``` + +But if a modifier doesn't contain any \$-operators, then it is instead +interpreted as a literal document, and completely replaces whatever was +previously in the database. (Literal document modifiers are not currently +supported by [validated updates](#Mongo-Collection-allow).) + + +```js +// Find the document with ID '123' and completely replace it. +Users.update({ _id: "123" }, { name: "Alice", friends: ["Bob"] }); +``` + +See the [full list of modifiers](http://docs.mongodb.org/manual/reference/operator/update/). + +## Sort specifiers {#sortspecifiers} + +Sorts may be specified using your choice of several syntaxes: + +```js +// All of these do the same thing (sort in ascending order by key `a`, breaking +// ties in descending order of key `b`). +[['a', 'asc'], ['b', 'desc']] +['a', ['b', 'desc']] +{ a: 1, b: -1 } + +// Sorted by `createdAt` descending. +Users.find({}, { sort: { createdAt: -1 } }); + +// Sorted by `createdAt` descending and by `name` ascending. +Users.find({}, { sort: [['createdAt', 'desc'], ['name', 'asc']] }); +``` + +The last form will only work if your JavaScript implementation +preserves the order of keys in objects. Most do, most of the time, but +it's up to you to be sure. + +For local collections you can pass a comparator function which receives two +document objects, and returns -1 if the first document comes first in order, +1 if the second document comes first, or 0 if neither document comes before +the other. This is a Minimongo extension to MongoDB. + +## Field specifiers {#fieldspecifiers} + +Queries can specify a particular set of fields to include or exclude from the +result object. + +To exclude specific fields from the result objects, the field specifier is a +dictionary whose keys are field names and whose values are `0`. All unspecified +fields are included. + +```js +Users.find({}, { fields: { password: 0, hash: 0 } }); +``` + +To include only specific fields in the result documents, use `1` as +the value. The `_id` field is still included in the result. + +```js +Users.find({}, { fields: { firstname: 1, lastname: 1 } }); +``` + +With one exception, it is not possible to mix inclusion and exclusion styles: +the keys must either be all 1 or all 0. The exception is that you may specify +`_id: 0` in an inclusion specifier, which will leave `_id` out of the result +object as well. However, such field specifiers can not be used with +[`observeChangesAsync`](#Mongo-Cursor-observeChangesAsync), [`observeAsync`](#Mongo-Cursor-observeAsync), cursors returned +from a [publish function](./meteor.md#Meteor-publish). They may be used with [`fetch`](#Mongo-Cursor-fetch), +[`findOne`](#Mongo-Collection-findOne), [`forEach`](#Mongo-Cursor-forEach), and [`map`](#Mongo-Cursor-map). + +Field +operators such as `$` and `$elemMatch` are not available on the client side +yet. + + +A more advanced example: + +```js +Users.insert({ + alterEgos: [ + { name: "Kira", alliance: "murderer" }, + { name: "L", alliance: "police" }, + ], + name: "Yagami Light", +}); + +Users.findOne({}, { fields: { "alterEgos.name": 1, _id: 0 } }); +// Returns { alterEgos: [{ name: 'Kira' }, { name: 'L' }] } +``` + + + +See +the MongoDB docs for details of the nested field rules and array behavior. + +## Connecting to your database {#mongo_url} + +When developing your application, Meteor starts a local MongoDB instance and +automatically connects to it. In production, you must specify a `MONGO_URL` +environment variable pointing at your database in [the standard mongo connection +string format](https://docs.mongodb.com/manual/reference/connection-string). + +> You can also set `MONGO_URL` in development if you want to connect to a +> different MongoDB instance. + +If you want to use oplog tailing for livequeries, you should also set +`MONGO_OPLOG_URL` (generally you'll need a special user with oplog access, but +the detail can differ depending on how you host your MongoDB. Read more [here](https://github.com/meteor/docs/blob/master/long-form/oplog-observe-driver.md)). + +> As of Meteor 1.4, you must ensure you set the `replicaSet` parameter on your +> `METEOR_OPLOG_URL` + +## MongoDB connection options {#mongo_connection_options} + +MongoDB provides many connection options, usually the default works but in some +cases you may want to pass additional options. You can do it in two ways: + +### Meteor settings {#mongo_connection_options_settings} + +You can use your Meteor settings file to set the options in a property called +`options` inside `packages` > `mongo`, these values will be provided as options for MongoDB in +the connect method. + +> this option was introduced in Meteor 1.10.2 + +For example, you may want to specify a certificate for your +TLS connection ([see the options here](https://mongodb.github.io/node-mongodb-native/3.5/tutorials/connect/tls/)) then you could use these options: + +```json + "packages": { + "mongo": { + "options": { + "tls": true, + "tlsCAFileAsset": "certificate.pem" + } + } + } +``` + +Meteor will convert relative paths to absolute paths if the option name (key) +ends with `Asset`, for this to work properly you need to place the files in the +`private` folder in the root of your project. In the example Mongo connection would +receive this: + +```json + "packages": { + "mongo": { + "options": { + "tls": true, + "tlsCAFile": "/absolute/path/certificate.pem" + } + } + } +``` + +See that the final option name (key) does not contain `Asset` in the end as +expected by MongoDB. + +This configuration is necessary in some MongoDB host providers to avoid this +error `MongoNetworkError: failed to connect to server [sg-meteorappdb-32194.servers.mongodirector.com:27017] on first connect [Error: self signed certificate`. + +Another way to avoid this error is to allow invalid certificates with this +option: + +```json + "packages": { + "mongo": { + "options": { + "tlsAllowInvalidCertificates": true + } + } + } +``` + +You can pass any MongoDB valid option, these are just examples using +certificates configurations. + + +### Mongo Oplog Options {#mongo-oplog-options} + +> Oplog options were introduced in Meteor 2.15.1 +If you set the [`MONGO_OPLOG_URL`](https://docs.meteor.com/environment-variables.html#MONGO-OPLOG-URL) env var, Meteor will use MongoDB's Oplog to show efficient, real time updates to your users via your subscriptions. + +Due to how Meteor's Oplog implementation is built behind the scenes, if you have certain collections where you expect **big amounts of write operations**, this might lead to **big CPU spikes on your meteor app server, even if you have no publications/subscriptions on any data/documents of these collections**. For more information on this, please have a look into [this blog post from 2016](https://blog.meteor.com/tuning-meteor-mongo-livedata-for-scalability-13fe9deb8908), [this github discussion from 2022](https://github.com/meteor/meteor/discussions/11842) or [this meteor forums post from 2023](https://forums.meteor.com/t/cpu-spikes-due-to-oplog-updates-without-subscriptions/60028). + +To solve this, **2 Oplog settings** have been introduced **to tweak, which collections are *watched* or *ignored* in the oplog**. + +**Exclusion**: To *exclude* for example all updates/inserts of documents in the 2 collections called `products` and `prices`, you would need to set the following setting in your Meteor settings file: + +```json + "packages": { + "mongo": { + "oplogExcludeCollections": ["products", "prices"] + } + } +``` + +**Inclusion**: vice versa, if you only want to watch/*include* the oplog for changes on documents in the 2 collections `chats` and `messages`, you would use: + +```json + "packages": { + "mongo": { + "oplogIncludeCollections": ["chats", "messages"] + } + } +``` + +For obvious reasons, using both `oplogExcludeCollections` and `oplogIncludeCollections` at the same time is not possible and will result in an error. + +### Mongo.setConnectionOptions(options) + +You can also call `Mongo.setConnectionOptions` to set the connection options but +you need to call it before any other package using Mongo connections is +initialized so you need to add this code in a package and add it above the other +packages, like accounts-base in your `.meteor/packages` file. + +> this option was introduced in Meteor 1.4 diff --git a/v3-docs/docs/api/email.md b/v3-docs/docs/api/email.md new file mode 100644 index 00000000000..89c46d84832 --- /dev/null +++ b/v3-docs/docs/api/email.md @@ -0,0 +1,166 @@ +# Email + +The `email` package allows sending email from a Meteor app. To use it, add the +package to your project by running in your terminal: + +```bash +meteor add email +``` + +There are two ways on how to setup the package for sending e-mail. + +First is to set `MAIL_URL`. The server reads from the `MAIL_URL` environment +variable to determine how to send mail. The `MAIL_URL` should reference an +[SMTP](https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol) server and +use the form `smtp://USERNAME:PASSWORD@HOST:PORT` or +`smtps://USERNAME:PASSWORD@HOST:PORT`. The `smtps://` form (the `s` is for +"secure") should be used if the mail server requires TLS/SSL (and does not use +`STARTTLS`) and is most common on port 465. Connections which start unencrypted +prior to being upgraded to TLS/SSL (using `STARTTLS`) typically use port 587 +(and _sometimes_ 25) and should use `smtp://`. For more information see the +[Nodemailer docs](https://nodemailer.com/smtp/) + +Second, if you are using a one of the [supported services](https://community.nodemailer.com/smtp/well-known/#supported-services) you can setup the sending options in your app settings like this: + +```json +{ + "packages": { + "email": { + "service": "Mailgun", + "user": "postmaster@meteor.com", + "password": "superDuperPassword" + } + } +} +``` + +The package will take care of the rest. + +> If you use a supported service the package will try to match to supported service and use the stored settings instead. +> You can force this by switching protocol like `smtp` to the name of the service. +> Though you should only use this as a stop-gap measure and instead set the settings properly. + +If neither option is set, `Email.send` outputs the message to standard output +instead. + +> Package setting is only available since Email v2.2 + + + +You must provide the `from` option and at least one of `to`, `cc`, and `bcc`; +all other options are optional. + +`Email.send` only works on the server. Here is an example of how a +client could use a server method call to send an email. (In an actual +application, you'd need to be careful to limit the emails that a +client could send, to prevent your server from being used as a relay +by spammers.) + +::: code-group + +```js [server.js] +import { Meteor } from "meteor/meteor"; +import { Email } from "meteor/email"; +import { check } from "meteor/check"; +// 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]); + + Email.send({ to, from, subject, text }); + }, +}); +``` + +```js [client.js] +import { Meteor } from "meteor/meteor"; +// Client: Asynchronously send an email. +Meteor.callAsync("sendEmail", { + to: "Alice ", + from: "bob@example.com", + subject: "Hello from Meteor!", + text: "This is a test of Email.send.", +}); +``` + +::: + + + +`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]); + + return Email.sendAsync({ to, from, subject, text }).catch((err) => { + // do something with the error + }); + }, +}); +``` + + + +```js +import { Email } from 'meteor/email' + +Email.hookSend(({to}) => { + if (to === 'ceo@company.com') { + console.log(`Let's not send email to the CEO`); + return false; + } + return true; +}) +``` + +`hookSend` is a convenient hook if you want to: prevent sending certain emails, +send emails via your own integration instead of the default one provided by +Meteor, or do something else with the data. This is especially useful +if you want to intercept emails sent by core packages like accounts-password +or other packages where you can't modify the email code. + +The hook function will receive an object with the options for Nodemailer. + + + + +> `Email.customTransport` is only available since Email v2.2 + +There are scenarios when you have your own transport set up, be it an SDK +for your mailing service or something else. This is where `customTransport` +comes in. If you set this function all sending events will be passed to it +(after `hookSend` is run) with an object of the options passed into `send` +function with addition of `packageSettings` key which will pass in package settings +set in your app settings (if any). It is up to you what you do in that function +as it will override the original sending function. + +Here is a simple example with Mailgun: + +```javascript +import { Email } from 'meteor/email' +import { Log } from 'meteor/logging' +import Mailgun from 'mailgun-js' + +Email.customTransport = (data) => { + // `options.packageSettings` are settings from `Meteor.settings.packages.email` + // The rest of the options are from Email.send options + const mailgun = Mailgun({ apiKey: data.packageSettings.mailgun.privateKey, domain: 'mg.mygreatapp.com' }) + + // Since the data object that we receive already includes the correct key names for sending + // we can just pass it to the mailgun sending message. + mailgun.messages().send(data, (error, body) => { + if (error) Log.error(error) + if (body) Log.info(body) + }) +} +``` + +> Note that this also overrides the development display of messages in console +> so you might want to differentiate between production and development for +> setting this function. diff --git a/v3-docs/docs/api/index.md b/v3-docs/docs/api/index.md new file mode 100644 index 00000000000..d3fb2c693b2 --- /dev/null +++ b/v3-docs/docs/api/index.md @@ -0,0 +1,2 @@ + + diff --git a/v3-docs/docs/api/meteor.md b/v3-docs/docs/api/meteor.md new file mode 100644 index 00000000000..1040e2e25b8 --- /dev/null +++ b/v3-docs/docs/api/meteor.md @@ -0,0 +1,958 @@ +# Meteor API + +Meteor global object has many functions and properties for handling utilities, network and much more. + +### Core APIs {#core} + + + +On a server, the function will run as soon as the server process is +finished starting. On a client, the function will run as soon as the DOM +is ready. Code wrapped in `Meteor.startup` always runs after all app +files have loaded, so you should put code here if you want to access +shared variables from other files. + +The `startup` callbacks are called in the same order as the calls to +`Meteor.startup` were made. + +On a client, `startup` callbacks from packages will be called +first, followed by `` templates from your `.html` files, +followed by your application code. + +::: code-group + +```js [server.js] +import { Meteor } from "meteor/meteor"; +import { LinksCollection } from "/imports/api/links"; + +Meteor.startup(async () => { + // If the Links collection is empty, add some data. + if ((await LinksCollection.find().countAsync()) === 0) { + await LinksCollection.insertAsync({ + title: "Do the Tutorial", + url: "https://www.meteor.com/tutorials/react/creating-an-app", + }); + } +}); +``` + +```js [client.js] +import React from "react"; +import { createRoot } from "react-dom/client"; +import { Meteor } from "meteor/meteor"; +import { App } from "/imports/ui/App"; + +// Setup react root +Meteor.startup(() => { + const container = document.getElementById("react-target"); + const root = createRoot(container); + root.render(); +}); +``` + +::: + + + + + + + + + + + +::: danger +`Meteor.isServer` can be used to limit where code runs, but it does not prevent code from +being sent to the client. Any sensitive code that you don’t want served to the client, +such as code containing passwords or authentication mechanisms, +should be kept in the `server` directory. +::: + + + + + + + + + + + +### Method APIs {#methods} + +Meteor Methods are Remote Procedure Calls (RPCs) are functions defined by `Meteor.methods` +and called by [`Meteor.call`](#Meteor-call). + + + +The most basic way to define a method is to provide a function: + +::: code-group + +```js [server.js] +import { Meteor } from "meteor/meteor"; + +Meteor.methods({ + sum(a, b) { + return a + b; + }, +}); +``` + +```js [client.js] +import { Meteor } from "meteor/meteor"; + +const result = await Meteor.callAsync("sum", 1, 2); +console.log(result); // 3 +``` + +::: + +You can use `Meteor.methods` to define multiple methods at once. + +You can think of `Meteor.methods` as a way of defining a remote object that is your server API. + +A more complete example: + +::: code-group + +```js [server.js] +import { Meteor } from "meteor/meteor"; +import { check } from "meteor/check"; +import { LinksCollection } from "/imports/api/links"; + +Meteor.methods({ + async addLink(link) { + check(link, String); // check if the link is a string + + // Do stuff... + const linkID = await LinksCollection.insertAsync(link); + if (/* you want to throw an error */) { + throw new Meteor.Error('Something is wrong', "Some details"); + } + + return linkID; + }, + + bar() { + // Do other stuff... + return 'baz'; + } +}); +``` + +```js [client.js] +import React from "react"; +import { Meteor } from "meteor/meteor"; + +function Component() { + const addLink = () => + Meteor.callAsync( + "addLink", + "https://www.meteor.com/tutorials/react/creating-an-app" + ); + + return ( +
+ +
+ ); +} +``` + +::: + +Calling `methods` on the server defines functions that can be called remotely by +clients. They should return an [EJSON](./EJSON)-able value or throw an +exception. Inside your method invocation, `this` is bound to a method +invocation object, which provides the following: + +- `isSimulation`: a boolean value, true if this invocation is a stub. +- `unblock`: when called, allows the next method from this client to + begin running. +- `userId`: the id of the current user. +- `setUserId`: a function that associates the current client with a user. +- `connection`: on the server, the [connection](#Meteor-onConnection) this method call was received on. + +Calling `methods` on the client defines _stub_ functions associated with +server methods of the same name. You don't have to define a stub for +your method if you don't want to. In that case, method calls are just +like remote procedure calls in other systems, and you'll have to wait +for the results from the server. + +If you do define a stub, when a client invokes a server method it will +also run its stub in parallel. On the client, the return value of a +stub is ignored. Stubs are run for their side-effects: they are +intended to _simulate_ the result of what the server's method will do, +but without waiting for the round trip delay. If a stub throws an +exception it will be logged to the console. + +You use methods all the time, because the database mutators +([`insert`](./collections#Mongo-Collection-insert), [`update`](./collections#Mongo-Collection-update), [`remove`](./collections#Mongo-Collection-remove)) are implemented +as methods. When you call any of these functions on the client, you're invoking +their stub version that update the local cache, and sending the same write +request to the server. When the server responds, the client updates the local +cache with the writes that actually occurred on the server. + +You don't have to put all your method definitions into a single `Meteor.methods` +call; you may call it multiple times, as long as each method has a unique name. + +If a client calls a method and is disconnected before it receives a response, +it will re-call the method when it reconnects. This means that a client may +call a method multiple times when it only means to call it once. If this +behavior is problematic for your method, consider attaching a unique ID +to each method call on the client, and checking on the server whether a call +with this ID has already been made. Alternatively, you can use +[`Meteor.apply`](#Meteor-apply) with the noRetry option set to true. + +Read more about methods and how to use them in the [Methods](http://guide.meteor.com/methods.html) article in the Meteor Guide. + + + +This method can be used to determine if the current method invocation is +asynchronous. It returns true if the method is running on the server and came from +an async call(`Meteor.callAsync`) + +::: code-group + +```js [server.js] +import { Meteor } from "meteor/meteor"; + +Meteor.methods({ + async foo() { + return Meteor.isAsyncCall(); + }, +}); +``` + +```js [client.js] +import { Meteor } from "meteor/meteor"; + +const result = await Meteor.callAsync("foo"); +console.log(result); // true + +Meteor.call("foo", (err, result) => { + console.log(result); // false +}); +``` + +::: + +## this.userId {#methods-userId} + +The user id is an arbitrary string — typically the id of the user record +in the database. You can set it with the `setUserId` function. If you're using +the [Meteor accounts system](./accounts.md) then this is handled for you. + +```js +import { Meteor } from "meteor/meteor"; + +Meteor.methods({ + foo() { + console.log(this.userId); + }, +}); +``` + +## this.setUserId {#methods-setUserId} + +Call this function to change the currently logged-in user on the +connection that made this method call. This simply sets the value of +`userId` for future method calls received on this connection. Pass +`null` to log out the connection. + +If you are using the [built-in Meteor accounts system](./accounts) then this +should correspond to the `_id` field of a document in the +[`Meteor.users`](./accounts.md#Meteor-user) collection. + +`setUserId` is not retroactive. It affects the current method call and +any future method calls on the connection. Any previous method calls on +this connection will still see the value of `userId` that was in effect +when they started. + +If you also want to change the logged-in user on the client, then after calling +`setUserId` on the server, call `Meteor.connection.setUserId(userId)` on the +client. + +```js +import { Meteor } from "meteor/meteor"; + +Meteor.methods({ + foo() { + this.setUserId("some-id"); + }, +}); +``` + +## this.connection {#methods-connection} + +Access inside a method invocation. The [connection](#Meteor-onConnection) that this method was received on. +null if the method is not associated with a connection, +eg. a server initiated method call. Calls to methods +made from a server method which was in turn initiated from the client share the same +connection. + + + +For example: + +::: code-group + +```js [server.js] +import { Meteor } from "meteor/meteor"; +// on the server, pick a code unique to this error +// the reason field should be a useful debug message +Meteor.methods({ + methodName() { + throw new Meteor.Error( + "logged-out", + "The user must be logged in to post a comment." + ); + }, +}); +``` + +```js [client.js] +import { Meteor } from "meteor/meteor"; +// on the client +Meteor.call("methodName", function (error) { + // identify the error + if (error && error.error === "logged-out") { + // show a nice error message + Session.set("errorMessage", "Please log in to post a comment."); + } +}); +``` + +::: + +If you want to return an error from a method, throw an exception. Methods can +throw any kind of exception. But `Meteor.Error` is the only kind of error that +a server will send to the client. If a method function throws a different +exception, then it will be mapped to a sanitized version on the +wire. Specifically, if the `sanitizedError` field on the thrown error is set to +a `Meteor.Error`, then that error will be sent to the client. Otherwise, if no +sanitized version is available, the client gets +`Meteor.Error(500, 'Internal server error')`. + + + +This is how to invoke a method with a sync stub. It will run the method on the server. If a +stub is available, it will also run the stub on the client. (See also +[`Meteor.apply`](#Meteor-apply), which is identical to `Meteor.call` except that +you specify the parameters as an array instead of as separate arguments and you +can specify a few options controlling how the method is executed.) + +If you include a callback function as the last argument (which can't be +an argument to the method, since functions aren't serializable), the +method will run asynchronously: it will return nothing in particular and +will not throw an exception. When the method is complete (which may or +may not happen before `Meteor.call` returns), the callback will be +called with two arguments: `error` and `result`. If an error was thrown, +then `error` will be the exception object. Otherwise, `error` will be +`undefined` and the return value (possibly `undefined`) will be in `result`. + +```js +// Asynchronous call +Meteor.call('foo', 1, 2, (error, result) => { ... }); +``` + +If you do not pass a callback on the server, the method invocation will +block until the method is complete. It will eventually return the +return value of the method, or it will throw an exception if the method +threw an exception. (Possibly mapped to 500 Server Error if the +exception happened remotely and it was not a `Meteor.Error` exception.) + +```js +// Synchronous call +const result = Meteor.call("foo", 1, 2); +``` + +On the client, if you do not pass a callback and you are not inside a +stub, `call` will return `undefined`, and you will have no way to get +the return value of the method. That is because the client doesn't have +fibers, so there is not actually any way it can block on the remote +execution of a method. + +Finally, if you are inside a stub on the client and call another +method, the other method is not executed (no RPC is generated, nothing +"real" happens). If that other method has a stub, that stub stands in +for the method and is executed. The method call's return value is the +return value of the stub function. The client has no problem executing +a stub synchronously, and that is why it's okay for the client to use +the synchronous `Meteor.call` form from inside a method body, as +described earlier. + +Meteor tracks the database writes performed by methods, both on the client and +the server, and does not invoke `asyncCallback` until all of the server's writes +replace the stub's writes in the local cache. In some cases, there can be a lag +between the method's return value being available and the writes being visible: +for example, if another method still outstanding wrote to the same document, the +local cache may not be up to date until the other method finishes as well. If +you want to process the method's result as soon as it arrives from the server, +even if the method's writes are not available yet, you can specify an +`onResultReceived` callback to [`Meteor.apply`](#Meteor-apply). + + + +`Meteor.callAsync` is just like `Meteor.call`, except that it'll return a promise that you need to solve to get the result. + + + +`Meteor.apply` is just like `Meteor.call`, except that the method arguments are +passed as an array rather than directly as arguments, and you can specify +options about how the client executes the method. + + + +`Meteor.applyAsync` is just like `Meteor.apply`, except it is an async function, and it will consider that the stub is async. + +### Publish and subscribe {#pubsub} + +These functions control how Meteor servers publish sets of records and +how clients can subscribe to those sets. + + +To publish records to clients, call `Meteor.publish` on the server with +two parameters: the name of the record set, and a _publish function_ +that Meteor will call each time a client subscribes to the name. + +Publish functions can return a +[`Collection.Cursor`](./collections.md#mongo_cursor), in which case Meteor +will publish that cursor's documents to each subscribed client. You can +also return an array of `Collection.Cursor`s, in which case Meteor will +publish all of the cursors. + +::: warning +If you return multiple cursors in an array, they currently must all be from +different collections. We hope to lift this restriction in a future release. +::: + + + + + +```js +import { Meteor } from "meteor/meteor"; +import { check } from "meteor/check"; +import { Rooms } from "/imports/api/Rooms"; +import { Messages } from "/imports/api/Messages"; + +// Server: Publish the `Rooms` collection, minus secret info... +Meteor.publish("rooms", function () { + return Rooms.find( + {}, + { + fields: { secretInfo: 0 }, + } + ); +}); + +// ...and publish secret info for rooms where the logged-in user is an admin. If +// the client subscribes to both publications, the records are merged together +// into the same documents in the `Rooms` collection. Note that currently object +// values are not recursively merged, so the fields that differ must be top +// level fields. +Meteor.publish("adminSecretInfo", function () { + return Rooms.find( + { admin: this.userId }, + { + fields: { secretInfo: 1 }, + } + ); +}); + +// Publish dependent documents and simulate joins. +Meteor.publish("roomAndMessages", function (roomId) { + check(roomId, String); + + return [ + Rooms.find( + { _id: roomId }, + { + fields: { secretInfo: 0 }, + } + ), + Messages.find({ roomId }), + ]; +}); +``` + +Alternatively, a publish function can directly control its published record set +by calling the functions [`added`](#Subscription-added) (to add a new document to the +published record set), [`changed`](#Subscription-changed) (to change or clear some +fields on a document already in the published record set), and +[`removed`](#Subscription-removed) (to remove documents from the published record +set). These methods are provided by `this` in your publish function. + +If a publish function does not return a cursor or array of cursors, it is +assumed to be using the low-level `added`/`changed`/`removed` interface, and it +**must also call [`ready`](#Subscription-ready) once the initial record set is +complete**. + +::: code-group + +```js [collections.js] +import { Mongo } from "meteor/mongo"; + +export const Rooms = new Mongo.Collection("rooms"); +export const SecretData = new Mongo.Collection("messages"); +``` + +```js [server.js] +import { Meteor } from "meteor/meteor"; +import { check } from "meteor/check"; +import { Rooms, SecretData } from "/imports/api/collections"; + +// Publish the current size of a collection. +Meteor.publish("countsByRoom", function (roomId) { + check(roomId, String); + + let count = 0; + let initializing = true; + + // `observeChanges` only returns after the initial `added` callbacks have run. + // Until then, we don't want to send a lot of `changed` messagesβ€”hence + // tracking the `initializing` state. + const handle = Messages.find({ roomId }).observeChanges({ + added: (id) => { + count += 1; + + if (!initializing) { + this.changed("counts", roomId, { count }); + } + }, + + removed: (id) => { + count -= 1; + this.changed("counts", roomId, { count }); + }, + + // We don't care about `changed` events. + }); + + // Instead, we'll send one `added` message right after `observeChanges` has + // returned, and mark the subscription as ready. + initializing = false; + this.added("counts", roomId, { count }); + this.ready(); + + // Stop observing the cursor when the client unsubscribes. Stopping a + // subscription automatically takes care of sending the client any `removed` + // messages. + this.onStop(() => handle.stop()); +}); + +// Sometimes publish a query, sometimes publish nothing. +Meteor.publish("secretData", function () { + if (this.userId === "superuser") { + return SecretData.find(); + } else { + // Declare that no data is being published. If you leave this line out, + // Meteor will never consider the subscription ready because it thinks + // you're using the `added/changed/removed` interface where you have to + // explicitly call `this.ready`. + return []; + } +}); +``` + +```js [client.js] +import { Meteor } from "meteor/meteor"; +import { Mongo } from "meteor/mongo"; +import { Session } from "meteor/session"; +// Declare a collection to hold the count object. +const Counts = new Mongo.Collection("counts"); + +// Subscribe to the count for the current room. +Tracker.autorun(() => { + Meteor.subscribe("countsByRoom", Session.get("roomId")); +}); + +// Use the new collection. +const roomCount = Counts.findOne(Session.get("roomId")).count; +console.log(`Current room has ${roomCount} messages.`); +``` + +::: warning + +Meteor will emit a warning message if you call `Meteor.publish` in a +project that includes the `autopublish` package. Your publish function +will still work. + +::: + +Read more about publications and how to use them in the +[Data Loading](http://guide.meteor.com/data-loading.html) article in the Meteor Guide. + + + +This is constant. However, if the logged-in user changes, the publish +function is rerun with the new value, assuming it didn't throw an error at the previous run. + + + + + + + +If you call [`observe`](./collections.md#Mongo-Cursor-observe) or [`observeChanges`](./collections.md#Mongo-Cursor-observeChanges) in your +publish handler, this is the place to stop the observes. + + + + + + + +When you subscribe to a record set, it tells the server to send records to the +client. The client stores these records in local [Minimongo collections](./collections.md), with the same name as the `collection` +argument used in the publish handler's [`added`](#Subscription-added), +[`changed`](#Subscription-changed), and [`removed`](#Subscription-removed) +callbacks. Meteor will queue incoming records until you declare the +[`Mongo.Collection`](./collections.md) on the client with the matching +collection name. + +```js +// It's okay to subscribe (and possibly receive data) before declaring the +// client collection that will hold it. Assume 'allPlayers' publishes data from +// the server's 'players' collection. +Meteor.subscribe("allPlayers"); + +// The client queues incoming 'players' records until the collection is created: +const Players = new Mongo.Collection("players"); +``` + +The client will see a document if the document is currently in the published +record set of any of its subscriptions. If multiple publications publish a +document with the same `_id` for the same collection the documents are merged for +the client. If the values of any of the top level fields conflict, the resulting +value will be one of the published values, chosen arbitrarily. + +::: warning +Currently, when multiple subscriptions publish the same document _only the top +level fields_ are compared during the merge. This means that if the documents +include different sub-fields of the same top level field, not all of them will +be available on the client. We hope to lift this restriction in a future release. +::: + +The `onReady` callback is called with no arguments when the server [marks the subscription as ready](#Subscription-ready). The `onStop` callback is called with +a [`Meteor.Error`](#Meteor-Error) if the subscription fails or is terminated by +the server. If the subscription is stopped by calling `stop` on the subscription +handle or inside the publication, `onStop` is called with no arguments. + +`Meteor.subscribe` returns a subscription handle, which is an object with the +following properties: + +```ts +import { Meteor } from "meteor/meteor"; +const handle = Meteor.subscribe("allPlayers"); + +handle.ready(); // True when the server has marked the subscription as ready + +handle.stop(); // Stop this subscription and unsubscribe from the server + +handle.subscriptionId; // The id of the subscription this handle is for. +``` + +When you run Meteor.subscribe inside of Tracker.autorun, the handles you get will always have the same subscriptionId field. +You can use this to deduplicate subscription handles if you are storing them in some data structure. + +If you call `Meteor.subscribe` within a reactive computation, +for example using +[`Tracker.autorun`](./Tracker#Tracker-autorun), the subscription will automatically be +cancelled when the computation is invalidated or stopped; it is not necessary +to call `stop` on +subscriptions made from inside `autorun`. However, if the next iteration +of your run function subscribes to the same record set (same name and +parameters), Meteor is smart enough to skip a wasteful +unsubscribe/resubscribe. For example: + +```js +Tracker.autorun(() => { + Meteor.subscribe("chat", { room: Session.get("currentRoom") }); + Meteor.subscribe("privateMessages"); +}); +``` + +This subscribes you to the chat messages in the current room and to your private +messages. When you change rooms by calling `Session.set('currentRoom', +'newRoom')`, Meteor will subscribe to the new room's chat messages, +unsubscribe from the original room's chat messages, and continue to +stay subscribed to your private messages. + +## Publication strategies + +> The following features are available from Meteor 2.4 or `ddp-server@2.5.0` + +Once you start scaling your application you might want to have more control on how the data from publications is being handled on the client. +There are three publications strategies: + +#### SERVER_MERGE + +`SERVER_MERGE` is the default strategy. When using this strategy, the server maintains a copy of all data a connection is subscribed to. +This allows us to only send deltas over multiple publications. + +#### NO_MERGE_NO_HISTORY + +The `NO_MERGE_NO_HISTORY` strategy results in the server sending all publication data directly to the client. +It does not remember what it has previously sent to client and will not trigger removed messages when a subscription is stopped. +This should only be chosen for special use cases like send-and-forget queues. + +#### NO_MERGE + +`NO_MERGE` is similar to `NO_MERGE_NO_HISTORY` but the server will remember the IDs it has +sent to the client so it can remove them when a subscription is stopped. +This strategy can be used when a collection is only used in a single publication. + +When `NO_MERGE` is selected the client will be handling gracefully duplicate events without throwing an exception. +Specifically: + +- When we receive an added message for a document that is already present in the client's collection, it will be changed. +- When we receive a change message for a document that is not in the client's collection, it will be added. +- When we receive a removed message for a document that is not in the client's collection, nothing will happen. + +You can import the publication strategies from `DDPServer`. + +```js +import { DDPServer } from "meteor/ddp-server"; + +const { SERVER_MERGE, NO_MERGE_NO_HISTORY, NO_MERGE } = + DDPServer.publicationStrategies; +``` + +You can use the following methods to set or get the publication strategy for publications: + + + +For the `foo` collection, you can set the `NO_MERGE` strategy as shown: + +```js +import { DDPServer } from "meteor/ddp-server"; +Meteor.server.setPublicationStrategy( + "foo", + DDPServer.publicationStrategies.NO_MERGE +); +``` + + + +### Server connections {#connections} + +Functions to manage and inspect the network connection between the Meteor client and server. + + + +```js +import { Meteor } from "meteor/meteor"; +const status = Meteor.status(); + +console.log(status); +// ^^^^ +// { +// connected: Boolean, +// status: String, +// retryCount: Number, +// retryTime: Number, +// reason: String, +// } +``` + +Status object has the following fields: + +- `connected` - _*Boolean*_ : True if currently connected to the server. If false, changes and + method invocations will be queued up until the connection is reestablished. +- `status` - _*String*_: Describes the current reconnection status. The possible + values are `connected` (the connection is up and + running), `connecting` (disconnected and trying to open a + new connection), `failed` (permanently failed to connect; e.g., the client + and server support different versions of DDP), `waiting` (failed + to connect and waiting to try to reconnect) and `offline` (user has disconnected the connection). +- `retryCount` - _*Number*_: The number of times the client has tried to reconnect since the + connection was lost. 0 when connected. +- `retryTime` - _*Number or undefined*_: The estimated time of the next reconnection attempt. To turn this + into an interval until the next reconnection, This key will be set only when `status` is `waiting`. + You canuse this snippet: + ```js + retryTime - new Date().getTime(); + ``` +- `reason` - _*String or undefined*_: If `status` is `failed`, a description of why the connection failed. + + + + + +Call this method to disconnect from the server and stop all +live data updates. While the client is disconnected it will not receive +updates to collections, method calls will be queued until the +connection is reestablished, and hot code push will be disabled. + +Call [Meteor.reconnect](#Meteor-reconnect) to reestablish the connection +and resume data transfer. + +This can be used to save battery on mobile devices when real time +updates are not required. + + + +```js +import { Meteor } from "meteor/meteor"; + +const handle = Meteor.onConnection((connection) => { + console.log(connection); + // ^^^^^^^^^^^ + // { + // id: String, + // close: Function, + // onClose: Function, + // clientAddress: String, + // httpHeaders: Object, + // } +}); + +handle.stop(); // Unregister the callback +``` + +`onConnection` returns an object with a single method `stop`. Calling +`stop` unregisters the callback, so that this callback will no longer +be called on new connections. + +The callback is called with a single argument, the server-side +`connection` representing the connection from the client. This object +contains the following fields: + +- `id` - _*String*_: A globally unique id for this connection. +- `close` - _*Function*_: Close this DDP connection. The client is free to reconnect, but will + receive a different connection with a new `id` if it does. +- `onClose` - _*Function*_: Register a callback to be called when the connection is closed. + If the connection is already closed, the callback will be called immediately. +- `clientAddress` - _*String*_: The IP address of the client in dotted form (such as `127.0.0.1`). If you're running your Meteor server behind a proxy (so that clients + are connecting to the proxy instead of to your server directly), + you'll need to set the `HTTP_FORWARDED_COUNT` environment variable + for the correct IP address to be reported by `clientAddress`. + + Set `HTTP_FORWARDED_COUNT` to an integer representing the number of + proxies in front of your server. For example, you'd set it to `1` + when your server was behind one proxy. + +- `httpHeaders` - _*Object*_: When the connection came in over an HTTP transport (such as with + Meteor's default SockJS implementation), this field contains + whitelisted HTTP headers. + + Cookies are deliberately excluded from the headers as they are a + security risk for this transport. For details and alternatives, see + the [SockJS documentation](https://github.com/sockjs/sockjs-node#authorisation). + +> Currently when a client reconnects to the server (such as after +> temporarily losing its Internet connection), it will get a new +> connection each time. The `onConnection` callbacks will be called +> again, and the new connection will have a new connection `id`. + +> In the future, when client reconnection is fully implemented, +> reconnecting from the client will reconnect to the same connection on +> the server: the `onConnection` callback won't be called for that +> connection again, and the connection will still have the same +> connection `id`. + + + +```js +import { DDP } from "meteor/ddp-client"; +import { Mongo } from "meteor/mongo"; +import { Meteor } from "meteor/meteor"; +const options = {...}; + +const otherServer = DDP.connect("http://example.com", options); + +otherServer.call("foo.from.other.server", 1, 2, function (err, result) { + // ... +}); + +Metepr.call("foo.from.this.server", 1, 2, function (err, result) { + // ... +}); +const remoteColl = new Mongo.Collection("collectionName", { connection: otherServer }); +remoteColl.find(...); + + +``` + +To call methods on another Meteor application or subscribe to its data +sets, call `DDP.connect` with the URL of the application. +`DDP.connect` returns an object which provides: + +- `subscribe` - + Subscribe to a record set. See + [Meteor.subscribe](#Meteor-subscribe). +- `call` - + Invoke a method. See [Meteor.call](#Meteor-call). +- `apply` - + Invoke a method with an argument array. See + [Meteor.apply](#Meteor-apply). +- `methods` - + Define client-only stubs for methods defined on the remote server. See + [Meteor.methods](#Meteor-methods). +- `status` - + Get the current connection status. See + [Meteor.status](#Meteor-status). +- `reconnect` - + See [Meteor.reconnect](#Meteor-reconnect). +- `disconnect` - + See [Meteor.disconnect](#Meteor-disconnect). + +By default, clients open a connection to the server from which they're loaded. +When you call `Meteor.subscribe`, `Meteor.status`, `Meteor.call`, and +`Meteor.apply`, you are using a connection back to that default +server. + + + +## Timers { #timers } + +Meteor uses global environment variables +to keep track of things like the current request's user. To make sure +these variables have the right values, you need to use +`Meteor.setTimeout` instead of `setTimeout` and `Meteor.setInterval` +instead of `setInterval`. + +These functions work just like their native JavaScript equivalents. +If you call the native function, you'll get an error stating that Meteor +code must always run within a Fiber, and advising to use +`Meteor.bindEnvironment`. + + + +Returns a handle that can be used by `Meteor.clearTimeout`. + + + +Returns a handle that can be used by `Meteor.clearInterval`. + + + + +## Enviroment variables {#envs} + +teor runs most app code within Fibers, which allows keeping track of the context a function is running in. `Meteor.EnvironmentVariable` works with `Meteor.bindEnvironment`, promises, and many other Meteor API's to preserve the context in async code. Some examples of how it is used in Meteor are to store the current user in methods, and record which arguments have been checked when using `audit-argument-checks`. + +```js +import { Meteor } from "meteor/meteor"; +const currentRequest = new Meteor.EnvironmentVariable(); + +function log(message) { + const requestId = currentRequest.get() || "None"; + console.log(`[${requestId}]`, message); +} + +currentRequest.withValue("12345", () => { + log("Handling request"); // Logs: [12345] Handling request +}); +``` + + + + + + + diff --git a/v3-docs/docs/api/package.md b/v3-docs/docs/api/package.md new file mode 100644 index 00000000000..606f0c8f1a3 --- /dev/null +++ b/v3-docs/docs/api/package.md @@ -0,0 +1,482 @@ +# Package.js + +A package is a directory containing a package.js file, which +contains roughly three major sections: a basic description, a package +definition, and a test definition. By default, the directory name is the name of +the package. + +The `package.js` file below is an example of how to use the packaging API. The +rest of this section will explain the specific API commands in greater detail. + +```js +// Information about this package: +Package.describe({ + // Short two-sentence summary + summary: 'What this does', + // Version number + version: '1.0.0', + // Optional, default is package directory name + name: 'username:package-name', + // Optional GitHub URL to your source repository + git: 'https://github.com/something/something.git' +}); + +// This defines your actual package: +Package.onUse((api) => { + // If no version is specified for an `api.use` dependency, use the one defined + // in Meteor 1.12.1. + api.versionsFrom('1.12.1'); + // Use the `underscore` package, but only on the server. Version not + // specified, so it will be as of Meteor 1.12.1. + api.use('underscore', 'server'); + // Use `ostrio:flow-router-extra`, version 3.9.0 or newer. + api.use('ostrio:flow-router-extra@3.9.0'); + // Give users of this package access to active-route's JavaScript helpers. + api.imply('zimme:active-route@2.3.2') + // Export the object `Email` to packages or apps that use this package. + api.export('Email', 'server'); + // Specify the source code for the package. + api.addFiles('email.js', 'server'); + // When using `ecmascript` or `modules` packages, you can use this instead of + // `api.export` and `api.addFiles`. + api.mainModule('email.js', 'server'); +}); + +// This defines the tests for the package: +Package.onTest((api) => { + // Sets up a dependency on this package. + api.use('username:package-name'); + // Use the Mocha test framework. + api.use('practicalmeteor:mocha@2.4.5_6'); + // Specify the source code for the package tests. + api.addFiles('email_tests.js', 'server'); +}); + +// This lets you use npm packages in your package: +Npm.depends({ + simplesmtp: '0.3.10', + 'stream-buffers': '0.2.5' +}); +``` + +`api.mainModule` is documented in the [modules](../packages/modules.md#modular-application-structure) section. + +Build plugins are created with +[`Package.registerBuildPlugin`](#PackageNamespace-registerBuildPlugin). See the +coffeescript package for an example. Build plugins are fully-fledged Meteor +programs in their own right and have their own namespace, package dependencies, +source files and npm requirements. + +> You can use local packages to define custom build plugins +for your app, with one caveat. In published packages, build plugins are already +bundled with their transitive dependencies. So if you want a dependency of a +build plugin to be satisfied by a local package, you must use a local copy of +the package that defines the plugin (even if you make no changes to that +package) so that Meteor will pick up the local dependency. + +> In a lifecycle of a package there might come time to end the development for various reasons, or +it gets superseded. In either case Meteor allows you to easily notify the users of the package by +setting the deprecated flag to true: `deprecated: true` in the package description. In addition, you +replace it with a string that tells the users where to find replacement or what to do. + +Provide basic package information with `Package.describe(options)`. To publish a +package, you must define `summary` and `version`. + + + +Define dependencies and expose package methods with the +`Package.onUse` handler. This section lets you define what packages your package +depends on, what packages are implied by your package, and what object your +package is exported to. + + + + + +> Choose Meteor versions carefully. First determine the minimum version of Meteor you need for the API you use in your package. + This should be based on specific needs of your package like needed the *Async calls, which would require minimum version to be + at least 2.8. Another example are where packages had a major version bump, for example this has happened with the accounts packages + in Meteor 2.3. If you want to be backward and forward compatible it is good to include Meteor version before 2.3 and then 2.3.6 in the array. + A general recommendation for most compatibility for accounts packages (unless you need API that was affected in Meteor 2.3) is to have the following + array in `versionsFrom`: `['1.12.1', '2.3.6', '2.8.1']`, this gives us the widest range. For general packages you can leave out version `2.3.6`. + If you want the widest compatibility range it is recommended that the lowest be `1.12.1` and that you also include another + version near the current version of Meteor. + + + + + + + +Set up your tests with the `Package.onTest` handler, which has an interface +that's parallel to that of the `onUse` handler. The tests will need to depend on +the package that you have just created. For example, if your package is the +`email` package, you have to call `api.use('email')` in order to test the +package. + +If you used `meteor create` to set up your package, Meteor will create the +required scaffolding in `package.js`, and you'll only need to add unit test code +in the `_test.js` file that was created. + + + +Meteor packages can include NPM packages and Cordova plugins by using +`Npm.depends` and `Cordova.depends` in the `package.js` file. + + + + + + + +## Options + +In some cases we need to offer options in packages where these options are not going to change in runtime. + +We prefer to have these options defined in a configuration file instead of using JS code to call specific functions to define options in runtime. + +For example, in `quave:collections` package you can force collections to be available only in the server like this: + +```json + "packages": { + "quave:collections": { + "isServerOnly": true + } + } +``` + +We encourage every package author to follow this standard to offer options: + +1. Use the official Meteor `settings` file +2. Inside the `settings` file read from a `Meteor`.`packages`.``.`` + > If it needs to be available in the client follow the same structure inside the `public` key. + +You can use [quave:settings](https://github.com/quavedev/settings) package to read options in the format above already merging the private and public options. + +This way we avoid having to call a specific code before another specific code in a package as the setting is stored in the settings, and the package can load it when necessary instead of relying on a specific order of calls from the developer in the app code. + +> We've started to adopt this standard also in core packages on Meteor 1.10.2. + + + +## Build Plugins API {#build-plugin-api} + +Meteor packages can provide build plugins - programs that integrate with the +build tool Isobuild used to compile and bundle your application. + +Starting with Meteor 1.2, the API used to plug into the build process is called +"Build Plugins". There are 3 phases when a package's plugin can run: linting, +compilation and minification. Here is an overview of operations Isobuild +performs on the application and packages source: + +1. Gather source files from the app folder or read `package.js` file for a + package. +2. Lint all source files and print the linting warnings. +3. Compile the source files like CoffeeScript, ES2015, Less, or Templates to plain + JavaScript and CSS. +4. Link the JavaScript files: wrap them into closures and provide necessary + package imports. +5. Minify JavaScript and CSS files. Can also include concatenation of all files. + +Build plugins fill the phases 2, 3 and 5. + +Usually build plugins implement a class that is given a list of files to +process. Commonly, such files have the following methods: + + - `getContentsAsBuffer` - Returns the full contents of the file as a buffer. + - `getContentsAsString` - Returns the full contents of the file as a string. + - `getPackageName` - Returns the name of the package or `null` if the file is not in a package. + - `getPathInPackage` - Returns the relative path of file to the package or app root directory. The returned path always uses forward slashes. + - `getSourceHash` - Returns a hash string for the file that can be used to implement caching. + - `getArch` - Returns the architecture that is targeted while processing this file. + - `getBasename` - Returns the filename of the file. + - `getDirname` - Returns the directory path relative to the package or app root. The returned path always uses forward slashes. + - `error` - Call this method to raise a compilation or linting error for the file. + + +## Linters {#build-plugin-linters} + +Linters are programs that check the code for undeclared variables or find code +that doesn't correspond to certain style guidelines. Some of the popular +examples of linters are [JSHint](http://jshint.com/about/) and +[ESLint](http://eslint.org/). Some of the non-JavaScript linter examples include +[CoffeeLint](https://github.com/clutchski/coffeelint) for CoffeeScript and +[CSSLint](http://csslint.net/) for CSS. + +To register a linter build plugin in your package, you need to do a couple of +things in your `package.js`: +- depend on the `isobuild:linter-plugin@1.0.0` package +- register a build plugin: `Package.registerBuildPlugin({ name, sources, ... });` + (see [docs](#PackageNamespace-registerBuildPlugin)) + +In your build plugin sources, register a Linter Plugin: provide details such as +a name, list of extensions and filenames the plugin will handle and a factory +function that returns an instance of a linter class. Example: + +```js +Plugin.registerLinter({ + extensions: ['js'], + filenames: ['.linterrc'] +}, () => new MyLinter); +``` + +In this example, we register a linter that runs on all `js` files and also reads +a file named `.linterrc` to get a configuration. + +The `MyLinter` class should now implement the `processFilesForPackage` +method. The method should accept two arguments: a list of files and an options +object. + +```js +class MyLinter { + processFilesForPackage(files, options) { + files.forEach((file) => { + // Lint the file. + const lint = lintFile(file.getContentsAsString()); + + if (lint) { + // If there are linting errors, output them. + const { message, line, column } = lint; + file.error({ message, line, column }); + } + }); + } +} +``` + +The globals are passed in the options object so that the linters can omit the +warnings about the package imports that look like global variables. + +Each file in the list is an object that has all the methods provided by all +build plugins, described above. + +See an example of a linting plugin implemented in Core: [jshint](https://github.com/meteor/meteor/tree/devel/packages/jshint). + + +## Compilers {#build-plugin-compilers} + +Compilers are programs that take the source files and output JavaScript or +CSS. They also can output parts of HTML that is added to the `` tag and +static assets. Examples for the compiler plugins are: CoffeeScript, Babel.js, +JSX compilers, Pug templating compiler and others. + +To register a compiler plugin in your package, you need to do the following in +your `package.js` file: +- depend on the `isobuild:compiler-plugin@1.0.0` package +- register a build plugin: `Package.registerBuildPlugin({ name, sources, ... });` + (see [docs](#PackageNamespace-registerBuildPlugin)) + +In your build plugin source, register a Compiler Plugin: similar to other types +of build plugins, provide the details, extensions and filenames and a factory +function that returns an instance of the compiler. Ex.: + +```js +Plugin.registerCompiler({ + extensions: ['pug', 'tpl.pug'], + filenames: [] +}, () => new PugCompiler); +``` + +The compiler class must implement the `processFilesForTarget` method that is +given the source files for a target (server or client part of the package/app). + +```js +class PugCompiler { + processFilesForTarget(files) { + files.forEach((file) => { + // Process and add the output. + const output = compilePug(file.getContentsAsString()); + + file.addJavaScript({ + data: output, + path: `${file.getPathInPackage()}.js` + }); + }); + } +} +``` + +Besides the common methods available on the input files' class, the following +methods are available: + + - `getExtension` - Returns the extension that matched the compiler plugin. The + longest prefix is preferred. + - `getDeclaredExports` - Returns a list of symbols declared as exports in this + target. The result of `api.export('symbol')` calls in target's control file + such as package.js. + - `getDisplayPath` Returns a relative path that can be used to form error + messages or other display properties. Can be used as an input to a source map. + - `addStylesheet` - Web targets only. Add a stylesheet to the document. Not + available for linter build plugins. + - `addJavaScript` - Add JavaScript code. The code added will only see the + namespaces imported by this package as runtime dependencies using + ['api.use'](#PackageAPI-use). If the file being compiled was added with the + bare flag, the resulting JavaScript won't be wrapped in a closure. + - `addAsset` - Add a file to serve as-is to the browser or to include on the + browser, depending on the target. On the web, it will be served at the exact + path requested. For server targets, it can be retrieved using + `Assets.getTextAsync` or `Assets.getBinaryAsync`. + - `addHtml` - Works in web targets only. Add markup to the `head` or `body` + section of the document. + - `hmrAvailable` - Returns true if the file can be updated with HMR. Among other things, + it checks if HMR supports the current architecture and build mode, and that the unibuild + uses the `hot-module-replacement` package. There are rare situations where `hmrAvailable` + returns true, but when more information is available later in the build process Meteor + decides the file can not be updated with HMR. + - `readAndWatchFileWithHash` - Accepts an absolute path, and returns { contents, hash } + Makes sure Meteor watches the file so any changes to it will trigger a rebuild + +Meteor implements a couple of compilers as Core packages, good examples would be +the +[Blaze templating](https://github.com/meteor/meteor/tree/devel/packages/templating) +package and the +[ecmascript](https://github.com/meteor/meteor/tree/devel/packages/ecmascript) +package (compiles ES2015+ to JavaScript that can run in the browsers). + +## Minifiers {#build-plugin-minifiers} + +Minifiers run last after the sources has been compiled and JavaScript code has +been linked. Minifiers are only ran for the client programs (`web.browser` and +`web.cordova`). + +There are two types of minifiers one can add: a minifier processing JavaScript +(registered extensions: `['js']`) and a minifier processing CSS (extensions: +`['css']`). + +To register a minifier plugin in your package, add the following in your +`package.js` file: +- depend on `isobuild:minifier-plugin@1.0.0` package +- register a build plugin: `Package.registerBuildPlugin({ name, sources, ... });` + (see [docs](#PackageNamespace-registerBuildPlugin)) + +In your build plugin source, register a Minifier Plugin. Similar to Linter and +Compiler plugin, specify the interested extensions (`css` or `js`). The factory +function returns an instance of the minifier class. + +```js +Plugin.registerMinifier({ + extensions: ['js'] +}, () => new UglifyJsMinifier); +``` + +The minifier class must implement the method `processFilesForBundle`. The first +argument is a list of processed files and the options object specifies if the +minifier is ran in production mode or development mode. + +::: info +This method can be asynchronous. If it returns a Promise, the build process will +wait for it to resolve before continuing. +::: + +```js +class UglifyJsMinifier { + processFilesForBundle(files, options) { + const { minifyMode } = options; + + if (minifyMode === 'development') { + // Don't minify in development. + file.forEach((file) => { + file.addJavaScript({ + data: file.getContentsAsBuffer(), + sourceMap: file.getSourceMap(), + path: file.getPathInBundle() + }); + }); + + return; + } + + // Minify in production. + files.forEach((file) => { + file.addJavaScript({ + data: uglifyjs.minify(file.getContentsAsBuffer()), + path: file.getPathInBundle() + }); + }); + } +} +``` + +In this example, we re-add the same files in the development mode to avoid +unnecessary work and then we minify the files in production mode. + +Besides the common input files' methods, these methods are available: +- `getPathInBundle` - returns a path of the processed file in the bundle. +- `getSourcePath` - returns absolute path of the input file if available, or null. +- `getSourceMap` - returns the source-map for the processed file if there is such. +- `addJavaScript` - same as compilers +- `addStylesheet` - same as compilers +- `readAndWatchFileWithHash` - only available for css minifiers. Same as compilers. + +Right now, Meteor Core ships with the `standard-minifiers` package that can be +replaced with a custom one. The +[source](https://github.com/meteor/meteor/tree/devel/packages/standard-minifiers) +of the package is a good example how to build your own minification plugin. + +In development builds, minifiers must meet these requirements to not prevent hot module replacement: + +- Call `addJavasScript` once for each file to add the file's contents +- The contents of the files are not modified + +In the future Meteor will allow minifiers to concatenate or modify files in development without affected hot module replacement. + + +## Caching {#build-plugin-caching} + +Since the API allows build plugins to process multiple files at once, we encourage package authors to implement at least some in-memory caching for their plugins. Using the `getSourceHash` function for linters and compilers will allow quick incremental recompilations if the file is not reprocessed even when the contents didn't change. + +For the fast rebuilds between the Isobuild process runs, plugins can implement on-disk caching. If a plugin implements the `setDiskCacheDirectory` method, it will be called from time to time with a new path on disk where the plugin can write its offline cache. The folder is correctly reset when the plugin is rebuilt or cache should be invalidated for any reason (for example, picked package versions set has changed). + +### Caching Compiler {#build-plugin-caching-compiler} + +There is a core package called `caching-compiler` that implements most of the common logic of keeping both in-memory and on-disk caches. The easiest way to implement caching correctly is to subclass the `CachingCompiler` or `MultiFileCachingCompiler` class from this package in your build plugin. `CachingCompiler` is for compilers that consider each file completely independently; `MultiFileCachingCompiler` is for compilers that allow files to reference each other. To get this class in your plugin namespace, add a dependency to the plugin definition: + +```js +Package.registerBuildPlugin({ + name: 'compileGG', + use: ['caching-compiler@1.0.0'], + sources: ['plugin/compile-gg.js'] +}); +``` + +## Accessing File System {#build-plugin-file-system} + +Since the build plugins run as part of the Meteor tool, they follow the same file-system access convention - all file system paths always look like a Unix path: using forward slashes and having a root at '/', even on Windows. For example: paths `/usr/bin/program` and `/C/Program Files/Program/program.exe` are valid paths, and `C:\Program Files\Program\program.exe` is not. + +So whenever you get a path in your build plugin implementation, via `getPathInPackage` or in an argument of the `setDiskCacheDirectory` method, the path will be a Unix path. + +Now, on running on Windows, the usual node modules `fs` and `path` expect to get a DOS path. To assist you to write correct code, the `Plugin` symbol provides its own versions of `fs` and `path` that you can use instead (note that all methods on `fs` are fiberized and sync versions prefer using Fibers rather than freezing the whole event loop). + +Also `Plugin` provides helper functions `convertToStandardPath` and `convertToOSPath` to convert to a Unix path or to the path expected by the node libraries regardless of the path origin. + +Example: + +```js +// On Windows +const fs = Plugin.fs; +const path = Plugin.path; + +const filePath = path.join('/C/Program Files', 'Program/file.txt'); +console.log(filePath); // Prints '/C/Program Files/Program/file.txt' + +fs.writeFileSync(filePath, 'Hello.'); // Writes to 'C:\Program Files\Program\file.txt' + +console.log(Plugin.convertToOsPath(filePath)); // Prints 'C:\Program Files\Program\file.txt' +``` + + +## Isobuild Feature Packages {#isobuild-features} + +Starting with Meteor 1.2, packages can declare that they need a version of the Meteor tool whose Isobuild build system supports a certain feature. For example, packages must write `api.use('isobuild:compiler-plugin@1.0.0')` in order to call `Plugin.registerCompiler`. This means that a package can transition from the old `registerSourceHandler` API to `registerCompiler` and Version Solver will properly prevent the `registerCompiler` version from being chosen by older tools that don't know how to handle it. + +This is the known Isobuild feature "packages" sorted by the first release of Meteor which supports them. + +### Introduced in Meteor 1.2s {#isobuild-features-1.2} + +- `compiler-plugin@1.0.0`: Allows use of `Plugin.registerCompiler`. +- `linter-plugin@1.0.0`: Allows use of `Plugin.registerLinter`. +- `minifier-plugin@1.0.0`: Allows use of `Plugin.registerMinifier`. +- `isopack-2@1.0.0`: This package is published only in `isopack-2` format and won't work in versions +of Meteor that don't support that format. +- `prod-only@1.0.0`: Allows use of the `prodOnly` flag in `Package.describe`. +- `isobuild:cordova@5.4.0`: This package depends on a specific version of Cordova, most likely as a result of the Cordova plugins it depends on. diff --git a/v3-docs/docs/api/packages-listing.md b/v3-docs/docs/api/packages-listing.md new file mode 100644 index 00000000000..416865ca2aa --- /dev/null +++ b/v3-docs/docs/api/packages-listing.md @@ -0,0 +1,152 @@ + + +[//]: # (Do not edit this file by hand.) + +[//]: # (This is a generated file.) + +[//]: # (If you want to change something in this file) + +[//]: # (go to meteor/docs/generators/packages-listing) + +# Core Packages + + +### [blaze](https://github.com/meteor/blaze) {#blaze} +### [react-packages](https://github.com/meteor/react-packages) {#react-packages} +### [accounts-2fa](https://github.com/meteor/meteor/tree/devel/packages/accounts-2fa) {#accounts-2fa} +### [accounts-base](https://github.com/meteor/meteor/tree/devel/packages/accounts-base) {#accounts-base} +### [accounts-facebook](https://github.com/meteor/meteor/tree/devel/packages/accounts-facebook) {#accounts-facebook} +### [accounts-github](https://github.com/meteor/meteor/tree/devel/packages/accounts-github) {#accounts-github} +### [accounts-google](https://github.com/meteor/meteor/tree/devel/packages/accounts-google) {#accounts-google} +### [accounts-meetup](https://github.com/meteor/meteor/tree/devel/packages/accounts-meetup) {#accounts-meetup} +### [accounts-meteor-developer](https://github.com/meteor/meteor/tree/devel/packages/accounts-meteor-developer) {#accounts-meteor-developer} +### [accounts-oauth](https://github.com/meteor/meteor/tree/devel/packages/accounts-oauth) {#accounts-oauth} +### [accounts-password](https://github.com/meteor/meteor/tree/devel/packages/accounts-password) {#accounts-password} +### [accounts-passwordless](https://github.com/meteor/meteor/tree/devel/packages/accounts-passwordless) {#accounts-passwordless} +### [accounts-twitter](https://github.com/meteor/meteor/tree/devel/packages/accounts-twitter) {#accounts-twitter} +### [accounts-ui](https://github.com/meteor/meteor/tree/devel/packages/accounts-ui) {#accounts-ui} +### [accounts-ui-unstyled](https://github.com/meteor/meteor/tree/devel/packages/accounts-ui-unstyled) {#accounts-ui-unstyled} +### [accounts-weibo](https://github.com/meteor/meteor/tree/devel/packages/accounts-weibo) {#accounts-weibo} +### [allow-deny](https://github.com/meteor/meteor/tree/devel/packages/allow-deny) {#allow-deny} +### [audit-argument-checks](https://github.com/meteor/meteor/tree/devel/packages/audit-argument-checks) {#audit-argument-checks} +### [autopublish](https://github.com/meteor/meteor/tree/devel/packages/autopublish) {#autopublish} +### [autoupdate](https://github.com/meteor/meteor/tree/devel/packages/autoupdate) {#autoupdate} +### [babel-compiler](https://github.com/meteor/meteor/tree/devel/packages/babel-compiler) {#babel-compiler} +### [babel-runtime](https://github.com/meteor/meteor/tree/devel/packages/babel-runtime) {#babel-runtime} +### [base64](https://github.com/meteor/meteor/tree/devel/packages/base64) {#base64} +### [binary-heap](https://github.com/meteor/meteor/tree/devel/packages/binary-heap) {#binary-heap} +### [boilerplate-generator](https://github.com/meteor/meteor/tree/devel/packages/boilerplate-generator) {#boilerplate-generator} +### [boilerplate-generator-tests](https://github.com/meteor/meteor/tree/devel/packages/boilerplate-generator-tests) {#boilerplate-generator-tests} +### [browser-policy](https://github.com/meteor/meteor/tree/devel/packages/browser-policy) {#browser-policy} +### [browser-policy-common](https://github.com/meteor/meteor/tree/devel/packages/browser-policy-common) {#browser-policy-common} +### [browser-policy-content](https://github.com/meteor/meteor/tree/devel/packages/browser-policy-content) {#browser-policy-content} +### [browser-policy-framing](https://github.com/meteor/meteor/tree/devel/packages/browser-policy-framing) {#browser-policy-framing} +### [caching-compiler](https://github.com/meteor/meteor/tree/devel/packages/caching-compiler) {#caching-compiler} +### [callback-hook](https://github.com/meteor/meteor/tree/devel/packages/callback-hook) {#callback-hook} +### [check](https://github.com/meteor/meteor/tree/devel/packages/check) {#check} +### [constraint-solver](https://github.com/meteor/meteor/tree/devel/packages/constraint-solver) {#constraint-solver} +### [core-runtime](https://github.com/meteor/meteor/tree/devel/packages/core-runtime) {#core-runtime} +### [crosswalk](https://github.com/meteor/meteor/tree/devel/packages/crosswalk) {#crosswalk} +### [ddp](https://github.com/meteor/meteor/tree/devel/packages/ddp) {#ddp} +### [ddp-client](https://github.com/meteor/meteor/tree/devel/packages/ddp-client) {#ddp-client} +### [ddp-common](https://github.com/meteor/meteor/tree/devel/packages/ddp-common) {#ddp-common} +### [ddp-rate-limiter](https://github.com/meteor/meteor/tree/devel/packages/ddp-rate-limiter) {#ddp-rate-limiter} +### [ddp-server](https://github.com/meteor/meteor/tree/devel/packages/ddp-server) {#ddp-server} +### [deprecated](https://github.com/meteor/meteor/tree/devel/packages/deprecated) {#deprecated} +### [dev-error-overlay](https://github.com/meteor/meteor/tree/devel/packages/dev-error-overlay) {#dev-error-overlay} +### [diff-sequence](https://github.com/meteor/meteor/tree/devel/packages/diff-sequence) {#diff-sequence} +### [disable-oplog](https://github.com/meteor/meteor/tree/devel/packages/disable-oplog) {#disable-oplog} +### [dynamic-import](https://github.com/meteor/meteor/tree/devel/packages/dynamic-import) {#dynamic-import} +### [ecmascript](https://github.com/meteor/meteor/tree/devel/packages/ecmascript) {#ecmascript} +### [ecmascript-runtime](https://github.com/meteor/meteor/tree/devel/packages/ecmascript-runtime) {#ecmascript-runtime} +### [ecmascript-runtime-client](https://github.com/meteor/meteor/tree/devel/packages/ecmascript-runtime-client) {#ecmascript-runtime-client} +### [ecmascript-runtime-server](https://github.com/meteor/meteor/tree/devel/packages/ecmascript-runtime-server) {#ecmascript-runtime-server} +### [ejson](https://github.com/meteor/meteor/tree/devel/packages/ejson) {#ejson} +### [email](https://github.com/meteor/meteor/tree/devel/packages/email) {#email} +### [es5-shim](https://github.com/meteor/meteor/tree/devel/packages/es5-shim) {#es5-shim} +### [facebook-config-ui](https://github.com/meteor/meteor/tree/devel/packages/facebook-config-ui) {#facebook-config-ui} +### [facebook-oauth](https://github.com/meteor/meteor/tree/devel/packages/facebook-oauth) {#facebook-oauth} +### [facts-base](https://github.com/meteor/meteor/tree/devel/packages/facts-base) {#facts-base} +### [facts-ui](https://github.com/meteor/meteor/tree/devel/packages/facts-ui) {#facts-ui} +### [fetch](https://github.com/meteor/meteor/tree/devel/packages/fetch) {#fetch} +### [force-ssl](https://github.com/meteor/meteor/tree/devel/packages/force-ssl) {#force-ssl} +### [force-ssl-common](https://github.com/meteor/meteor/tree/devel/packages/force-ssl-common) {#force-ssl-common} +### [geojson-utils](https://github.com/meteor/meteor/tree/devel/packages/geojson-utils) {#geojson-utils} +### [github-config-ui](https://github.com/meteor/meteor/tree/devel/packages/github-config-ui) {#github-config-ui} +### [github-oauth](https://github.com/meteor/meteor/tree/devel/packages/github-oauth) {#github-oauth} +### [google-config-ui](https://github.com/meteor/meteor/tree/devel/packages/google-config-ui) {#google-config-ui} +### [google-oauth](https://github.com/meteor/meteor/tree/devel/packages/google-oauth) {#google-oauth} +### [hot-code-push](https://github.com/meteor/meteor/tree/devel/packages/hot-code-push) {#hot-code-push} +### [hot-module-replacement](https://github.com/meteor/meteor/tree/devel/packages/hot-module-replacement) {#hot-module-replacement} +### [id-map](https://github.com/meteor/meteor/tree/devel/packages/id-map) {#id-map} +### [insecure](https://github.com/meteor/meteor/tree/devel/packages/insecure) {#insecure} +### [inter-process-messaging](https://github.com/meteor/meteor/tree/devel/packages/inter-process-messaging) {#inter-process-messaging} +### [launch-screen](https://github.com/meteor/meteor/tree/devel/packages/launch-screen) {#launch-screen} +### [localstorage](https://github.com/meteor/meteor/tree/devel/packages/localstorage) {#localstorage} +### [logging](https://github.com/meteor/meteor/tree/devel/packages/logging) {#logging} +### [logic-solver](https://github.com/meteor/meteor/tree/devel/packages/logic-solver) {#logic-solver} +### [meetup-config-ui](https://github.com/meteor/meteor/tree/devel/packages/meetup-config-ui) {#meetup-config-ui} +### [meetup-oauth](https://github.com/meteor/meteor/tree/devel/packages/meetup-oauth) {#meetup-oauth} +### [meteor](https://github.com/meteor/meteor/tree/devel/packages/meteor) {#meteor} +### [meteor-base](https://github.com/meteor/meteor/tree/devel/packages/meteor-base) {#meteor-base} +### [meteor-developer-config-ui](https://github.com/meteor/meteor/tree/devel/packages/meteor-developer-config-ui) {#meteor-developer-config-ui} +### [meteor-developer-oauth](https://github.com/meteor/meteor/tree/devel/packages/meteor-developer-oauth) {#meteor-developer-oauth} +### [meteor-tool](https://github.com/meteor/meteor/tree/devel/packages/meteor-tool) {#meteor-tool} +### [minifier-css](https://github.com/meteor/meteor/tree/devel/packages/minifier-css) {#minifier-css} +### [minifier-js](https://github.com/meteor/meteor/tree/devel/packages/minifier-js) {#minifier-js} +### [minimongo](https://github.com/meteor/meteor/tree/devel/packages/minimongo) {#minimongo} +### [mobile-experience](https://github.com/meteor/meteor/tree/devel/packages/mobile-experience) {#mobile-experience} +### [mobile-status-bar](https://github.com/meteor/meteor/tree/devel/packages/mobile-status-bar) {#mobile-status-bar} +### [modern-browsers](https://github.com/meteor/meteor/tree/devel/packages/modern-browsers) {#modern-browsers} +### [modules](https://github.com/meteor/meteor/tree/devel/packages/modules) {#modules} +### [modules-runtime](https://github.com/meteor/meteor/tree/devel/packages/modules-runtime) {#modules-runtime} +### [modules-runtime-hot](https://github.com/meteor/meteor/tree/devel/packages/modules-runtime-hot) {#modules-runtime-hot} +### [mongo](https://github.com/meteor/meteor/tree/devel/packages/mongo) {#mongo} +### [mongo-dev-server](https://github.com/meteor/meteor/tree/devel/packages/mongo-dev-server) {#mongo-dev-server} +### [mongo-id](https://github.com/meteor/meteor/tree/devel/packages/mongo-id) {#mongo-id} +### [mongo-livedata](https://github.com/meteor/meteor/tree/devel/packages/mongo-livedata) {#mongo-livedata} +### [npm-mongo](https://github.com/meteor/meteor/tree/devel/packages/npm-mongo) {#npm-mongo} +### [oauth](https://github.com/meteor/meteor/tree/devel/packages/oauth) {#oauth} +### [oauth-encryption](https://github.com/meteor/meteor/tree/devel/packages/oauth-encryption) {#oauth-encryption} +### [oauth1](https://github.com/meteor/meteor/tree/devel/packages/oauth1) {#oauth1} +### [oauth2](https://github.com/meteor/meteor/tree/devel/packages/oauth2) {#oauth2} +### [ordered-dict](https://github.com/meteor/meteor/tree/devel/packages/ordered-dict) {#ordered-dict} +### [package-stats-opt-out](https://github.com/meteor/meteor/tree/devel/packages/package-stats-opt-out) {#package-stats-opt-out} +### [package-version-parser](https://github.com/meteor/meteor/tree/devel/packages/package-version-parser) {#package-version-parser} +### [promise](https://github.com/meteor/meteor/tree/devel/packages/promise) {#promise} +### [random](https://github.com/meteor/meteor/tree/devel/packages/random) {#random} +### [rate-limit](https://github.com/meteor/meteor/tree/devel/packages/rate-limit) {#rate-limit} +### [react-fast-refresh](https://github.com/meteor/meteor/tree/devel/packages/react-fast-refresh) {#react-fast-refresh} +### [reactive-dict](https://github.com/meteor/meteor/tree/devel/packages/reactive-dict) {#reactive-dict} +### [reactive-var](https://github.com/meteor/meteor/tree/devel/packages/reactive-var) {#reactive-var} +### [reload](https://github.com/meteor/meteor/tree/devel/packages/reload) {#reload} +### [reload-safetybelt](https://github.com/meteor/meteor/tree/devel/packages/reload-safetybelt) {#reload-safetybelt} +### [retry](https://github.com/meteor/meteor/tree/devel/packages/retry) {#retry} +### [routepolicy](https://github.com/meteor/meteor/tree/devel/packages/routepolicy) {#routepolicy} +### [server-render](https://github.com/meteor/meteor/tree/devel/packages/server-render) {#server-render} +### [service-configuration](https://github.com/meteor/meteor/tree/devel/packages/service-configuration) {#service-configuration} +### [session](https://github.com/meteor/meteor/tree/devel/packages/session) {#session} +### [sha](https://github.com/meteor/meteor/tree/devel/packages/sha) {#sha} +### [shell-server](https://github.com/meteor/meteor/tree/devel/packages/shell-server) {#shell-server} +### [socket-stream-client](https://github.com/meteor/meteor/tree/devel/packages/socket-stream-client) {#socket-stream-client} +### [standard-minifier-css](https://github.com/meteor/meteor/tree/devel/packages/standard-minifier-css) {#standard-minifier-css} +### [standard-minifier-js](https://github.com/meteor/meteor/tree/devel/packages/standard-minifier-js) {#standard-minifier-js} +### [standard-minifiers](https://github.com/meteor/meteor/tree/devel/packages/standard-minifiers) {#standard-minifiers} +### [static-html](https://github.com/meteor/meteor/tree/devel/packages/static-html) {#static-html} +### [test-helpers](https://github.com/meteor/meteor/tree/devel/packages/test-helpers) {#test-helpers} +### [test-in-browser](https://github.com/meteor/meteor/tree/devel/packages/test-in-browser) {#test-in-browser} +### [test-in-console](https://github.com/meteor/meteor/tree/devel/packages/test-in-console) {#test-in-console} +### [test-server-tests-in-console-once](https://github.com/meteor/meteor/tree/devel/packages/test-server-tests-in-console-once) {#test-server-tests-in-console-once} +### [tinytest](https://github.com/meteor/meteor/tree/devel/packages/tinytest) {#tinytest} +### [tinytest-harness](https://github.com/meteor/meteor/tree/devel/packages/tinytest-harness) {#tinytest-harness} +### [tracker](https://github.com/meteor/meteor/tree/devel/packages/tracker) {#tracker} +### [twitter-config-ui](https://github.com/meteor/meteor/tree/devel/packages/twitter-config-ui) {#twitter-config-ui} +### [twitter-oauth](https://github.com/meteor/meteor/tree/devel/packages/twitter-oauth) {#twitter-oauth} +### [typescript](https://github.com/meteor/meteor/tree/devel/packages/typescript) {#typescript} +### [underscore](https://github.com/meteor/meteor/tree/devel/packages/underscore) {#underscore} +### [underscore-tests](https://github.com/meteor/meteor/tree/devel/packages/underscore-tests) {#underscore-tests} +### [url](https://github.com/meteor/meteor/tree/devel/packages/url) {#url} +### [webapp](https://github.com/meteor/meteor/tree/devel/packages/webapp) {#webapp} +### [webapp-hashing](https://github.com/meteor/meteor/tree/devel/packages/webapp-hashing) {#webapp-hashing} +### [weibo-config-ui](https://github.com/meteor/meteor/tree/devel/packages/weibo-config-ui) {#weibo-config-ui} +### [weibo-oauth](https://github.com/meteor/meteor/tree/devel/packages/weibo-oauth) {#weibo-oauth} \ No newline at end of file diff --git a/v3-docs/docs/api/session.md b/v3-docs/docs/api/session.md new file mode 100644 index 00000000000..8bce7901875 --- /dev/null +++ b/v3-docs/docs/api/session.md @@ -0,0 +1,145 @@ +# Session + +Documentation of Meteor's client-side session API. + + +`Session` provides a global object on the client that you can use to +store an arbitrary set of key-value pairs. Use it to store things like +the currently selected item in a list. + +What's special about `Session` is that it's reactive. If +you call [`Session.get`](#Session-get)`('currentList')` +from inside a template, the template will automatically be rerendered +whenever [`Session.set`](#Session-set)`('currentList', x)` is called. + +To add `Session` to your application, run this command in your terminal: + +```bash +meteor add session +``` + + + + +```js +import { Session } from 'meteor/session'; +import { Tracker } from 'meteor/tracker'; +import { Meteor } from 'meteor/meteor'; + +Tracker.autorun(() => { + Meteor.subscribe('chatHistory', { room: Session.get('currentRoomId') }); +}); + +// Causes the function passed to `Tracker.autorun` to be rerun, so that the +// 'chatHistory' subscription is moved to the room 'home'. +Session.set('currentRoomId', 'home'); +``` + + +`Session.set` can also be called with an object of keys and values, which is +equivalent to calling `Session.set` individually on each key/value pair. + +```js +Session.set({ + a: 'foo', + b: 'bar' +}); +``` + + + + +This is useful in initialization code, to avoid re-initializing a session +variable every time a new version of your app is loaded. + + + + +This example in Blaze.js +::: code-group + +```html [main.html] + +``` + +```js [main.js] +Template.main.helpers({ + theEnemy() { + return Session.get('enemy'); + } +}); + +Session.set('enemy', 'Eastasia'); +// Page will say "We've always been at war with Eastasia" + +Session.set('enemy', 'Eurasia'); +// Page will change to say "We've always been at war with Eurasia" +``` +::: + + + + + +If value is a scalar, then these two expressions do the same thing: + +```js +Session.get('key') === value +Session.equals('key', value) +``` + +...but the second one is always better. It triggers fewer invalidations +(template redraws), making your program more efficient. + +This example in Blaze.js: + +::: code-group + +```html [main.html] + + + + +``` + +```js [main.js] + +Template.postsView.helpers({ + posts() { + return Posts.find(); + } +}); + +Template.postItem.helpers({ + postClass() { + return Session.equals('selectedPost', this._id) + ? 'selected' + : ''; + } +}); + +Template.postItem.events({ + 'click'() { + Session.set('selectedPost', this._id); + } +}); +``` + +Using Session.equals here means that when the user clicks +on an item and changes the selection, only the newly selected +and the newly unselected items are re-rendered. + +If Session.get had been used instead of Session.equals, then +when the selection changed, all the items would be re-rendered. + +For object and array session values, you cannot use `Session.equals`; instead, +you need to use the `underscore` package and write +`_.isEqual(Session.get(key), value)`. diff --git a/v3-docs/docs/api/templates.md b/v3-docs/docs/api/templates.md new file mode 100644 index 00000000000..2e0dd7b6e9d --- /dev/null +++ b/v3-docs/docs/api/templates.md @@ -0,0 +1,5 @@ + +# Templates +Documentation of Meteor's client-side session API. + +This documentation has moved to the [Blaze Community Site](http://blazejs.org/api/templates). diff --git a/v3-docs/docs/cli/environment-variables.md b/v3-docs/docs/cli/environment-variables.md new file mode 100644 index 00000000000..1d46eadbc05 --- /dev/null +++ b/v3-docs/docs/cli/environment-variables.md @@ -0,0 +1,121 @@ + +# Environment Variables +List of environment variables that you can use with your Meteor application. + + +## BIND_IP +(_production_) + +Bind the application server to a specific network interface by IP address, for example: `BIND_IP=192.168.0.2`. + +See also: [`PORT`](#port). + +> In development, this can be accomplished with `meteor run --port a.b.c.d:port`. + +## DDP_DEFAULT_CONNECTION_URL +(_develoment, production_) + +There are some situations where it is valuable for the meteor client to use a different DDP server than the `ROOT_URL` server. + +Setting `DDP_DEFAULT_CONNECTION_URL` when running a meteor server (development: `meteor run` or production: `node main.js`) will set the DDP server to the value in `DDP_DEFAULT_CONNECTION_URL`. + +Setting `DDP_DEFAULT_CONNECTION_URL` when building (`meteor build`) will define the DDP server for `cordova` builds. + +## DISABLE_WEBSOCKETS +(_development, production_) + +In the event that your own deployment platform does not support WebSockets, or you are confident that you will not benefit from them, setting this variable with `DISABLE_WEBSOCKETS=1` will explicitly disable WebSockets and forcibly resort to the fallback polling-mechanism, instead of trying to detect this automatically. + +## DISABLE_SOCKJS +(_development, production_) + +Set `DISABLE_SOCKJS=1` if you want to use the native WebSocket implementation instead of SockJS on the client side, for example, if you want to use a custom WebSocket implementation (e.g. [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js/)) on the server side. + +## HTTP_FORWARDED_COUNT +(_production_) + +Set this to however many number of proxies you have running before your Meteor application. For example, if have an NGINX server acting as a proxy before your Meteor application, you would set `HTTP_FORWARDED_COUNT=1`. If you have a load balancer in front of that NGINX server, the count is 2. + +## MAIL_URL +(_development, production_) + +Use this variable to set the SMTP server for sending e-mails. [Postmark](https://www.postmarkapp.com), [Mandrill](https://www.mandrillapp.com), [MailGun](https://www.mailgun.com) and [SendGrid](https://www.sendgrid.com) (among others) are companies who can provide this service. The `MAIL_URL` contains all of the information for connecting to the SMTP server and, like a URL, should look like `smtp://user:pass@yourservice.com:587` or `smtps://user:pass@yourservice.com:465`. + +The `smtp://` form is for mail servers which support encryption via `STARTTLS` or those that do not use encryption at all and is most common for servers on port 587 and _sometimes_ port 25. On the other hand, the `smtps://` form (the `s` stands for "secure") should be used if the server only supports TLS/SSL (and does not support connection upgrade with `STARTTLS`) and is most common for servers on port 465. + +## METEOR_DISABLE_OPTIMISTIC_CACHING +(_production_) + +When running `meteor build` or `meteor deploy` you can set `METEOR_DISABLE_OPTIMISTIC_CACHING=1` to speed up your build time. + +Since optimistic in-memory caching is one of the more memory-intensive parts of the build system, setting the environment variable `METEOR_DISABLE_OPTIMISTIC_CACHING=1` can help improve memory usage during meteor build, which seems to improve the total build times. This configuration is perfectly safe because the whole point of optimistic caching is to keep track of previous results for future rebuilds, but in the case of meteor `build` or `deploy` there's only ever one initial build, so the extra bookkeeping is unnecessary. + +## METEOR_PROFILE +(_development_) + +In development, you may need to diagnose what has made builds start taking a long time. To get the callstack and times during builds, you can run `METEOR_PROFILE=1 meteor`. + +## METEOR_PACKAGE_DIRS +(_development, production_) + +Colon-delimited list of local package directories to look in, outside your normal application structure, for example: `METEOR_PACKAGE_DIRS="/usr/local/my_packages/"`. Note that this used to be `PACKAGE_DIRS` but was changed in Meteor 1.4.2. + +## METEOR_SETTINGS +(_production_) + +When running your bundled application in production mode, pass a string of JSON containing your settings with `METEOR_SETTINGS='{ "server_only_setting": "foo", "public": { "client_and_server_setting": "bar" } }'`. + +> In development, this is accomplished with `meteor --settings [file.json]` in order to provide full-reactivity when changing settings. Those settings are simply passed as a string here. Please see the [Meteor.settings](../api/meteor#Meteor-settings) documentation for further information. + +## METEOR_SQLITE_JOURNAL_MODE +(_development_) + +The Meteor package catalog uses the `WAL` [SQLite Journal Mode](https://www.sqlite.org/pragma.html#pragma_journal_mode) by default. The Journal mode for the package catalog can be modifed by setting `METEOR_SQLITE_JOURNAL_MODE`. + +When running multiple concurrent meteor servers on [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/) some meteor developers have seen issues with the package catalog. Setting the environment variable `METEOR_SQLITE_JOURNAL_MODE=TRUNCATE` can overcome the issue. + +## MONGO_OPLOG_URL +(_development, production_) + +MongoDB server oplog URL. If you're using a replica set (which you should), construct this url like so: `MONGO_OPLOG_URL="mongodb://user:password@myserver.com:10139/local?replicaSet=(your replica set)&authSource=(your auth source)"` + +## MONGO_URL +(_development, production_) + +MongoDB server URL. Give a fully qualified URL (or comma-separated list of URLs) like `MONGO_URL="mongodb://user:password@myserver.com:10139"`. For more information see the [MongoDB docs](https://docs.mongodb.com/manual/reference/connection-string/). + +## PORT +(_production_) + +Which port the app should listen on, for example: `PORT=3030` + +See also: [`BIND_IP`](#bind-ip). + +> In development, this can be accomplished with `meteor run --port `. + +## ROOT_URL +(_development, production_) + +Used to generate URLs to your application by, among others, the accounts package. Provide a full URL to your application like this: `ROOT_URL="https://www.myapp.com"`. + +## TOOL_NODE_FLAGS +(_development, production_) + +Used to pass flags/variables to Node inside Meteor build. For example you can use this to pass a link to icu data: `TOOL_NODE_FLAGS="--icu-data-dir=node_modules/full-icu"` +For full list of available flags see the [Node documentation](https://nodejs.org/dist/latest-v12.x/docs/api/cli.html). + +## UNIX_SOCKET_GROUP +(_production_) + +This overrides the default UNIX group of the socket file configured in `UNIX_SOCKET_PATH`. It can be set to a group name or a numerical gid. + +## UNIX_SOCKET_PATH +(_production_) + +Configure Meteor's HTTP server to listen on a UNIX socket file path (e.g. `UNIX_SOCKET_PATH=/tmp/meteor.sock`) instead of a TCP port. This is useful when running a local reverse proxy server like Nginx to handle client HTTP requests and direct them to your Meteor application. Leveraging UNIX domain sockets for local communication on the same host avoids the Operating System overhead required by TCP based communication and can also improve security. This UNIX socket file is created when Meteor starts and removed when Meteor exits. + +## UNIX_SOCKET_PERMISSIONS +(_production_) + +This overrides the default UNIX file permissions on the UNIX socket file configured in `UNIX_SOCKET_PATH`. For example, `UNIX_SOCKET_PERMISSIONS=660` would set read/write permissions for both the user and group. + diff --git a/v3-docs/docs/cli/index.md b/v3-docs/docs/cli/index.md new file mode 100644 index 00000000000..40ecd77a1a3 --- /dev/null +++ b/v3-docs/docs/cli/index.md @@ -0,0 +1,1007 @@ +# Command Line +Documentation of the various command line options of the Meteor tool. + +--- + +The following are some of the more commonly used commands in the `meteor` +command-line tool. This is just an overview and does not mention every command +or every option to every command; for more details, use the `meteor help` +command. + +## meteor help {meteorhelp} + +Get help on meteor command line usage. Running `meteor help` by +itself will list the common meteor +commands. Running meteor help command will print +detailed help about the command. + + +## meteor run {meteorrun} + +Run a meteor development server in the current project. Searches +upward from the current directory for the root directory of a Meteor +project. Whenever you change any of the application's source files, the +changes are automatically detected and applied to the running +application. + +You can use the application by pointing your web browser at +localhost:3000. No Internet connection is +required. + +This is the default command. Simply running `meteor` is the +same as `meteor run`. + +To pass additional options to Node.js use the `SERVER_NODE_OPTIONS` environment variable. E.g. for Windows PowerShell: +`$env:SERVER_NODE_OPTIONS = '--inspect' | meteor run`. Or for Linux: `SERVER_NODE_OPTIONS=--inspect-brk meteor run`. + +To specify a port to listen on (instead of the default 3000), use `--port [PORT]`. +(The development server also uses port `N+1` for the default MongoDB instance) + +For example: `meteor run --port 4000` +will run the development server on `http://localhost:4000` +and the development MongoDB instance on `mongodb://localhost:4001`. + +Run `meteor help run` to see the full list of options. + +## meteor debug {meteordebug} + +Run the project, but suspend the server process for debugging. + +> **NOTE:** The `meteor debug` command has been superseded by the more flexible +> `--inspect` and `--inspect-brk` command-line flags, which work for any `run`, +> `test`, or `test-packages` command. +> +> The syntax of these flags is the same as the equivalent Node.js +> [flags](https://nodejs.org/en/docs/inspector/#command-line-options), +> with two notable differences: +> +> * The flags affect the server process spawned by the build process, +> rather than affecting the build process itself. +> +> * The `--inspect-brk` flag causes the server process to pause just after +> server code has loaded but before it begins to execute, giving the +> developer a chance to set breakpoints in server code. + +The server process will be suspended just before the first statement of +server code that would normally execute. In order to continue execution of +server code, use either the web-based Node Inspector or the command-line +debugger (further instructions will be printed in the console). + +Breakpoints can be set using the `debugger` keyword, or through the web UI of Node Inspector ("Sources" tab). + +The server process debugger will listen for incoming connections from +debugging clients, such as node-inspector, on port 5858 by default. To +specify a different port use the `--debug-port ` option. + +The same debugging functionality can be achieved by adding the `--debug-port ` +option to other `meteor` tool commands, such as `meteor run` and `meteor test-packages`. + +> **Note:** Due to a [bug in `node-inspector`](https://github.com/node-inspector/node-inspector/issues/903), pushing "Enter" after a command on the Node Inspector Console will not successfully send the command to the server. If you require this functionality, please consider using Safari or `meteor shell` in order to interact with the server console until the `node-inspector` project [fixes the bug](https://github.com/node-inspector/node-inspector/pull/955). Alternatively, there is a hot-patch available [in this comment](https://github.com/meteor/meteor/issues/7991#issuecomment-266709459) on [#7991](https://github.com/meteor/meteor/issues/7991). + + +## meteor create _app-name_ {meteorcreate} + +The command `meteor create app-name` is the default command for creating a new Meteor project. It creates a subdirectory +named `app-name` and copies a template app into it. You can pass an absolute or relative path. If you pass a relative +path, it will be resolved relative to the current working directory. By default, it generates a React project. + +See the flags below to learn how you can generate different types of apps. + + +## --apollo {apollo} + +The command `meteor create --apollo app-name` creates a Meteor app with [React](https://react.dev/), +[Apollo](https://www.apollographql.com/) (GraphQL), and [MongoDB](https://www.mongodb.com/). To create a complete app, +including testing and deployment, follow the [React tutorial](https://react-tutorial.meteor.com/). To learn how to use +Apollo, refer to the [GraphQL section](https://react-tutorial.meteor.com/simple-todos-graphql/). + +Npm packages included: `@apollo/client`, `@apollo/server`, `@babel/runtime`, `body-parser`, `express`, +`graphql` `meteor-node-stubs`, `react`, `react-dom`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `static-html`, +`react-meteor-data`, `apollo`, `swydo:graphql`. + +## --bare {bare} + +The command `meteor create --bare app-name` creates an empty Meteor app with [Blaze](https://blazejs.org) and +[MongoDB](https://www.mongodb.com/). To create a complete app, including testing and deployment, follow the +[Blaze tutorial](https://blaze-tutorial.meteor.com/). + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `jquery`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `tracker`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`. + + +## --blaze {blaze-app} + +The command `meteor create --blaze app-name` creates a Meteor app with [Blaze](https://blazejs.org) and +[MongoDB](https://www.mongodb.com/). To create a complete app, including testing and deployment, follow the +[Blaze tutorial](https://blaze-tutorial.meteor.com/). + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `jquery`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `blaze-html-templates`, `jquery`, `reactive-var`, +`tracker`, `standard-minifier-css`, `standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, +`hot-module-replacement`, `blaze-hot`. + + +## --chakra-ui {chakra-ui} + +The command `meteor create --chakra-ui app-name` creates a Meteor app with [React](https://react.dev/), +[Chakra-UI](https://chakra-ui.com/), and [MongoDB](https://www.mongodb.com/). To create a complete app, including +testing and deployment, follow the [React tutorial](https://react-tutorial.meteor.com/). To learn how to use Chakra-UI, +refer to the [Simple Tasks](https://github.com/fredmaiaarantes/simpletasks) example. + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `react`, `react-dom`, `@chakra-ui/icons`, `@chakra-ui/react`, `@emotion/react` +`@emotion/styled`, `@react-icons/all-files`, `framer-motion`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `static-html`, +`react-meteor-data`. + + +## --full {full} + +The command `meteor create --full app-name` creates a Meteor app with [Blaze](https://blazejs.org) and +[MongoDB](https://www.mongodb.com/). It creates a more complete, imports-based project that closely matches the +[file structure](https://guide.meteor.com/structure.html#javascript-structure) recommended by the +[Meteor Guide](https://guide.meteor.com/). To create a complete app, including testing and deployment, follow the +[Blaze tutorial](https://blaze-tutorial.meteor.com/). + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `jquery`, `chai`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `blaze-html-templates`, `jquery`, `reactive-var`, +`tracker`, `standard-minifier-css`, `standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, +`ostrio:flow-router-extra`, `less`, `meteortesting:mocha`, `johanbrook:publication-collector`. + + +## --minimal {minimal} + +The command `meteor create --minimal app-name` creates a project with as few Meteor packages as possible. + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`. + +Meteor packages included: `meteor`, `standard-minifier-css`, `standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, +`static-html`, `webapp`, `server-render`, `hot-module-replacement`. + + +## --package {package} + +The command `meteor create --package package-name` creates a new package. If used in an existing app, it will create a +package in the `packages` directory. Check the [Meteor Guide](https://guide.meteor.com/writing-atmosphere-packages.html) +for more information on how to get started writing packages. + + +## --prototype {prototype} + +The command `meteor create --prototype app-name` creates a project with the prototype purpose packages (`autopublish` +and `insecure`). If you use them, you can change your collections quickly and create prototype apps very quickly. +However, these packages are not supposed to be used in production. + +For more information about security, you can read our [security checklist](https://guide.meteor.com/security.html#checklist). +It can be used with other flags that create apps, such as `--react`, `blaze`, or `--typescript`. + + +## --react {react} + +The command `meteor create --react app-name` creates a Meteor app with [React](https://react.dev/) and +[MongoDB](https://www.mongodb.com/). It functions in the same way as if you don't use any flags. To create a complete +app, including testing and deployment, follow the [React tutorial](https://react-tutorial.meteor.com/). + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `react`, `react-dom`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `static-html`, +`react-meteor-data`. + + + +## --release {release} + +The command `meteor create app-name --release {meteor-version}` creates a Meteor app with the release specified in the +command. For instance, you can create a Meteor app with the `2.8` release using `meteor create app-name --release 2.8`. +By default, it generates a React app, but you can use it with other flags that create apps such as `--blaze`, +`--svelte`, `--vue`, or `--typescript`. + + +## --solid {solid} + +The command `meteor create --solid app-name` creates a Meteor app with [Solid](https://www.solidjs.com/), +[Vite](https://vitejs.dev/), and [MongoDB](https://www.mongodb.com/). You can see an example on the +[meteor-solid-app](https://github.com/fredmaiaarantes/meteor-solid-app/releases/tag/milestone-2.0) repository. + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `solid-js`, `babel-preset-solid`, `vite`, `vite-plugin-solid`, `vite-plugin-solid-svg`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `static-html`, +`vite:bundler`. + + +## --svelte {svelte} + +The command `meteor create --svelte app-name` creates a Meteor app with [Svelte](https://svelte.dev/) and +[MongoDB](https://www.mongodb.com/). To create a complete app, including testing and deployment, follow the +[Svelte tutorial](https://svelte-tutorial.meteor.com/). + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `svelte`, `svelte-preprocess`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `static-html`, +`zodern:melte`, `zodern:types`. + +You can also use [Svelte](https://svelte.dev/) with [Vite](https://vitejs.dev/) by using the [jorgenvatle:meteor-vite](https://github.com/JorgenVatle/meteor-vite) package. +You can see an example on the [meteor-vite](https://github.com/JorgenVatle/meteor-vite/tree/release/examples/svelte) repository. + + +## --tailwind {tailwind} + +The command `meteor create --tailwind app-name` creates a Meteor app with [React](https://react.dev/), +[Tailwind CSS](https://tailwindcss.com), and [MongoDB](https://www.mongodb.com/). + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `react`, `react-dom`, `autoprefixer`, `postcss`, `postcss-load-config`, `tailwindcss`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `static-html`, +`react-meteor-data`. + + +## --typescript {typescript} + +The command `meteor create --typescript app-name` creates a Meteor app with [React](https://react.dev/), +[TypeScript](https://www.typescriptlang.org/), and [MongoDB](https://www.mongodb.com/). Check the +[Meteor Guide](https://guide.meteor.com/build-tool.html#typescript) for more information about TypeScript and how to +use it with other UI frameworks. + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `react`, `react-dom`, `@types/mocha`, `@types/node`, `@types/react`, `@types/react-dom`, `typescript`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `static-html`, +`react-meteor-data`, `zodern:types`. + + +## --vue {vue} + +The command `meteor create --vue app-name` creates a Meteor app with [Vue 3](https://vuejs.org/), +[Tailwind CSS](https://tailwindcss.com), [Vite](https://vitejs.dev/), and [MongoDB](https://www.mongodb.com/). To +create a complete app, including testing and deployment, follow the [Vue 3 tutorial](https://vue3-tutorial.meteor.com/). + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `vue`, `vue-meteor-tracker`, `vue-router`, `@types/meteor`, `@vitejs/plugin-vue`, `autoprefixer`, `postcss`, `tailwindcss`, `vite`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `hot-module-replacement`, `static-html`, +`vite:bundler`. + +You can also use Vue 3 with Vite by using the [jorgenvatle:meteor-vite](https://github.com/JorgenVatle/meteor-vite) +package. You can see an example on the [meteor-vite](https://github.com/JorgenVatle/meteor-vite/tree/release/examples/vue) +repository. + +Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `vue`, `vue-meteor-tracker`. + +Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`, +`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `tracker`, `static-html`, `akryum:vue-component`, +`meteortesting:mocha`, `johanbrook:publication-collector`. + + +## meteor generate {meteorgenerate} + +``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`` +![Screenshot 2022-11-09 at 11 28 29](https://user-images.githubusercontent.com/70247653/200856551-71c100f5-8714-4b34-9678-4f08780dcc8b.png) + +That will have the following code: + + +## collection.js {meteorgenerate-collection.js} + +```js +import { Mongo } from 'meteor/mongo'; + +export const CustomerCollection = new Mongo.Collection('customer'); +``` + + + +## methods.js {meteorgenerate-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 {meteorgenerate-publication.js} + +```js +import { Meteor } from 'meteor/meteor'; +import { CustomerCollection } from './collection'; + +Meteor.publish('allCustomers', function publishCustomers() { + return CustomerCollection.find({}); +}); +``` + + + + +## index.js {meteorgenerate-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 {meteorgenerate-path} + +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: + +![Screenshot 2022-11-09 at 11 32 39](https://user-images.githubusercontent.com/70247653/200857560-a4874e4c-1078-4b7a-9381-4c6590d2f63b.png) + + +## collection.ts {meteorgenerate-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 {meteorgenerate-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 {meteorgenerate-publications.ts} + +```typescript +import { Meteor } from 'meteor/meteor'; +import { AnotherCustomerCollection } from './collection'; + +Meteor.publish('allAnotherCustomers', function publishAnotherCustomers() { + return AnotherCustomerCollection.find({}); +}); +``` + + + +## index.ts {meteorgenerate-index.ts} + +```typescript +export * from './collection'; +export * from './methods'; +export * from './publications'; +``` + +--- + + +## Using the Wizard {meteorgenerate-wizard} + + +If you run the following command: + +```bash +meteor generate +``` + +It will prompt the following questions. + +![Screenshot 2022-11-09 at 11 38 29](https://user-images.githubusercontent.com/70247653/200859087-a2ef63b6-7ac1-492b-8918-0630cbd30686.png) + + + + +--- + +## Using your own template {meteorgenerate-templating} + +`--templatePath` + +```bash +meteor generate feed --templatePath=/scaffolds-ts +``` +![Screenshot 2022-11-09 at 11 42 47](https://user-images.githubusercontent.com/70247653/200860178-2341befe-bcfd-422f-a4bd-7c9918abfd97.png) + +> 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? {meteorgenerate-template-rename} + +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? {meteorgenerate-template-faq} + +`--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 {meteorloginlogout} + +Log in and out of your account using Meteor's authentication system. + +You can pass `METEOR_SESSION_FILE=token.json` before `meteor login` to generate +a login session token so you don't have to share your login credentials with +third-party service providers. + +Once you have your account you can log in and log out from the command line, and +check your username with `meteor whoami`. + +## meteor deploy _site_ {meteordeploy} + +Deploy the project in your current directory to +Galaxy. + +Use `--owner` to decide which organization or user account you'd like to deploy +a new app to if you are a member of more than one Galaxy-enabled account. + +You can deploy in debug mode by passing `--debug`. This +will leave your source code readable by your favorite in-browser +debugger, just like it is in local development mode. + + + +To delete an application you've deployed, specify +the `--delete` option along with the site. + + + +You can add information specific to a particular deployment of your application +by using the `--settings` option. The argument to `--settings` is a file +containing any JSON string. The object in your settings file will appear on the +server side of your application in [`Meteor.settings`](../api/meteor#Meteor-settings). + +Settings are persistent. When you redeploy your app, the old value will be +preserved unless you explicitly pass new settings using the `--settings` option. +To unset `Meteor.settings`, pass an empty settings file. + +::: warning +`free` and `mongo` options were introduced in Meteor 2.0 +::: + +You can run your app for free using the option `--free`. But, there are some limitations. The first one is that you cannot use a custom domain to run a free app. Your domain must contain a Meteor domain name (`.meteorapp.com` to US region, `.au.meteorapp.com` to Asia region, or `.eu.meteorapp.com` to Europe region). Second thing you must know is that your free apps have Cold Start enabled. Cold Start means that your app will stop if it has no connection for 10 minutes, and it will go automatically up when someone tries to connect to it. The third thing you must know is that free apps run on one, and just one, Tiny container. This is important to know, because Tiny containers are NOT meant to production environment, so even small apps can crash with a lot of connections. To keep your app on free, you always need to provide this option. + +With the option `--mongo` you can deploy your app without having to pay for a MongoDB provider. By providing this option, Galaxy will create a database for you in our shared cluster and inject the mongo URL on your settings. So with this, you don't even need to provide the settings file anymore (if your settings files just have the mongo URL of course). This is great to test apps, but it shouldn't be used in a production environment, as you will be running in a shared Cluster with limited space. The rules behind this option are: If it is the first deploy of the app, and you provided the option `--mongo`, after the deploy is finished you will receive your mongo URL on your console (you can also see your URL on Galaxy in your app's version). You can put that URL on your settings file if want to. If you try to do a second without the option `--mongo` and without providing a mongo URL on your settings, your deploy will fail as usual. If you provide the option `--mongo` and a mongo URL, the mongo URL on your settings file is the one that will be used by Galaxy to connect your app to a MongoDB. One last thing, you need to have at least one document in your database so Meteor is really going to instantiate it. Then you will be able to access it using any MongoDB client with the provided URI. + +Use the options `--mongo` and `--free` to easily deploy a free app already with a mongo database connected to it. + +::: warning +Free apps and MongoDB shared hosting: Meteor Software reserves the right to stop or remove applications we deem to be abusing the free plan offering at any time. Please be advised that the free plan offering is not recommended for production applications. The shared MongoDB cluster that comes configured with the free plan does not provide backups or restoration resources. +::: + +::: warning +If you want to connect to your free MongoDB shared cluster using your on settings make sure you include this option in your settings in the Mongo package configuration section: +``` +packages: { + mongo: { + options: { + tlsAllowInvalidCertificates: true, + }, + }, +} +``` +This is necessary as our database provider does not have certificates installed on every machine and we don't want to force apps to have this certificate. More about this option [here](../api/collections.html#mongo_connection_options_settings) +::: + + +You can change the app plan by providing argument `--plan` with one of the following values: professional, essentials, or free. Be aware that this argument overwrites the `--free` argument. + +::: warning +The `plan` option is available since Meteor 2.1. +::: + +Use `--cache-build` to keep the bundle in your temp folder after the deploy is finished, this is helpful when you want to deploy the same code to different environments. For example, a [background job](https://cloud-guide.meteor.com/background-jobs.html) app from the same code as the web app. + +Your project should be a git repository as the commit hash is going to be used to decide if your code is still the same or not in the next deploy. + +::: warning +The `cache-build` option is available since Meteor 1.11. +::: + +With the argument `--container-size` you can change your app's container size using the deploy command. The valid arguments are: `tiny`, `compact`, `standard`, `double`, `quad`, `octa`, and `dozen`. One more thing to note here is that the `--container-size` flag can only be used when the `--plan` option is already specified, otherwise using the `--container-size` option will throw an error with the message : `Error deploying application: Internal error`. To see more about the difference and prices of each one you can check [here](https://www.meteor.com/cloud#pricing-section). + +::: warning +The `--container-size` option is available since Meteor 2.4.1. +::: + +## meteor update {meteorupdate} + +Attempts to bring you to the latest version of Meteor, and then to upgrade your +packages to their latest versions. By default, update will not break +compatibility. + +For example, let's say packages A and B both depend on version 1.1.0 of package +X. If a new version of A depends on X@2.0.0, but there is no new version of +package B, running `meteor update` will not update A, because doing so will +break package B. + +You can pass in the flag `--packages-only` to update only the packages, and not +the release itself. Similarly, you can pass in names of packages +(`meteor update foo:kittens baz:cats`) to only update specific packages. + +Every project is pinned to a specific release of Meteor. You can temporarily try +using your package with another release by passing the `--release` option to any +command; `meteor update` changes the pinned release. + +Sometimes, Meteor will ask you to run `meteor update --patch`. Patch releases +are special releases that contain only very minor changes (usually crucial bug +fixes) from previous releases. We highly recommend that you always run `update +--patch` when prompted. + +You may also pass the `--release` flag to act as an override to update to a +specific release. This is an override: if it cannot find compatible versions of +packages, it will log a warning, but perform the update anyway. This will only +change your package versions if necessary. + + +## meteor add _package_ {meteoradd} + +Add packages to your Meteor project. By convention, names of community packages +include the name of the maintainer. For example: `meteor add iron:router`. You +can add multiple packages with one command. + +Optionally, adds version constraints. Running `meteor add package@1.1.0` will +add the package at version `1.1.0` or higher (but not `2.0.0` or higher). If you +want to use version `1.1.0` exactly, use `meteor add package@=1.1.0`. You can also +'or' constraints together: for example, `meteor add 'package@=1.0.0 || =2.0.1'` +means either 1.0.0 (exactly) or 2.0.1 (exactly). + +To remove a version constraint for a specific package, run `meteor add` again +without specifying a version. For example above, to stop using version `1.1.0` +exactly, run `meteor add package`. + + +## meteor remove _package_ {meteorremove} + +Removes a package previously added to your Meteor project. For a +list of the packages that your application is currently using, run +`meteor list`. + +This removes the package entirely. To continue using the package, +but remove its version constraint, use [`meteor add`](#meteor-add-package). + +Meteor does not downgrade transitive dependencies unless it's necessary. This +means that if running `meteor add A` upgrades A's parent package X to a new +version, your project will continue to use X at the new version even after you +run `meteor remove A`. + + +## meteor list {meteorlist} + +Lists all the packages that you have added to your project. For each package, +lists the version that you are using. Lets you know if a newer version of that +package is available. + +**Flags** + +Flags are optional and can be used to format the output. The default output +requires no flags whatsoever. The following flags are supported: + +`--tree` + +Outputs a tree showing how packages are referenced. + +`--json` + +Outputs an unformatted JSON String, showing how packages are referenced. + +`--weak` + +Show weakly referenced dependencies in the tree. +Only functional in combination with `--tree` or `--json`. + +`--details` + +Adds more package details to the JSON output. +Only functional in combination with `--json`. + + +## meteor add-platform _platform_ {meteoraddplatform} + +Adds platforms to your Meteor project. You can add multiple +platforms with one command. Once a platform has been added, you +can use 'meteor run platform' to run on the platform, and `meteor build` +to build the Meteor project for every added platform. + + +## meteor remove-platform _platform_ {meteorremoveplatform} + +Removes a platform previously added to your Meteor project. For a +list of the platforms that your application is currently using, see +`meteor list-platforms`. + + +## meteor list-platforms {meteorlistplatforms} + +Lists all of the platforms that have been explicitly added to your project. + + +## meteor ensure-cordova-dependencies {meteorensurecordovadependencies} + +Check if the dependencies are installed, otherwise install them. + +## meteor mongo {meteormongo} + +Open a MongoDB shell on your local development database, so that you +can view or manipulate it directly. + +::: warning +For now, you must already have your application running locally +with `meteor run`. This will be easier in the future. +::: + + +## meteor reset {meteorreset} + +Reset the current project to a fresh state. Removes the local +mongo database. + +::: warning +This deletes your data! Make sure you do not have any information you +care about in your local mongo database by running `meteor mongo`. +From the mongo shell, use `show collections` +and db.collection.find() to inspect your data. +::: + +::: warning +For now, you can not run this while a development server is +running. Quit all running meteor applications before running this. +::: + + +## meteor build {meteorbuild} + +Package this project up for deployment. The output is a directory with several +build artifacts: + +
  • a tarball (.tar.gz) that includes everything necessary to run the application + server (see the README in the tarball for details). Using the + `--directory` option will produce a `bundle` directory instead of the tarball.
  • +
  • an unsigned apk bundle and a project source if Android is targeted as a + mobile platform
  • +
  • a directory with an Xcode project source if iOS is targeted as a mobile + platform
+ +You can use the application server bundle to host a Meteor application on your +own server, instead of deploying to Galaxy. You will have to deal +with logging, monitoring, backups, load-balancing, etc, all of which we handle +for you if you use Galaxy. + +The unsigned `apk` bundle and the outputted Xcode project can be used to deploy +your mobile apps to Android Play Store and Apple App Store. + +By default, your application is bundled for your current architecture. +This may cause difficulties if your app contains binary code due to, +for example, npm packages. You can try to override that behavior +with the `--architecture` flag. + +You can set optional data for the initial value of `Meteor.settings` +in your mobile application with the `--mobile-settings` flag. A new value for +`Meteor.settings` can be set later by the server as part of hot code push. + +You can also specify which platforms you want to build with the `--platforms` flag. +Examples: `--platforms=android`, `--platforms=ios`, `--platforms=web.browser`. + +## meteor lint {meteorlint} + +Run through the whole build process for the app and run all linters the app +uses. Outputs all build errors or linting warnings to the standard output. + + +## meteor search {meteorsearch} + +Searches for Meteor packages and releases, whose names contain the specified +regular expression. + + +## meteor show {meteorshow} + +Shows more information about a specific package or release: name, summary, the +usernames of its maintainers, and, if specified, its homepage and git URL. + +Get information on meteor recommended releases: +```bash +meteor show METEOR +``` + +Get information on all meteor releases (including intermediate releases)" +```bash +meteor show --show-all METEOR +``` + + +## meteor publish {meteorpublish} + +Publishes your package. To publish, you must `cd` into the package directory, log +in with your Meteor Developer Account and run `meteor publish`. By convention, +published package names must begin with the maintainer's Meteor Developer +Account username and a colon, like so: `iron:router`. + +To publish a package for the first time, use `meteor publish --create`. + +Sometimes packages may contain binary code specific to an architecture (for +example, they may use an npm package). In that case, running publish will only +upload the build to the architecture that you were using to publish it. You can +use `publish-for-arch` to upload a build to a different architecture from a +different machine. + +If you have already published a package but need to update it's metadata +(the content of `Package.describe`) or the README you can actually achieve this +via `meteor publish --update`. + +## meteor publish-for-arch {meteorpublishforarch} + +Publishes a build of an existing package version from a different architecture. + +Some packages contain code specific to an architecture. Running `publish` by +itself, will upload the build to the architecture that you were using to +publish. You need to run `publish-for-arch` from a different architecture to +upload a different build. + +For example, let's say you published name:cool-binary-blob from a Mac. If you +want people to be able to use cool-binary-blob from Linux, you should log into a +Linux machine and then run +`meteor publish-for-arch name:cool-binary-blob@version`. It will notice that you +are on a linux machine, and that there is no Linux-compatible build for your package +and publish one. + +Currently, the supported architectures for Meteor are 32-bit Linux, 64-bit Linux +and Mac OS. Galaxy's servers run 64-bit Linux. + + +## meteor publish-release {meteorpublishrelease} + +Publishes a release of Meteor. Takes in a JSON configuration file. + +Meteor releases are divided into tracks. While only MDG members can publish to +the default Meteor track, anyone can create a track of their own and publish to +it. Running `meteor update` without specifying the `--release` option will not +cause the user to switch tracks. + +To publish to a release track for the first time, use the `--create-track` flag. + +The JSON configuration file must contain the name of the release track +(`track`), the release version (`version`), various metadata, the packages +specified by the release as mapped to versions (`packages`), and the package & +version of the Meteor command-line tool (`tool`). Note that this means that +forks of the meteor tool can be published as packages and people can use them by +switching to a corresponding release. For more information, run +`meteor help publish-release`. + + +## meteor test-packages {meteortestpackages} + +Test Meteor packages, either by name, or by directory. Not specifying an +argument will run tests for all local packages. The results are displayed in an +app that runs at `localhost:3000` by default. If you need to, you can pass the +`--settings` and `--port` arguments. + + +## meteor admin {meteoradmin} + +Catch-all for miscellaneous commands that require authorization to use. + +Some example uses of `meteor admin` include adding and removing package +maintainers and setting a homepage for a package. It also includes various +helpful functions for managing a Meteor release. Run `meteor help admin` for +more information. + +## meteor shell {meteorshell} + +When `meteor shell` is executed in an application directory where a server +is already running, it connects to the server and starts an interactive +shell for evaluating server-side code. + +Multiple shells can be attached to the same server. If no server is +currently available, `meteor shell` will keep trying to connect until it +succeeds. + +Exiting the shell does not terminate the server. If the server restarts +because a change was made in server code, or a fatal exception was +encountered, the shell will restart along with the server. This behavior +can be simulated by typing `.reload` in the shell. + +The shell supports tab completion for global variables like `Meteor`, +`Mongo`, and `Package`. Try typing `Meteor.is` and then pressing tab. + +The shell maintains a persistent history across sessions. Previously-run +commands can be accessed by pressing the up arrow. + +## meteor npm {meteornpm} + +The `meteor npm` command calls the +[`npm`](https://docs.npmjs.com/getting-started/what-is-npm) version bundled +with Meteor itself. + +Additional parameters can be passed in the same way as the `npm` command +(e.g. `meteor npm rebuild`, `meteor npm ls`, etc.) and the +[npm documentation](https://docs.npmjs.com/) should be consulted for the +full list of commands and for a better understanding of their usage. + +For example, executing `meteor npm install lodash --save` would install `lodash` +from npm to your `node_modules` directory and save its usage in your +[`package.json`](https://docs.npmjs.com/files/package.json) file. + +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 libraries. + +Additionally, this access to the npm that comes with Meteor avoids the need to +download and install npm separately. + +## meteor node {meteornode} + +The `meteor node` command calls the +[`node`](https://nodejs.org) version bundled with Meteor itself. + +> This is not to be confused with [`meteor shell`](#meteor-shell), 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. + +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) +should be consulted for the full list of commands and for a better understanding +of their usage. + +For example, executing `meteor node` will enter the Node.js +[Read-Eval-Print-Loop (REPL)](https://nodejs.org/dist/latest-v4.x/docs/api/repl.html) +interface and allow you to interactively run JavaScript and see the results. + +Executing `meteor node -e "console.log(process.versions)"` would +run `console.log(process.versions)` in the version of `node` bundled with Meteor. diff --git a/v3-docs/docs/cli/using-core-types.md b/v3-docs/docs/cli/using-core-types.md new file mode 100644 index 00000000000..89ebba6dca1 --- /dev/null +++ b/v3-docs/docs/cli/using-core-types.md @@ -0,0 +1,39 @@ + +# Using Core Types + +Using core types with zodern:types + +For MeteorJS in its version 2.8.1 we have introduced to our core packages an integration with the [zodern:types](https://github.com/zodern/meteor-types) package. +This package allows you to use the TypeScript types for the Meteor core packages in your TypeScript code or JavaScript code. +in order to use the types you need to install the package by running the command: + +```bash +meteor add zodern:types +``` + +And add the following line to your `tsconfig.json` file (if you do not have one, create one and add the code bellow): + +```json +{ + "compilerOptions": { + "preserveSymlinks": true, + "paths": { + "meteor/*": [ + "node_modules/@types/meteor/*", + ".meteor/local/types/packages.d.ts" + ] + } + } +} +``` + +then run the command: + +```bash +meteor lint +``` + +this will create a file within your .meteor folder that will have your types for the core packages. +You can continue to use your code as you did before, but now you can use the types for the core packages even if you are in JavaScript. + +for more information about the package please visit the [zodern:types](https://github.com/zodern/meteor-types). diff --git a/v3-docs/docs/components/ApiBox.vue b/v3-docs/docs/components/ApiBox.vue new file mode 100644 index 00000000000..d64e5581cfc --- /dev/null +++ b/v3-docs/docs/components/ApiBox.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/v3-docs/docs/components/ApiMap.vue b/v3-docs/docs/components/ApiMap.vue new file mode 100644 index 00000000000..920550d4e6a --- /dev/null +++ b/v3-docs/docs/components/ApiMap.vue @@ -0,0 +1,69 @@ + + + + + + diff --git a/v3-docs/docs/components/helpers/Booleans.vue b/v3-docs/docs/components/helpers/Booleans.vue new file mode 100644 index 00000000000..ae4735cd4ae --- /dev/null +++ b/v3-docs/docs/components/helpers/Booleans.vue @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/v3-docs/docs/components/helpers/Caret.vue b/v3-docs/docs/components/helpers/Caret.vue new file mode 100644 index 00000000000..18fbc8adc4c --- /dev/null +++ b/v3-docs/docs/components/helpers/Caret.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/v3-docs/docs/components/helpers/Classes.vue b/v3-docs/docs/components/helpers/Classes.vue new file mode 100644 index 00000000000..a6c3df5e6f2 --- /dev/null +++ b/v3-docs/docs/components/helpers/Classes.vue @@ -0,0 +1,42 @@ + + + + + + + + + diff --git a/v3-docs/docs/components/helpers/Functions.vue b/v3-docs/docs/components/helpers/Functions.vue new file mode 100644 index 00000000000..80985a97ace --- /dev/null +++ b/v3-docs/docs/components/helpers/Functions.vue @@ -0,0 +1,56 @@ + + + + + + + + + diff --git a/v3-docs/docs/components/helpers/Locus.vue b/v3-docs/docs/components/helpers/Locus.vue new file mode 100644 index 00000000000..8744352456d --- /dev/null +++ b/v3-docs/docs/components/helpers/Locus.vue @@ -0,0 +1,19 @@ + + + + + + diff --git a/v3-docs/docs/components/helpers/ParamTable.vue b/v3-docs/docs/components/helpers/ParamTable.vue new file mode 100644 index 00000000000..c906dfb3a27 --- /dev/null +++ b/v3-docs/docs/components/helpers/ParamTable.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/v3-docs/docs/components/scripts/make-primitive-html.ts b/v3-docs/docs/components/scripts/make-primitive-html.ts new file mode 100644 index 00000000000..59112eba408 --- /dev/null +++ b/v3-docs/docs/components/scripts/make-primitive-html.ts @@ -0,0 +1,109 @@ +const primitiveDefault = { + function: () => + ` () => {}`, + string: (name) => + ` "${name}"`, + number: () => + ' 42', + boolean: () => + ' false', + object: (name) => + ` ${name}`, + array: () => ' []', + "array.": () => + ' ["string"]', + "array.": () => + ' [{}]', + "array.": () => + ` ${primitiveDefault.ejsonable( + { + pre: "[", + post: "]", + } + )}`, + // someProp: 'string', num: 42, bool: false, arr: [], obj: {} + ejsonable(obj) { + let pre, post; + if (typeof obj === "string") pre = ""; + if (typeof obj === "object") { + pre = obj.pre; + post = obj.post; + } + if (pre.length > 1) pre = ""; + // if (post.length > 1) post = ""; + return ` ${ + pre ?? `` + }{ num:${primitiveDefault.number()} , someProp:${primitiveDefault.string( + "foo" + )} }${ + post ?? `` + }`; + }, + ejson(pre, post) { + return primitiveDefault.ejsonable(pre, post); + }, + jsoncompatible(pre, post) { + return primitiveDefault.ejsonable(pre, post); + }, + promise: () => + ' Promise {}', + any: () => ' any', + error: (name) => + ` Error(${name})`, + mongoselector: () => + ` MongoSelector`, + mongomodifier: () => + ` MongoModifier`, + iterationcallback: () => + ` IterationCallback`, + expresshandlerscallback: () => + ` ExpressHandlersCallback`, + addruntimeconfighookcallback: () => + ` addRuntimeConfigHookCallback`, + addupdatednotifyhookcallback: () => + ` addUpdatedNotifyHookCallback`, + 'tracker.computationfunction': () => + ` Tracker.ComputationFunction`, + computation: () => + ` Computation`, + func: () => primitiveDefault.function(), + 'tracker.computation': () => primitiveDefault.computation(), +}; + +const comma = `,`; +const br = `
`; + +const typeComment = (type) =>{ + return `/** @returns {${type}} */` + +} +const comment = (text = " // this param is optional ") => + `${text}`; + +const line = ({ html, pre, post } = { pre: "", post: "", html: "" }) => + `${pre}${html}${post}`; + +const makePrimitiveHTML = ({ primitive, arr, index, isOptional, name }) => { + let n: string = primitive[0], + primitiveName = n.toLowerCase(), + value; + + try { + value = primitiveDefault[primitiveName](name); + } catch (e) { + console.error("primitive that we got:", primitive); + throw new Error( + `primitive ${primitiveName} is not registred in the map, here is the error: ${e}` + ); + } + + if (arr.length > 1) + return line({ + html: value + `${comma}
`, + pre: index === 0 ? "" : br, + post: isOptional ? comment() : "", + }); + return value + `
`; +}; + +export { makePrimitiveHTML, comment, typeComment }; diff --git a/v3-docs/docs/components/scripts/map-maker.js b/v3-docs/docs/components/scripts/map-maker.js new file mode 100644 index 00000000000..ea982691906 --- /dev/null +++ b/v3-docs/docs/components/scripts/map-maker.js @@ -0,0 +1,145 @@ +const makeUnique = (arr) => [...new Set(arr)]; + +const makeModules = (names) => { + const modules = []; + // check for modules (names with no dots or hashes) + for (const name of names) { + if (name.includes("#")) continue; + if (name.includes(".")) continue; + modules.push(name); + } + return modules; +}; + +const makeApiList = (modules) => { + let currentModule = modules[0]; + const apiList = {}; + for (const name of modules) { + if (!apiList[currentModule]) { + apiList[currentModule] = { + [currentModule]: [], + }; + } + if (name.includes(currentModule)) { + apiList[currentModule][name] = []; + continue; + } + currentModule = name; + } + return apiList; +}; + +/** + * + * @param {Array>} + */ +export function createMap(names) { + /** + * @type {string[]} + */ + const modules = makeModules(names); + + /** + * @type {Object>} + */ + const apiList = makeApiList(modules); + + const MODULES_TO_ADD = { + module: { module: [] }, + Session: { Session: [] }, + Random: { Random: [] }, + Email: { Email: [] }, + DDPRateLimiter: { DDPRateLimiter: [] }, + }; + + Object.assign(apiList, MODULES_TO_ADD); + + // populating map with links + for (const api of Object.keys(apiList)) { + const links = apiList[api]; + for (const link of Object.keys(links)) { + const allApis = names.filter( + (name) => name.includes(link + ".") || name.includes(link + "#") + ); + apiList[api][link] = makeUnique(allApis); + } + } + + // break App and WebApp + + const webApp = apiList.App.App.filter((name) => name.includes("WebApp")); + const app = apiList.App.App.filter((name) => !name.includes("WebApp")); + + apiList.App.App = app; + apiList.WebApp = { + WebApp: webApp, + }; + + // delete missplaced apis + const TO_IGNORE = [ + "addRuntimeConfigHookCallback(options)", + "addUpdatedNotifyHookCallback(options)", + "currentUser", + "expressHandlersCallback(req, res, next)", + "getPublicationStrategy", + "loggingIn", + "main", + "loggingOut", + "IterationCallback", + "CompileStep", + "Cordova", + "Plugin" + ]; + + + for (const key of Object.keys(apiList)) + if (TO_IGNORE.includes(key)) delete apiList[key]; + + // reroute DDP to -> meteor.html#DDP-connect + apiList.DDP.shouldGoTo = '/api/meteor'; + // Match -> check#Match + apiList.check.shouldGoTo = '/api/check'; + // Mongo -> collections.html#Mongo + apiList.Mongo.shouldGoTo = '/api/collections'; + // Npm -> package.html#Npm + apiList.Npm.shouldGoTo = '/api/package'; + // Subscription -> meteor.html#Meteor-publish + apiList.Subscription.shouldGoTo = '/api/meteor'; + // Module -> packages/hot-module-replacement.html + apiList.module.shouldGoTo = '/packages/hot-module-replacement'; + // Random -> packages/random.html + apiList.Random.shouldGoTo = '/packages/random'; + // WebApp -> packages/webapp.html + apiList.WebApp.shouldGoTo = '/packages/webapp'; + return apiList; +} + +/** + * + * @param {string} filter + * @returns {Object>} + * @returns {Object>} + */ +export function filterMap(filter, apiList) { + if (filter === "") { + return apiList; + } + const newList = {}; + for (const api in apiList) { + const newLinks = {}; + for (const key in apiList[api]) { + const links = apiList[api][key]; + const newLinksArray = links.filter((link) => { + return link.toLowerCase().includes(filter.toLowerCase()); + }); + if (newLinksArray.length > 0) { + newLinks[key] = newLinksArray; + } + } + if (Object.keys(newLinks).length > 0) { + newList[api] = newLinks; + } + } + return newList; +} diff --git a/v3-docs/docs/data/.gitkeep b/v3-docs/docs/data/.gitkeep new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/v3-docs/docs/data/.gitkeep @@ -0,0 +1 @@ + diff --git a/v3-docs/docs/generators/changelog/EXAMPLE.MD b/v3-docs/docs/generators/changelog/EXAMPLE.MD new file mode 100644 index 00000000000..c2a7ff6989c --- /dev/null +++ b/v3-docs/docs/generators/changelog/EXAMPLE.MD @@ -0,0 +1,36 @@ +## vX.XX.X, 2023-XX-XX + +### Highlights + +* MongoDB Server 6.x Support +* Embedded Mongo now uses MongoDB 6.0.3 +* Some pr [GH someone] [PR #number] // this will become -> [someone](https://github.com/someone) [PR](https://github.com/meteor/meteor/pull/number) +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +TODO + +#### Meteor Version Release + + +* `Command line`: + - Corrected typo in XX XX + +* `npm mongo @4.13.0`: // You can use @get-version to get the version of the package + - Updated MongoDB driver to version 4.13.0 + +#### Special thanks to + +- [@XXX](https://github.com/XXXX). + + +For making this great framework even better! + + diff --git a/v3-docs/docs/generators/changelog/README.md b/v3-docs/docs/generators/changelog/README.md new file mode 100644 index 00000000000..bd795db1867 --- /dev/null +++ b/v3-docs/docs/generators/changelog/README.md @@ -0,0 +1,48 @@ +## Changelog Generator + +This is a generator for the changelog, you must create a file with the name of +the version that you are generating the changelog for. The script will take care of the rest. + +In this file you should follow the EXAMPLE.md file that is within this directory. + +The script will generate a file called `history.gen.md` that will be used by the +`changelog.md` file to generate the changelog page. + +To get which branches were merged into release you can search in the GitHub +repo by using this query: + +``` + is:pr base: is:merged +``` + +or in GH Cli: + +```bash + gh pr list --state merged --base +``` + +note that it may not be as useful as the first one, since it will not show the +Authors and other related information. + +## Why? + +Computers with lower memory/ IDEs with high memory usage can have problems with +the changelog file(~10k lines). This is a way to reduce the memory usage of the changelog, also creating a more +organized changelog, since all the files will be reflecting at least one version. + +## Update ordering. + +If you want to make sure that the changelog is correcly ordered, take a look at the `order-packages.js` file. +to use it, run the command below: + +```bash +node order-packages.js versions/3.0.md +``` + +or + +```bash +node order-packages.js versions/.md +``` + +it will update the file with the correct ordering(this will override the file). \ No newline at end of file diff --git a/v3-docs/docs/generators/changelog/order-packages.js b/v3-docs/docs/generators/changelog/order-packages.js new file mode 100644 index 00000000000..8af678af5e3 --- /dev/null +++ b/v3-docs/docs/generators/changelog/order-packages.js @@ -0,0 +1,81 @@ +const fs = require("fs").promises; + +// we want to get the strings that are between #### Breaking Changes and #### New Public API +// then we will create a map with the package name and the version for example: +// +// - `accounts-2fa@3.0.0`: + +// - Some methods are now async. See below: +// - `Accounts._is2faEnabledForUser` +// - `(Meteor Method) - generate2faActivationQrCode` +// - `(Meteor Method) - enableUser2fa` +// - `(Meteor Method) - disableUser2fa` +// - `(Meteor Method) - has2faEnabled` + +// will be converted to: +// {"accounts-2fa@3.0.0": ` - Some methods are now async. See below: +// - `Accounts._is2faEnabledForUser` +// - `(Meteor Method) - generate2faActivationQrCode` +// - `(Meteor Method) - enableUser2fa` +// - `(Meteor Method) - disableUser2fa` +// - `(Meteor Method) - has2faEnabled`` +// } + +// then we will iterate and order the packages in alphabetical order and write again to the file. + +/** + * + * @param {string} path + * @returns {Promise<[string, null] | ["", Error]>} + */ +async function getFile(path) { + try { + const data = await fs.readFile(path, "utf8"); + return [data, null]; + } catch (e) { + console.error(e); + return ["", new Error("could not read file")]; + } +} + +async function main() { + const [filePath] = process.argv.slice(2); + const [code, error] = await getFile(filePath); + if (error) throw error; + + const regex = /#### Breaking Changes([\s\S]*?)#### New Public API/gm; + const matches = code.match(regex).join("\n").split("\n"); + + let objectMap = {}; + let currentWorkingPackage = ""; + for (const line of matches) { + if (line.startsWith("-")) { + const packageName = line + .replace("-", "") + .replace("`:", "") + .replace("`", "") + .trim(); + objectMap[packageName] = ""; + currentWorkingPackage = packageName; + continue; + } + objectMap[currentWorkingPackage] += line + "\n"; + } + // sorting acc + const result = Object.keys(objectMap) + .reduce((acc, key) => { + if (key === "") return acc; + acc.push({ key, value: objectMap[key]}); + return acc; + }, []) + .sort((a, b) => a.key.localeCompare(b.key)) + .reduce((acc, { key, value }) => { + return acc + `- \`${key}\`:\n${value}`; + }, "") + + const newCode = code.replace(regex, `#### Breaking Changes\n\n${result}`); + + await fs.writeFile(filePath, newCode); +} + +main().then(() => console.log("done")); diff --git a/v3-docs/docs/generators/changelog/script.js b/v3-docs/docs/generators/changelog/script.js new file mode 100755 index 00000000000..122e8add23e --- /dev/null +++ b/v3-docs/docs/generators/changelog/script.js @@ -0,0 +1,110 @@ +const _fs = require("fs"); +const fs = _fs.promises; +function getPackageVersion(packageName) { + function getFile(path) { + try { + const data = _fs.readFileSync(path, "utf8"); + return [data, null]; + } catch (e) { + console.error(e); + return ["", e]; + } + } + + const [code, error] = getFile(`../../packages/${packageName}/package.js`); + if (error) return ""; + for (const line of code.split(/\n/)) { + // verify if the line has a version + if (!line.includes("version:")) continue; + + //Package.describe({ + // summary: 'some description.', + // version: '1.2.3' <--- this is the line we want, we assure that it has a version in the previous if + //}); + const [_, versionValue] = line.split(":"); + if (!versionValue) continue; + const removeQuotes = (v) => + v.trim().replace(",", "").replace(/'/g, "").replace(/"/g, ""); + if (versionValue.includes("-")) + return removeQuotes(versionValue.split("-")[0]); + return removeQuotes(versionValue); + } +} + +exports.generateChangelog = async () => { + try { + console.log("started concatenating files"); + const files = await fs.readdir("./generators/changelog/versions", "utf8"); + const filesStream = files + .map((file) => { + console.log(`reading file: ${file}`); + return { + fileName: file, + buf: fs.readFile(`./generators/changelog/versions/${file}`, "utf8"), + }; + }) + .map(async ({ buf, fileName }, index) => { + // first file we don't do anything + // Big file and does not follow the new standard + if (index === 0) return buf; + const content = (await buf).toString(); + /** + * @type {Set} + */ + const contribuitors = new Set(); + + // DSL Replacers + // [PR #123] -> [PR #123](https://github.com/meteor/meteor/pull/123) + // [GH meteor/meteor] -> [meteor/meteor](https://github.com/meteor/meteor) + // package-name@get-version -> package-name@1.3.3 + + const file = content + .replace( + /\[PR #(\d+)\]/g, + (_, number) => + `[PR](https://github.com/meteor/meteor/pull/${number})` + ) + .replace(/\[GH ([^\]]+)\]/g, (_, name) => { + contribuitors.add(name); + return `[${name}](https://github.com/${name})`; + }) + .replace( + /([a-z0-9-]+)@get-version/g, + (_, name) => `${name}@${getPackageVersion(name)}` + ); + + // already have the contribuitors thanks in the file + if ( + file.includes("#### Special thanks to") || + file.includes("[//]: # (Do not edit this file by hand.)") + ) + return file; + + // add the contribuitors + const contribuitorsList = Array.from(contribuitors) + .map((name) => `- [@${name}](https://github.com/${name}).`) + .join("\n"); + + const doneFile = `${file}\n\n#### Special thanks to\n\n${contribuitorsList}\n\n`; + + //SIDE EFFECTS + // so that this is not ran every time, we will update the last file. + // this is for the expensive part of the script + if (index === files.length - 2) + await fs.writeFile( + `./generators/changelog/versions/${fileName}`, + doneFile + ); + return doneFile; + }) + .reverse(); + console.log("Giving some touches to the files"); + const filesContent = await Promise.all(filesStream); + await fs.writeFile("./history.md", filesContent.join("")); + console.log("Finished :)"); + } catch (e) { + console.log(e); + } +}; + + diff --git a/v3-docs/docs/generators/changelog/versions/0-before-2.10.md b/v3-docs/docs/generators/changelog/versions/0-before-2.10.md new file mode 100644 index 00000000000..8805d0bd63b --- /dev/null +++ b/v3-docs/docs/generators/changelog/versions/0-before-2.10.md @@ -0,0 +1,1699 @@ + + + +## 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 + +- modernize tools/run-updater.js by [afrokick](https://github.com/afrokick) +- feat(error message): Especifing error message when cross-boundary by [Grubba27](https://github.com/Grubba27) +- Type definitions for core packages by [piotrpospiech](https://github.com/piotrpospiech) +- Add https proxy support to meteor-installer by [heschong](https://github.com/heschong) +- Fix case insensitive lookup resource overuse by [ToyboxZach](https://github.com/ToyboxZach) +- Update default Facebook API to v15 and fix local changelog by [StorytellerCZ](https://github.com/StorytellerCZ) +- Bump to Node v14.21.1 by [StorytellerCZ](https://github.com/StorytellerCZ) +- Use true mongo binary types by [znewsham](https://github.com/znewsham) +- Add docs for Accounts.registerLoginHandler by [shivam1646](https://github.com/shivam1646) +- Updated MongoDB driver to 4.11 by [radekmie](https://github.com/radekmie) +- Show port in restart message by [harryadel](https://github.com/harryadel) +- In the client, don't wait if the stub doesn't return a promise by [denihs](https://github.com/denihs) +- The rest of type definitions for core packages by [piotrpospiech](https://github.com/piotrpospiech) +- Removing underscore in packages by [harryadel](https://github.com/harryadel): + - [twitter-oauth] Remove underscore + - [test-in-browser] Remove underscore + - [webapp-hashing] Remove underscore + - [browser-policy] Remove underscore + - [ecmascript] Remove underscore + - [browser-policy-framing] Remove underscore + - [diff-sequence] Remove underscore + - [facts-ui] Remove underscore + - [geojson-utils] Remove underscore + +#### Breaking Changes + +N/A + +#### Migration Steps + +_In case you want types in your app using the core packages types/zodern:types (now you do have the option)_ + +1. Remove `@types/meteor` package +2. Install [`zodern:types`](https://github.com/zodern/meteor-types) package +3. Follow [installation guide for the Meteor Apps](https://github.com/zodern/meteor-types#meteor-apps) to update + +#### Meteor Version Release + +* `accounts-base@2.2.5` + - added types for package. +* `browser-policy@1.1.1` + - adjusted package tests. +* `browser-policy-common@1.0.12` + - added types for package. +* `browser-policy-framing@1.1.1` + - removed underscore. +* `check@1.3.2` + - added types for package. +* `ddp@1.4.0` + - added types for package. +* `ddp-client@2.6.1` + - In the client, don't wait if the stub doesn't return a promise. +* `ddp-rate-limiter@1.1.1` + - added types for package. +* `diff-sequence@1.1.2` + - removed underscore. +* `ecmascript@0.16.3` + - removed underscore. +* `ejson@1.1.3` + - added types for package. +* `ejson@2.2.2` + - added types for package. +* `facebook-oauth@1.12.0` + - Updated default version of Facebook GraphAPI to v15 +* `facts-ui@1.0.1` + - removed underscore. +* `fetch@0.1.2` + - added types for package. +* `geojson-utils@1.0.11` + - removed underscore. +* `hot-module-replacement@0.5.2` + - added types for package. +* `meteor@1.10.2` + - added types for package. +* `modern-browsers@0.1.9` + - added types for package. +* `modules-runtime@0.13.2` + - added accurate error messages. +* `modules-runtime-hot@0.14.1` + - added accurate error messages. +* `mongo@1.16.1` + - added types for package. + - added true mongo binary +* `npm-mongo@4.11.0` + - updated npm mongo version to match npm one. +* `promise@0.13.0` + - added types for package. +* `random@1.2.1` + - added types for package. +* `reactive-dict@1.3.1` + - added types for package. +* `reactive-dict@1.0.12` + - added types for package. +* `server-render@0.4.1` + - added types for package. +* `service-configuration@1.3.1` + - added types for package. +* `session@1.2.1` + - added types for package. +* `test-in-browser@1.3.1` + - removed underscore. +* `tracker@1.2.1` +- added types for package. +* `twitter-oauth@1.3.1` + - removed underscore. +* `underscore@1.0.11` + - added types for package. +* `webapp@1.13.2` + - added types for package. +* `webapp-hashing@1.1.1` + - added types for package. +## v2.8, 2022-10-19 + +#### Highlights +* New MongoDB Package Async API. [PR](https://github.com/meteor/meteor/pull/12028) +* Node update to [v14.20.1](https://nodejs.org/en/blog/release/v14.20.1/) as part of the [September 22nd security release](https://nodejs.org/en/blog/vulnerability/september-2022-security-releases/) +* Update MongoDB driver to 4.9. [PR](https://github.com/meteor/meteor/pull/12097) +* Meteor.callAsync method. [PR](https://github.com/meteor/meteor/pull/12196) +* Added new Chakra-ui Skeleton. [PR](https://github.com/meteor/meteor/pull/12181) +* Added new Solid Skeleton. [PR](https://github.com/meteor/meteor/pull/12186) + +#### Breaking Changes +N/A + +#### Migration Steps +Read our [Migration Guide](https://guide.meteor.com/2.8-migration.html) for this version. + +#### Meteor Version Release +* `modules@0.19.0`: + - Updating reify version. [PR](https://github.com/meteor/meteor/pull/12055). +* `minimongo@1.9.0`: + - New methods to work with the Async API. [PR](https://github.com/meteor/meteor/pull/12028). + - Solved invalid dates in Minimongo Matcher [PR](https://github.com/meteor/meteor/pull/12165). +* `mongo@1.16.0`: + - Adding async counterparts that allows gradual migration from Fibers. [PR](https://github.com/meteor/meteor/pull/12028). + - Improved oplogV2V1Converter implementation. [PR](https://github.com/meteor/meteor/pull/12116). + - Exit on MongoDB connection error. [PR](https://github.com/meteor/meteor/pull/12115). + - Fixed MongoConnection._onFailover hook. [PR](https://github.com/meteor/meteor/pull/12125). + - Fixed handling objects in oplogV2V1Converter. [PR](https://github.com/meteor/meteor/pull/12107). +* `meteor@1.10.1`: + - Create method to check if Fibers is enabled by flag DISABLE_FIBERS. [PR](https://github.com/meteor/meteor/pull/12100). + - Fix bugs for linter build plugins. [PR](https://github.com/meteor/meteor/pull/12120). + - Document meteor show METEOR. [PR](https://github.com/meteor/meteor/pull/12124). + - Update Cordova Android to 10.1.2. [PR](https://github.com/meteor/meteor/pull/12131). + - Fixed flaky test. [PR](https://github.com/meteor/meteor/pull/12129). + - Refactoring/Remove unused imports from tools folder. [PR](https://github.com/meteor/meteor/pull/12084). + - Fix problem when publishing async methods. [PR](https://github.com/meteor/meteor/pull/12152). + - Update skeletons Apollo[PR](https://github.com/meteor/meteor/pull/12091) and other skeletons [PR](https://github.com/meteor/meteor/pull/12099) + - Added callAsync method for calling async methods [PR](https://github.com/meteor/meteor/pull/12196). +* `meteor-installer@2.7.5`: + - 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`: + - Fixing bug where tokens where never expiring. [PR](https://github.com/meteor/meteor/pull/12088). +* `accounts-base@2.2.4`: + - Adding new options to the `Accounts.config()` method: `loginTokenExpirationHours` and `tokenSequenceLength`. [PR](https://github.com/meteor/meteor/pull/12088). +* `Meteor Repo`: + - Included githubactions in the dependabot config. [PR](https://github.com/meteor/meteor/pull/12061). + - Visual rework in meteor readme. [PR](https://github.com/meteor/meteor/pull/12133). + - Remove useraccounts from Guide. [PR](https://github.com/meteor/meteor/pull/12090). +* `minifier-css@1.6.1`: + - Update postcss package to avoid issues with `Browserslist` and `caniuse-lite`. [PR](https://github.com/meteor/meteor/pull/12136). +* `minifier-js@2.7.5`: + - Update terser package due to security fixes and to take advantage of terser improvements. [PR](https://github.com/meteor/meteor/pull/12137). +* `standard-minifier-css@1.8.2`: + - Update dependencies to avoid issues with `Browserslist` and `caniuse-lite`. [PR](https://github.com/meteor/meteor/pull/12141). +* `standard-minifier-js@2.8.1`: + - Update dependencies to avoid issues with `Browserslist` and `caniuse-lite`. [PR](https://github.com/meteor/meteor/pull/12142). +* `ddp-server@2.5.1`: + - Rename setPublicationStrategy and getPublicationStrategy arguments. [PR](https://github.com/meteor/meteor/pull/12166). + +#### Special thanks to +- [@fredmaiaarantes](https://github.com/fredmaiaarantes) +- [@radekmie](https://github.com/radekmie) +- [@naveensrinivasan](https://github.com/naveensrinivasan) +- [@zodern](https://github.com/zodern) +- [@brucejo75](https://github.com/brucejo75) +- [@matheusccastroo](https://github.com/matheusccastroo) +- [@victoriaquasar](https://github.com/victoriaquasar) +- [@StorytellerCZ](https://github.com/StorytellerCZ) +- [@Grubba27](https://github.com/Grubba27) +- [@denihs](https://github.com/denihs) +- [@edimarlnx](https://github.com/edimarlnx) + +For making this great framework even better! + +## v2.7.3, 2022-05-3 + +#### Highlights +* `accounts-passwordless@2.1.2`: + - Throwing an error when the login tokens are not generated well calling requestLoginTokenForUser. [PR](https://github.com/meteor/meteor/pull/12047/files). +* Node updated to v14.19.3 +* npm update to v6.14.17 +* Fix recompiling npm packages for web arch. [PR](https://github.com/meteor/meteor/pull/12023). + +#### Breaking Changes +N/A + +#### Migration Steps + +#### Meteor Version Release +* `accounts-passwordless@2.1.2`: + - Throwing an error when the login tokens are not generated well calling requestLoginTokenForUser. [PR](https://github.com/meteor/meteor/pull/12047/files). +* `babel-runtime@1.5.1`: + - Make client 25kb smaller. [PR](https://github.com/meteor/meteor/pull/12051). +* Node updated to v14.19.3 +* npm update to v6.14.17 +* Fix win style paths being added to watch sets. +* Fix recompiling npm packages for web arch. [PR](https://github.com/meteor/meteor/pull/12023). + +## v2.7.2, 2022-05-10 + +#### Highlights + +#### Breaking Changes +N/A +#### Migration Steps + +#### Meteor Version Release + +* `mongo@1.15.0` + - New option `Meteor.settings.packages.mongo.reCreateIndexOnOptionMismatch` for case when an index with the same name, but different options exists it will be re-created. + - If there is an error on index creation Meteor will output a better message naming the collection and index where the error occured. [PR](https://github.com/meteor/meteor/pull/11995). +* `modern-browsers@0.1.8` + - New api `getMinimumBrowserVersions` to access the `minimumBrowserVersions`. [PR](https://github.com/meteor/meteor/pull/11998). +* `socket-stream-client@0.5.0` + - Ability to disable sockjs on client side. [PR](https://github.com/meteor/meteor/pull/12007/). +* `meteor-node-stubs@1.2.3`: + - Fix using meteor-node-stubs in IE. [PR](https://github.com/meteor/meteor/pull/12014). +* New ARCH environment variable that permit users to set uname info. [PR](https://github.com/meteor/meteor/pull/12020). +* Skeleton dependencies updated. +* New Tailwind skeleton. [PR](https://github.com/meteor/meteor/pull/12000). + +#### Independent Releases + +## v2.7.1, 2022-03-31 + +#### Highlights + +#### Breaking Changes + +* `accounts-2fa@2.0.0` + - The method `has2faEnabled` no longer takes a selector as an argument, just the callback. + - `generate2faActivationQrCode` now throws an error if it's being called when the user already has 2FA enabled. + +#### Migration Steps + +#### Meteor Version Release + +* `accounts-2fa@2.0.0` + - Reduce one DB call on 2FA login. [PR](https://github.com/meteor/meteor/pull/11985) + - Throw error when user is not found on `Accounts._is2faEnabledForUser` + - Remove vulnerability from the method `has2faEnabled` + - Now the package auto-publish the field `services.twoFactorAuthentication.type` for logged in users. +* `accounts-password@2.3.1` + - Use method `Accounts._check2faEnabled` when validating 2FA +* `accounts-passwordless@2.1.1` + - Use method `Accounts._check2faEnabled` when validating 2FA +* `oauth@2.1.2` + - Check effectively if popup was blocked by browser. [PR](https://github.com/meteor/meteor/pull/11984) +* `standard-minifier-css@1.8.1` + - PostCSS bug fixes. [PR](https://github.com/meteor/meteor/pull/11987/files) + +#### Independent Releases + +## v2.7, 2022-03-24 + +#### Highlights +* Bump node version to 14.19.1 +* TailwindCSS 3.x support +* Typescript `4.5.4` upgrade +* New core package: `accounts-2fa` +* Support for 2FA in `accounts-password` and `accounts-passwordless` +* PostCSS's plugins are run by `standard-minifier-css` if the app has PostCSS configured +* App skeletons and test packages were updated to `meteor-node-stubs@1.2.1` + +#### Breaking Changes + +N/A + +#### Migration Steps + +Read our [Migration Guide](https://guide.meteor.com/2.7-migration.html) for this version. + +#### Meteor Version Release + +* `standard-minifier-css@1.8.0` + - Runs PostCSS plugins if the app has a PostCSS config and the `postcss-load-config` npm package installed. Supports TailwindCSS 3.x [PR 1](https://github.com/Meteor-Community-Packages/meteor-postcss/pull/56) [PR 2](https://github.com/meteor/meteor/pull/11903) + +* `react-fast-refresh@0.2.3` + - Fix tracking states with circular dependencies. [PR](https://github.com/meteor/meteor/pull/11923) + +* `accounts-2fa@1.0.0` + - New package to provide 2FA support + +* `accounts-password@2.3.0` + - 2FA support + +* `accounts-passwordless@2.1.0` + - 2FA support + +* `@meteorjs/babel@7.16.0` + - Upgrade TypeScript to `4.5.4` + +* `babel-compiler@7.9.0` + - Upgrade TypeScript to `4.5.4` + +* `ecmascript@0.16.2` + - Upgrade TypeScript to `4.5.4` + +* `typescript@4.5.4` + - Upgrade TypeScript to `4.5.4` [PR](https://github.com/meteor/meteor/pull/11846) + +* `accounts-ui-unstyled@1.6.0` + - `Accounts.ui.config` can now be set via `Meteor.settings.public.packages.accounts-ui-unstyled`. + +* `meteor-tool@2.7` + - CSS minifiers must now handle any caching themselves [PR](https://github.com/meteor/meteor/pull/11882) + - CSS minifiers are always given lazy css resources instead of only during production builds [PR](https://github.com/meteor/meteor/pull/11897) + - Files passed to CSS minifiers now have `file.readAndWatchFileWithHash`, same as for compilers [PR](https://github.com/meteor/meteor/pull/11882) + - If a minifier has a `beforeMinify` function, it will be called once during each build before the minifier is run the first time [PR](https://github.com/meteor/meteor/pull/11882) + - Add `Plugin.fs.readdirWithTypesSync` [PR](https://github.com/meteor/meteor/pull/11882) + +* `ejson@1.1.2` + - Fixing error were EJSON.equals fail to compare object and array if first param is object and second is array. [PR](https://github.com/meteor/meteor/pull/11866), [Issue](https://github.com/meteor/meteor/issues/11864). + +* `oauth@1.4.1` + - If OAuth._retrieveCredentialSecret() fails trying to get credentials inside Accounts.oauth.tryLoginAfterPopupClosed(), we call it again once more. + +* `accounts-base@2.2.2` + - Fix an issue where an extra field defined in `defaultFieldSelector` would not get published to the client + - Proving the login results to the `_onLoginHook` when finishing login inside `callLoginMethod`. [PR](https://github.com/meteor/meteor/pull/11913). + +* `github-oauth@1.4.0` + - More data will be retrieved and saved under `services.github` on the user account. + - Add option to disallow sign-up on GitHub using `allow_signup` [parameter](https://docs.github.com/en/developers/apps/building-oauth-apps/authorizing-oauth-apps#parameters), this will be activated based on your Accounts settings, specifically if the option `forbidClientAccountCreation` is set to `true`. + +* `email@2.2.1` + - Throwing error when trying to send email in a production environment but without a mail URL set. [PR](https://github.com/meteor/meteor/pull/11891), [Issue](https://github.com/meteor/meteor/issues/11709). + +* `facebook-oauth@1.11.0` + - Updated Facebook API to version 12.0 + +* `google-oauth@1.4.2` + - Migrate from `http` to `fetch` + +* `modules-runtime@0.13.0` + - Fix some npm modules being imported as an empty object. [PR](https://github.com/meteor/meteor/pull/11954), [Issue 1](https://github.com/meteor/meteor/issues/11900), [Issue 2](https://github.com/meteor/meteor/issues/11853). + +* `meteor-node-stubs@1.2.1` + - Adds support for [node:](https://nodejs.org/api/esm.html#node-imports) imports. + +* `minifier-jss@2.8.0` + - Updating terser. It will fix this [issue](https://github.com/meteor/meteor/issues/11721) and [this](https://github.com/meteor/meteor/issues/11930) one. [PR](https://github.com/meteor/meteor/pull/11983). + +#### Independent Releases + +## v2.6.1, 2022-02-18 + +#### Highlights + +* Fix regression on build speed by updating babel dependencies to 7.17.x +* We have removed IE 9 from our browser test list +* We are changing the device used for testing, Samsung Galaxy S7, as browserstack is having issues provisioning it. We will be using now Samsung Galaxy Note 10. +* Fix issue when generating tarballs from Windows systems related to execute permissions +* Fix issues with HMR and meteor build --debug [PR](https://github.com/meteor/meteor/pull/11922) + + +#### Breaking Changes + +- IE 9 might not be compatible from now on, although, we will still consider PR's fixing it. + +#### Migration Steps + +#### Meteor Version Release + +* `meteor-tool@2.6.1` + - Use latest @meteor/babel dependency with @babel@7.17.x + +* `@meteorjs/babel@7.15.1` + - Use babel@7.17.x + +* `babel-compiler@7.8.1` + - Use latest @meteor/babel dependency with @babel@7.17.x + +* `hot-module-replacement@0.5.1` + - Fix issues with HMR and meteor build --debug [PR](https://github.com/meteor/meteor/pull/11922) + +* `webapp@1.13.1` + - Fix issues with HMR and meteor build --debug [PR](https://github.com/meteor/meteor/pull/11922) + +#### Independent Releases + +* `mongo@1.14.6` at 2022-02-18 + - Remove false-positive warning for supported operation a.0.b:{} +* `mongo@1.14.5` at 2022-02-16 + - Fix multiple array operators bug and add support for debug messages + - Fix isArrayOperator function regexp false-positive +* `mongo@1.14.4` at 2022-02-11 + - Fix sync return for insert methods inside _collection private method [PR](https://github.com/meteor/meteor/pull/11907) + - Support the new "projection" field inside the decision of using oplog for a published cursor or not [PR](https://github.com/meteor/meteor/pull/11908) +* `mongo@1.14.3` at 2022-02-08 + - Remove throw on _id exclusion inside mongo collection finds. [PR](https://github.com/meteor/meteor/pull/11894). +* `mongo@1.14.2` at 2022-02-06 + - Fix flatten object issue when internal object value is an array on oplog converter. [PR](https://github.com/meteor/meteor/pull/11888). +* `mongo@1.14.1` at 2022-02-04 + - Fix flatten object issue when the object is empty on oplog converter. [PR](https://github.com/meteor/meteor/pull/11885), [Issue](https://github.com/meteor/meteor/issues/11884). + +## v2.6, 2022-02-01 + +#### Highlights + +* MongoDB Node.js driver Upgrade from 3.6.10 to 4.3.1 +* MongoDB Server 5.x Support +* Embedded Mongo now uses MongoDB 5.0.5 +* You are now able to use dark theme specific splash screens for both iOS and Android by passing an object `{src: 'light-image-src-here.png', srcDarkMode: 'dark-mode-src-here.png'}` to the corresponding key in `App.launchScreens` + +#### Breaking Changes + +* `mongo@1.14.0` + - This is not a breaking change in Meteor itself but as this is a major upgrade in the MongoDB Node.js driver you should read the [Migration Guide](https://guide.meteor.com/2.6-migration.html), especially if you are using rawCollection. + +* `meteor-tool@2.6` + - Legacy launch screens keys for iOS on `App.launchScreens` are now deprecated in favor of new storyboard compliant keys [PR #11797](https://github.com/meteor/meteor/pull/11797). This will drop the following keys we have: `['iphone5','iphone6','iphone6p_portrait','iphone6p_landscape','iphoneX_portrait','iphoneX_landscape','ipad_portrait_2x','ipad_landscape_2x','iphone','iphone_2x','ipad_portrait','ipad_landscape']`. Read the [Migration Guide](https://guide.meteor.com/2.6-migration.html) for more details. + +#### Migration Steps + +Read our [Migration Guide](https://guide.meteor.com/2.6-migration.html) for this version. + +#### Meteor Version Release + +* `mongo@1.14.0` + - `applySkipLimit` option for count() on find cursors is no longer supported. Read more about it [here](https://guide.meteor.com/2.6-migration.html), in the `Cursor.count()` section. + - internal result of operations inside Node.js MongoDB driver have changed. If you are depending on rawCollection results (not only the effect inside the DB), please review the expected format as we have done [here](https://github.com/meteor/meteor/blob/155ae639ee590bae66237fc1c29295072ec92aef/packages/mongo/mongo_driver.js#L658) + - useUnifiedTopology is not an option anymore, it defaults to true. + - native parser is not an option anymore, it defaults to false in the mongo connection. + - poolSize not an option anymore, we are using max/minPoolSize for the same behavior on mongo connection. + - fields option is deprecated, we are maintaining a translation layer to "projection" field (now prefered) until the next minor version, where we will start showing alerts. + - _ensureIndex is now showing a deprecation message + - we are maintaining a translation layer for the new oplog format, so if you read or rely on any behavior of it please read our oplog_v2_converter.js code + - update/insert/remove behavior is maintained in the Meteor way, documented in our docs, but we are now using replaceOne/updateOne/updateMany internally. This is subject to changes in the API rewrite of MongoDB without Fibers AND if you are using rawCollection directly you have to review your methods otherwise you will see deprecation messages if you are still using the old mongodb style directly. + - waitForStepDownOnNonCommandShutdown=false is not needed anymore when spawning the mongodb process + - _synchronousCursor._dbCursor.operation is not an option anymore in the raw cursor from nodejs mongodb driver. If you want to access the options, use _synchronousCursor._dbCursor.(GETTERS) - for example, _synchronousCursor._dbCursor.readPreference. + - the default write preference for replica sets on mongo v5 is w:majority + - If you are using MongoDB inside a Docker container in your dev environment, you might need to append directConnection=true in your mongouri to avoid the new mongo driver Service Discovery feature + +* `allow-deny@1.1.1` + - Handle `MongoBulkWriteError` as `BulkWriteError` was already handled. + +* `meteor-tool@2.6.0` + - Cordova changes to support new Launch Screens. + - Mongo changes to support new embedded version, 5.0.5. + - Fix resolving npm deps of local packages when on different drive. [PR](https://github.com/meteor/meteor/pull/11868) + +* `minimongo@1.8.0` + - Changes to keep everything compatible with MongoDB Server 5.x and MongoDB Node.js driver 4.x. + +* `npm-mongo@4.3.1` + - Upgraded MongoDB Node.js driver to 4.3.1 + +* `tinytest@1.2.1` + - Custom message support for `throws` + +#### Independent Releases + +## v2.5.8, 2022-05-31 + +#### Highlights + +* Fixed 2.5.7 MongoDB error +* Patch release to update Node to version 14.19.3 and npm version to 6.14.17. + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +## v2.5.7, 2022-05-31 + +#### Highlights + +* Patch release to update Node and npm versions. + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.7` + - Patch release to update Node and npm versions. + +## v2.5.6, 2022-01-25 + +#### Highlights + +* Go back to using node-fibers mainline dependency instead of a fork. Also ships fibers binaries. + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.6` + - Go back to using node-fibers mainline dependency instead of a fork. Also ships fibers binaries. + +## v2.5.5, 2022-01-18 + +#### Highlights + +* Bump node version to 14.18.3 - security patch +* Change the tar implementation for streams, used on deploying and unpacking packages. Reduced "upload bundle" time when deploying is expected. + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.5` + - Bump node version to 14.18.3 - security patch + - Change the tar implementation for streams, used on deploying and unpacking packages. Reduced "upload bundle" time when deploying is expected. + +* `accounts-base@2.2.1` + - Fixes onLogin firing twice. [PR](https://github.com/meteor/meteor/pull/11785) and [Issue](https://github.com/meteor/meteor/issues/10853) + +#### Independent Releases + +* `oauth@2.1.1` + - Fixes end of redirect response for oauth inside iframes. [PR](https://github.com/meteor/meteor/pull/11825) and [Issue](https://github.com/meteor/meteor/issues/11817) + +## v2.5.4, 2022-01-14 + +This version should be ignored. Proceed to 2.5.5 above. + +## v2.5.3, 2022-01-04 + +#### Highlights + +* Fixes invalid package.json error with `resolve` + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.3` + - Fixes invalid package.json files breaking Meteor run. [PR](https://github.com/meteor/meteor/pull/11832) and [Issue](https://github.com/meteor/meteor/issues/11830) + +#### Independent Releases + +## v2.5.2, 2021-12-21 + +#### Highlights + +* Reify performance improvements +* Node.js update to 14.18.2 +* HMR Fixes + +#### Breaking Changes + +* If a module calls `module.hot.decline()`, calling `module.hot.accept()` later now does nothing instead of overriding `module.hot.decline()`. + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.2` + - Changes @meteorjs/babel and @meteorjs/reify to improve Reify performance. + - Upgrades Node.js to 14.18.2 + - Fixes isopacket [load failure](https://github.com/meteor/meteor/issues/10930) on Windows. [PR](https://github.com/meteor/meteor/pull/11740) + +* `hot-module-replacement@0.5.0` + - Prevents hot.accept from overriding hot.decline. [PR](https://github.com/meteor/meteor/pull/11801) + - Fixes falling back to hot code push on web archs. [PR](https://github.com/meteor/meteor/pull/11795) + +* `@meteorjs/babel@7.15.0` + - Updates @meteorjs/reify to improve Reify performance. + +* `@meteorjs/reify@0.23.0` + - Uses `@meteorjs/reify` instead of `reify` + - Check scope when wrapping to fix slowness in MUI v5. [PR](https://github.com/meteor/reify/pull/1) and [Issue](https://github.com/benjamn/reify/issues/277). + +* `standard-minifier-js@2.8.0` + - Bump to apply improvements from Reify + +* `typescript@4.4.1` + - Bump to apply improvements from Reify + +* `babel-compiler@7.8.0` + - Bump to apply improvements from Reify + +* `ecmascript@0.16.1` + - Bump to apply improvements from Reify + +* `modules@0.18.0` + - Bump to apply improvements from Reify + +#### Independent Releases + +* `react-fast-refresh@0.2.2` + - [Fixes](https://github.com/meteor/meteor/issues/11744) bugs. [PR](https://github.com/meteor/meteor/pull/11794/) + +* `accounts-ui@1.4.2` + - Update usage of `accounts-passwordless` to be compatible with 2.0.0. + +* `minifier-js@2.7.3` + - Revert `evaluate` option that was set to false in 2.7.2. + +* `standard-minifier-js@2.7.3` + - Using `minifier-js@2.7.3` + + +* `npm-mongo@4.2.1` + - Update MongoDB driver version to 4.2.1 + +## v2.5.1, 2021-11-17 + +#### Highlights +- Mac M1 Support - darwin arm64. [Read more](https://blog.meteor.com/). + +#### Breaking Changes +- `Meteor.loginWithToken` from the new package `accounts-passwordless` was conflicting with another method with the same name on `accounts-base` so we had to rename the method of `accounts-passwordless` package to `Meteor.passwordlessLoginWithToken`. + +#### Meteor Version Release + +* `meteor-tool@2.5.1` + - Meteor supports now Mac M1 chips (darwin arm64) + +* `accounts-passwordless@2.0.0` + - `Meteor.loginWithToken` from the new package `accounts-passwordless` was conflicting with another method with the same name on `accounts-base` so we had to rename the method of `accounts-passwordless` package to `Meteor.passwordlessLoginWithToken`. + +#### Independent Releases +* `minifier-js@2.7.2` + - Stopped using `evaluate` option in the compression to fix a [bug](https://github.com/meteor/meteor/issues/11756). + - Updated `terser` to [v5.9.0](https://github.com/terser/terser/blob/master/CHANGELOG.md#v590) to fix various bugs + +* `standard-minifier-js@2.7.2` + - Using `minifier-js@2.7.2` + +* `github-oauth@1.3.2` + - Migrate from `http` to `fetch` + - Fix GitHub login params to adhere to changes in GitHub API + +## v2.5, 2021-10-21 + +#### Highlights + +* New package: `accounts-passwordless` +* Cordova Android v10 +* HMR now works on all architectures and legacy browsers +* `Accounts.config()` and third-party login services can now be configured from Meteor settings + +#### Breaking Changes + +* Cordova Android v10 now enables AndroidX. If you use any cordova-plugin that depends or uses any old support library, you need to include the cordova-plugin-androidx-adapter cordova-plugin, otherwise you will get build errors. + +#### Meteor Version Release + +* CircleCI testing image was updated to include Android 30 and Node 14 + +* `meteor-tool@2.5` + - Cordova Android upgraded to v10 + - HMR improvements related to `hot-module-replacement@0.4.0` + - Fix finding local packages on Windows located on drives other than C + - Fix infinite loop in import scanner when file is on a different drive than source root + - Fix Meteor sometimes not detecting changes to a file after the first time it is modified + - Fixes Meteor sometimes hanging on Windows. Reverts the temporary fix in Meteor 2.4 of disabling native file watchers for some commands + - Uses recursive file watchers on Windows and macOS. In most situations removes the up to 5 seconds delay before detecting the first change to a file, and is more efficient. + - Node updated to [v14.18.1](https://nodejs.org/en/blog/release/v14.18.1/), following [October 12th 2021 security release](https://nodejs.org/en/blog/vulnerability/oct-2021-security-releases/) + - Skeletons had their dependencies updated + +* `accounts-passwordless@1.0.0` + - New accounts package to provide passwordless authentication. + +* `accounts-password@2.2.0` + - Changes to reuse code between passwordless and password packages. + +* `accounts-base@2.2.0` + - You can now apply all the settings for `Accounts.config` in `Meteor.settings.packages.accounts-base`. They will be applied automatically at the start of your app. Given the limitations of `json` format you can only apply configuration that can be applied via types supported by `json` (ie. booleans, strings, numbers, arrays). If you need a function in any of the config options the current approach will still work. The options should have the same name as in `Accounts.config`, [check them out in docs.](https://docs.meteor.com/api/accounts-multi.html#AccountsCommon-config). + - Changes to reuse code between passwordless and password packages. + +* `accounts-ui-unstyled@1.6.0` + - Add support for `accounts-passwordless`. + +* `service-configuration@1.3.0` + - You can now define services configuration via `Meteor.settings.packages.service-configuration` by adding keys as service names and their objects being the service settings. You will need to refer to the specific service for the settings that are expected, most commonly those will be `secret` and `appId`. + +* `autoupdate@1.8.0` + - Enable HMR for all web arch's + +* `ecmascript@0.16.0` + - Enable HMR for all web arch's + +* `hot-module-replacement@0.4.0` + - Provides polyfills needed by Meteor.absoluteUrl in legacy browsers + - Improvements for HMR to work in all architectures and legacy browsers + +* `module-runtime@0.14.0` + - Improvements for legacy browsers + +* `react-fast-refrest@0.2.0` + - Enable HMR for all web arch's + +* `typescript@4.4.0` + - Enable HMR for all web arch's + +* `webapp@1.13.0` + - Update `cordova-plugin-meteor-webapp` to v2 + - Removed dependency on `cordova-plugin-whitelist` as it is now included in core + - Cordova Meteor plugin is now using AndroidX + - Added new settings option `Meteor.settings.packages.webapp.alwaysReturnContent` that will always return content on requests like `POST`, essentially enabling behavior prior to Meteor 2.3.1. + +#### Independent Releases + +* `modern-browsers@0.1.6` + - Added `mobileSafariUI` as an alias for Mobile Safari + +* `minifier-js@2.7.1` + - Updated `terser` to [v5.8.0](https://github.com/terser/terser/blob/master/CHANGELOG.md#v580) to fix various bugs + +* `standard-minifier-js@2.7.1` + - Updated `@babel/runtime` to [v7.15.4](https://github.com/babel/babel/releases/tag/v7.15.4) + +* `accounts-ui@1.4.1` + - Update compatibility range with `less` from 3.0.2 to 4.0.0 + +* `accounts-ui-unstyled@1.5.1` + - Update compatibility range with `less` from 3.0.2 to 4.0.0 + +* `google-config-ui@1.0.3` + - Deliver siteUrl in the same way as other config-ui packages + +* `ecmascript-runtime-client@0.12.1` + - Revert `core-js` to v3.15.2 due to issues in legacy build with arrays, [see issue for more details](https://github.com/meteor/meteor/issues/11662) + +* `modern-browsers@0.1.7` + - Added `firefoxMobile` as an alias for `firefox` + +* `dynamic-import@0.7.2` + - Fixes 404 in dynamic-import/fetch when ROOT_URL is set with a custom path. [see issue](https://github.com/meteor/meteor/issues/11701) + +## v2.4.1, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.4.1` + - Patch to make 2.4.1 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.4, 2021-09-15 + +#### Highlights + +* Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) +* Email package now allows setting `Email.customTransport` to override sending method. +* Use `createIndex` instead of `_ensureIndex` to align with new MongoDB naming. +* Apollo skeleton has been upgraded for [Apollo server v3](https://github.com/apollographql/apollo-server/blob/main/CHANGELOG_historical.md#v300) +* `reify` has been updated to v0.22.2 which reduces the overhead of `import` statements and some uses of `export ... from`, especially when a module is imported a large number of times or re-exports a large number of exports from other modules. PRs [1](https://github.com/benjamn/reify/pull/246), [2](https://github.com/benjamn/reify/pull/291) +* Meteor NPM installer is [now available for all platforms](https://github.com/meteor/meteor/pull/11590). +* DDP server now allows you to set publication strategies for your publications to control mergebox behavior +* On Windows Meteor should no longer be hanging on commands + +#### Migration steps + +1. Replace all usage of `collection._ensureIndex` with `collection.createIndex`. You only need to rename the method as the functionality is the same. +2. If you are using a [well known service](https://nodemailer.com/smtp/well-known/) for the email package switch to using `Meteor.settings.packages.email` settings instead of `MAIL_URL` env variable. Alternatively you can utilize the new `Email.customTransport` function to override the default package behavior and use your own. [Read the email docs](https://docs.meteor.com/api/email.html) for implementation details. + +#### Meteor Version Release + +* Skeletons dependencies updated + +* `meteor-tool@2.4` + - `meteor show` now reports if a package is deprecated + - `reify` update to v0.22.2 which bring optimizations for imports. PRs [1](https://github.com/benjamn/reify/pull/246), [2](https://github.com/benjamn/reify/pull/291) + - Apollo skeleton now uses [Apollo server v3](https://github.com/apollographql/apollo-server/blob/main/CHANGELOG.md#v300) - [migration guide](https://www.apollographql.com/docs/apollo-server/migration/) + - Upgraded `chalk` to v4.1.1 + - Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + - `METEOR_SETTINGS` is now accepted an all modes + - Native file watchers are now disabled on Windows for many file-intensive actions (like, `create`, `update`, `build` etc.), this solves an issue with hanging Meteor commands on Windows + +* `webapp@1.12` + - npm dependencies have been updated + - Added hook to change runtime config delivered to the client app, [read more](https://github.com/meteor/meteor/pull/11506) + - Added hook to get notified when the app is updated, [read more](https://github.com/meteor/meteor/pull/11607) + - `@vlasky/whomst@0.1.7` + - Added `addUpdateNotifyHook` that gets called when runtime configuration is updated + +* `logging@1.3.0` + - Switch from `cli-color` to `chalk` to have the same dependency as meteor-tool + - Fix detecting eval + - Copy over code from `Meteor._debug` to `Log.debug` which will be deprecated in the future + +* `email@2.2` + - Modernized package code + - Add alternative API function that you can hook into to utilize your own sending method: `Email.customTransport`. [Read the docs](https://docs.meteor.com/api/email.html#Email-customTransport) + - Use `Meteor.settings` for easy setup to sending email via [known providers](https://nodemailer.com/smtp/well-known/). [Read the docs](https://docs.meteor.com/api/email.html) + +* `ddp-server@2.5.0` + - One of three different publication strategies can be selected for any Meteor publication - SERVER_MERGE, NO_MERGE and NO_MERGE_NO_HISTORY. These control the behaviour of the Meteor mergebox, providing a compromise between client-server bandwidth usage and server side memory usage. [See PR](https://github.com/meteor/meteor/pull/11368) or [the documentation](https://docs.meteor.com/api/pubsub.html#Publication-strategies) for more details. + +* `mongo@1.13.0` + - Add `createIndex` as a collection function (in MongoDB since MongoDB v3). This is a new name for `_ensureIndex` which MongoDB has deprecated and removed in MongoDB 5.0. Use of `_ensureIndex` will show a deprecation warning on development. + +* `accounts-base@2.1.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `accounts-oauth@1.4.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `accounts-password@2.1.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `oauth@2.1.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `oauth1@1.5.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `facebook-oauth@1.10.0` + - Added login handler hook, like in the Google package for easier management in React Native and similar apps. [PR](https://github.com/meteor/meteor/pull/11603) + +* `service-configuration@1.5.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `ecmascript-runtime-client@0.12.0` + - `core-js@3.16.0` + +* `ecmascript-runtime-server@0.11.0` + - `core-js@3.16.0` + +* `ecmascript-runtime@0.8.0` + - Version bump to ensure changes from server & client runtime get propagated. + +* `tinytest@1.2.0` + - Add option to temporarily replace `Tinytest.add` or `Tinytest.addAsync` by `Tinytest.only` or `Tinytest.onlyAsync` so only the tests added using `only*` are going to be executed. + +* `test-helpers@1.3.0` + - Support for `Tinytest.only` and `Tinytest.onlyAsync` + +* `modules@0.17.0` + - Update `reify` to `0.22.2` + +* `standard-minifier-js@2.7.0` + - `@babel/runtime@7.15.3` + - Code modernization + - Improved error handling + +* `minifier-js@2.7.0` + - Added tests + - Code modernization + +* `standard-minifier-css@1.7.4` + - `@babel/runtime@7.15.3` + +* `minifier-css@1.6.0` + - Updated dependencies + - `postcss@8.3.5` + - `cssnano@4.1.11` + +* `callback-hook@1.4.0` + - Added `forEach` iterator to be more in-line with the ES use for iterations. `each` is now deprecated, but will remain supported. + +## v2.3.7, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.3.7` + - Patch to make 2.3.7 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.3.6, 2021-09-02 + +#### Highlights + +* Updated Node.js per [August 31st security release](https://nodejs.org/en/blog/vulnerability/aug-2021-security-releases2/) + +#### Meteor Version Release + +* `meteor-tool@2.3.6` + - Node.js updated to [v14.17.6](https://nodejs.org/en/blog/release/v14.17.6/) + +#### Independent Releases + +* `minifier-js@2.6.1` + - Terser updated to [4.8.0](https://github.com/terser/terser/blob/master/CHANGELOG.md#v480) + +* `routepolicy@1.1.1` + - Removed `underscore` dependency since it was not used in the package + +* `email@2.1.1` + - Updated `nodemailer` to v6.6.3 + +* `callback-hook@1.3.1` + - Modernized the code + - Fixed a variable assignment bug in `dontBindEnvironment` function + +* `less@4.0.0` + - Updated `less` to v4.1.1 + - Fixed tests + +* `npm-mongo@3.9.1` + - `mongodb@3.6.10` + +* `accounts-base@2.0.1` + - Create index on `services.password.enroll.when` + - Blaze weak dependency updated to v2.5.0 + +* `facebook-oauth@1.9.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `github-oauth@1.3.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `google-oauth@1.3.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `meetup-oauth@1.1.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `meteor-developer-oauth@1.3.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `weibo-oauth@1.3.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `oauth1@1.4.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + - Blaze weak dependency updated to v2.5.0 + +* `ddp-server@2.4.1` + - Fix a bug where `testMessageOnConnect` has always been sent + +* `accounts-password@2.0.1` + - Fix use of `isEnroll` in reset password + +* `mdg:geolocation@1.3.1` + - Fixed API to work with Meteor 2.3+ + +* `mdg:reload-on-resume@1.0.5` + - Fixed API to work with Meteor 2.3+ + +## v2.3.5, 2021-08-12 + +#### Highlights + +* Updated Node.js per the [August security release](https://nodejs.org/en/blog/vulnerability/aug-2021-security-releases/) +* Includes same improvements as in Meteor v2.2.3 + - Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + - `@meteorjs/babel@7.12.0` + +#### Meteor Version Release + +* `meteor-tool@2.3.5` + - Node.js updated to [v14.17.5](https://nodejs.org/en/blog/release/v14.17.5/) + - Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + - `@meteorjs/babel@7.12.0` + - Fix broken source maps in VSCode - [PR](https://github.com/meteor/meteor/pull/11584) + +## v2.3.4, 2021-08-03 + +* Fix an issue in `bare` and `vue` skeletons + +## v2.3.3, 2021-08-02 + +* Security patch of Node.js to [14.17.4](https://nodejs.org/en/blog/release/v14.17.4/) +* App skeletons had the following dependencies updated: + - `meteor-node-stubs@1.1.0` + - `@babel/runtime@7.14.8` +* `babel/parser@7.14.9` for server dev bundle + +## v2.3.2, 2021-07-13 + +#### Meteor Version Release + +* `meteor-tool@2.3.2` + - fixes a bug that makes `meteor run android` run with the new aab package flag + +## v2.3.1, 2021-07-08 + +#### Highlights + +* Fix windows issue when running webapp package. +* Node.js updated to 14.17.3, following [security release](https://nodejs.org/en/blog/vulnerability/july-2021-security-releases/) + +#### Breaking Changes + +* Meteor will now generate ".aab" (bundle files) by default when building for Android. This is the [new default format](https://android-developers.googleblog.com/2021/06/the-future-of-android-app-bundles-is.html) for Android apps. Use the new build flag `--packageType=apk` if you still need to generate APK. + +#### Meteor Version Release + +* Updated travis CI environment to use Node.js 14.17.3 + +* `meteor-tool@2.3.1` + - Node.js updated to [14.17.2](https://nodejs.org/en/blog/release/v14.17.2/) and [14.17.3](https://nodejs.org/en/blog/release/v14.17.3/) + - `@babel/runtime` dependency updated to v7.14.6 across the tool and testing apps + - Skeletons dependencies updated + - Apollo skeleton removed `apollo-boost` dependency which is no longer needed + - New build flag `--packageType` to choose between apk/bundle for android builds (defaults to bundle). + +#### Independent Releases + +* `webapp@1.11.1` + - Remove `posix` from npm shrinkwrap, to fix a bug it causes on Windows. + +* `less@3.0.2` + - Updated `@babel/runtime` to v7.14.6 + - Updated `less` to v3.11.3 + +* `standard-minifiers-css@1.7.3` + - Updated `@babel/runtime` to v7.14.6 + +* `standard-minifiers-js@2.6.1` + - Updated `@babel/runtime` to v7.14.6 + +* `dynamic-import@0.7.1` + - Fix [Safari 14 bug](https://bugs.webkit.org/show_bug.cgi?id=226547) with indexedDB + +## v2.3, 2021-06-24 + +#### Highlights + +* Node.js update to 14.17.1 from 12.22.1 πŸŽ‰ + +* Typescript update to [4.3.2](https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/) + +* Packages had their backward compatibility to before Meteor 1.0 removed. See below for more details. + +* Improved tracking of which files are used by build plugins to know when it should do a full rebuild, a faster client-only rebuild, or can completely skip rebuilding after a file is modified. This should work with any type of file in any directory, and for both files in the app and files in packages. The most noticeable improvement is when modifying a file only used on the client Meteor will only rebuild the client, even if the file is not inside `imports` or a `client` folder. + +### Summary of breaking changes + +- As Node.js version was upgraded to a new major version we recommend that you review if your npm dependencies are compatible with Node.js 14. + - If we receive reports from breaking changes we are going to list them here but so far we are not aware of any. + - We recommend that you read Node.js [release notes](https://nodejs.org/en/blog/release/v14.0.0/) though. + +- Accounts have undergone some major changes including major version bump. See below for more details. + +- All official packages that have been deprecated have now the deprecated flag and will inform you about that if you install or update them. + +- If you are working with enrollments in user accounts, do note that the enrollment token handling is now separate from reset password token. The token is now under `services.password.enroll`, so adjust your code accordingly if you use it. + +### Migration steps + +- As Node.js version was upgraded we recommend that you remove your `node_modules` folder (`rm -rf node_modules`) and run `meteor npm i` to be sure you compile all the binary dependencies again using the new Node.js version. + - Maybe you also want to recreate your lock file. + - If you get an error try `meteor reset` which will clear caches, beware that this will also remove your local DB for your app. + +- If you are maintaining a package that depends on one of the accounts packages which had a major version bump you will either need to set the new version manually or set `api.versionsFrom('2.3')`. + You can also have it reference its current version and 2.3 like this: `api.versionsFrom(['1.12', '2.3'])`, for specific package it can be like this: `api.use('accounts-base@1.0.1 || 2.0.0')`. + +- Old API for packages definitions has been removed. The old underscore method names (e.g. `api.add_files()`) will no longer work, please use the camel case method names (e.g. `api.addFiles()`). + +### Breaking changes +* Removed deprecated `mobile-port` flag + +* Removed deprecated `raw` name from `isobuild` + +* Removed deprecated package API method names `Package.on_use`, `Package.on_test`, `Package._transitional_registerBuildPlugin` and `api.add_files`, if you haven't till now, please use the current camel case versions. + +* `accounts-base@2.0.0` + - Deprecated backward compatibility function `logoutOtherClients` has been removed. + +* `accounts-password@2.0.0` + - Deprecated backward compatibility functionality for `SRP` passwords from pre-Meteor 1.0 days has been removed. + - Enroll account workflow has been separated from reset password workflow (the enrollment token records are now stored in a separate db field `services.password.enroll`). + +* `ddp-client@2.5.0` + - Removed deprecated backward compatibility method names for Meteor before 1.0 + +* `ddp-server@2.4.0` + - Removed deprecated backward compatibility method names for Meteor before 1.0 + +* `meteor-base@1.5.0` + - Removed `livedata` dependency which was there for packages build for 0.9.0 + +* `minimongo@1.7.0` + - Removed the `rewind` method that was noop for compatibility with Meteor 0.8.1 + +* `mongo@1.12.0` + - Removed the `rewind` method that was noop for compatibility with Meteor 0.8.1 + +* `oauth@2.0.0` + - Removed deprecated `OAuth.initiateLogin` and other functionality like the addition of `?close` in return URI for deprecated OAuth flow pre Meteor 1.0 + +* `markdown@2.0.0` + - Use lazy imports to prevent it from being added to the initial bundle + - This package is now deprecated + +* `http@2.0.0` + - Internally http has been replaced by [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API), should still work as previous version, but edge cases might be different. This is to aid you in transition to fetch. Note that this means that the `npmRequestOptions` parameter to `HTTP.call` has been removed, as `request` is no longer used internally. + +* `socket-stream-client@0.4.0` + - Remove IE8 checks + +#### Meteor Version Release + +* `meteor-tool@2.3` + - Node.js update to 14.17.1 from 12.22.1 πŸŽ‰ + - This is a major upgrade in Node.js. See the [release notes](https://nodejs.org/en/blog/release/v14.0.0/) for more details. + - `npm` update to 6.14.13. + - `fibers` has been updated to v5.0.0. + - `promise` has been updated to v8.1.0. + - `node-gyp` has been updated to v8.0.0. + - `node-pre-gyp` has been updated to v0.15.0. + - `@babel/runtime` has been updated to v7.14.0. + - `request` has been updated to v2.88.2. + - `uuid` has been updated to v3.4.0. + - `graceful-fs` has been updated to v4.2.6. + - `tar` has been updated to v2.2.2. + - `sqlite3` has been updated to v5.0.2. + - `http-proxy` has been updated to v1.18.1. + - `wordwrap` has been updated to v1.0.0. + - `moment` has been updated to v2.29.1. + - `glob` has been updated to v7.1.6. + - `split2` has been updated to v3.2.2. + - `lru-cache` has been updated to v4.1.5. + - `anser` has been updated to v2.0.1. + - `xmlbuilder2` has been updated to v1.8.1. + - `ws` has been updated to v7.4.5. + - `underscore` has been updated to v1.13.1 + - `optimism` has been updated to v0.16.1 + - `@wry/context` has been update to v0.6.0 + - Reduced time spent by server (re)start in development by adding a cache for Reify. This optimization is on by default in development. Set the new `METEOR_TOOL_ENABLE_REIFY_RUNTIME_CACHE` and `METEOR_REIFY_CACHE_DIR` environment variables to adjust it or turn it on for production [read more in the PR](https://github.com/meteor/meteor/pull/11400). + - New flag `--platforms` has been added to the `build` command to specify the platform you want to build for. `meteor build . --platforms=android`. This is useful for example when you are not using a MacOS and you want to build your app only for Android. Also to save time on CI not building all the platforms all the time. See [PR](https://github.com/meteor/meteor/pull/11437) for details. + - The undocumented environment variable `DDP_DEFAULT_CONNECTION_URL` behavior has changed. Setting `DDP_DEFAULT_CONNECTION_URL` when running the server (development: `meteor run` or production: `node main.js`) sets the default DDP server value for meteor. But this did not work for `cordova` apps. Now you can define the `cordova` app default DDP server value by setting `DDP_DEFAULT_CONNECTION_URL` when building (`meteor build`). + - Skeletons dependencies updated to latest version + - Svelte skeleton now has HMR + - New deploy option: `--build-only`. Helpful if you want to build first and after some validations proceeding with the upload and deploy. [Read more](https://galaxy-guide.meteor.com/deploy-command-line.html#cache-only) + - Improved watched system to properly rebuild `client` even when a file is outside of `client` or `imports` folders. See [PR](https://github.com/meteor/meteor/pull/11474) for details. + - Fix an issue when `App.appendToConfig` crashed Cordova build. + - Reify compiler now uses cache in runtime. [Read more](https://github.com/meteor/meteor/pull/11400) + +* `launch-screen@1.3.0` + - Removes LaunchScreen from web clients. + +* `meteor-babel@7.11.0 (@meteorjs/babel)` + - Fixes for Samsung Internet v6.2+ to be considered modern browser and addition of [logical assignment operators](https://github.com/tc39/proposal-logical-assignment) via `babel-presets-meteor`. + - This package was renamed to `@meteorjs/babel`. + +* `hot-module-replacement@0.3.0` + - Fixes various HMR bugs and edge cases see [PR for more](https://github.com/meteor/meteor/pull/11405). + +* `email@2.1.0` + - Updates `nodemailer` to `6.6.0` and it now adds `charset=utf-8` to `text/plain` messages by default. + +* `server-render@0.4.0` + - Updated npm dependencies + +* `accounts-base@2.0.0` + - New hook `setAdditionalFindUserOnExternalLogin` has been added which allows you to customize user selection on external logins if you want to, for example, login a user who has the same e-mail as the external account. + +* `ddp-server@2.4.0` + - Added support for `this.unblock()` in `Meteor.publish()` context. See [PR](https://github.com/meteor/meteor/pull/11392) for more details. + - Add support in `Meteor.publish()` for async functions + +* `webapp@1.11.0` + - Webapp will respond appropriately to unsupported requests instead of sending content, including handling for new HTTP verbs. See [PR](https://github.com/meteor/meteor/pull/11224) for more details. + +#### Independent Releases + +* `ddp-server@2.3.3` + - Updates dependencies which removes Node's HTTP deprecation warning. + +* `socket-stream-client@0.3.2` + - Updates dependencies which removes Node's HTTP deprecation warning. + +* `ddp-client@2.4.1` + - Re-ordering fields in DDP message for better client readability. + +* `mongo@1.11.1` + - Fixes a `Timestamp.ONE is undefined` bug. + +* `mongo-id@1.0.8` + - Removes unused dependency `id-map`. + +* `accounts-server@1.7.1` + - To better test password format & limit password to 256 characters, you can change this limit by setting `Meteor.settings.packages.accounts.passwordMaxLength`. + +* `static-html@1.3.1` + - Removes `underscore` dependency. + +* `dev-error-overlay@0.1.1` + - Fixes sometimes page content being on top of error overlay. + +* `id-map@1.1.1` + - Removes unused dependencies and modernizing the code. + +* `http@1.4.4` + - Used the new deprecation package flag instead of loud console warning. + +* `logic-solver@2.0.8` + - Fixed `package.js` to use current `api` method calls. + +* `socket-stream-client@0.3.3` + - Update `faye-websocket` dependency to v0.11.4. + +* `jshint@1.1.8` + - The package has been deprecated. + +* `npm-bcrypt@0.9.4` + - The package has been deprecated. + +* `ecmascript-runtime-client@0.11.1` + - Updated `core-js` to v3.14.0 + +* `ecmascript-runtime-server@0.11.1` + - Updated `core-js` to v3.14.0 + +* `url@1.3.2` + - Updated `core-js` to v3.14.0 + +* `hot-module-replacement@0.2.1` + - Add missing dependency. + +* `observe-sequence@1.0.17` + - Updated dependencies + +* `observe-sequence@1.0.18` + - When `#each` argument is unsupported it will be shown + - Moving package under Blaze repository + +* `react-fast-refresh@0.1.1` + - Fixed the package to work in IE11 + +## v2.2.4, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.2.4` + - Patch to make 2.2.4 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.2.3, 2021-08-12 + +#### Highlights + +* Security update to Node.js [12.22.5](https://nodejs.org/en/blog/release/v12.22.5/) +* Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + +#### Meteor Version Release + +* `meteor-tool@2.3.3` + - Updated Node.js to 12.22.5 per [Node security update](https://nodejs.org/en/blog/vulnerability/aug-2021-security-releases/) + - Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + - `@meteorjs/babel@7.12.0` + +* `@meteorjs/babel@7.12.0` && `@meteorjs/babel@7.13.0` + - Dependencies updated to their latest versions + +* `babel-compile@7.7.0` + - `@meteorjs/babel@7.12.0` + +* `ecmascript@0.15.3` + - Typescript and Babel version bump + +* `typescript@4.3.5` + - [`typescript@4.3.5`](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + +## v2.2.2, 2021-08-02 + +#### Highlights + +- Security update to Node.js [12.22.4](https://nodejs.org/en/blog/release/v12.22.4/) + +## v2.2.1, 2021-06-02 + +#### Highlights + +- Node.js updated to [12.22.2](https://nodejs.org/en/blog/release/v12.22.2/) +- npm updated to 6.14.13 + +#### Meteor Version Release + +* `meteor-tool@2.2.1` + - Updated Node.js to 12.22.2 per [Node security update](https://nodejs.org/en/blog/vulnerability/july-2021-security-releases/) + +## v2.2, 2021-04-15 + +#### Highlights + +- MongoDB Update to 4.4.4 +- Cordova Update to 10 +- Typescript Update to 4.2.2 +- New skeleton: `meteor create myapp --svelte` + +### Breaking changes + +* N/A + +### Migration steps + +* `meteor-tool` maybe you need to install the new Visual C++ Redistributable for Visual Studio 2019 to run MongoDB 4.4.4 on Windows. [read more](https://docs.meteor.com/windows.html) + +* `mongo` package is now using useUnifiedTopology as `true` by default otherwise the new driver was producing a warning (see details below). It's important to test your app with this change. + +* `cordova` plugins and main libraries were updated from 9 to 10. It's important to test your app with these changes. + +* `typescript` was updated to 4.2.2, make sure your read the [breaking changes](https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/#breaking-changes). + +#### Meteor Version Release + +* `meteor-tool@2.2` + - Update embedded MongoDB version to 4.4.4 [#11341](https://github.com/meteor/meteor/pull/11341) + - Maybe you need to install the new Visual C++ Redistributable for Visual Studio 2019 to run on Windows. [read more](https://docs.meteor.com/windows.html) + - Fix WindowsLikeFilesystem true when release string includes case insensitive word microsoft. [#11321](https://github.com/meteor/meteor/pull/11321) + - Fix absoluteFilePath on Windows. [#11346](https://github.com/meteor/meteor/pull/11346) + - New skeleton: `meteor create myapp --svelte` + - Update Blaze skeleton to use HMR + +* `npm-mongo@3.9.0` + - Update MongoDB driver version to 3.6.6 + +* `mongo@1.11.0` + - Using useUnifiedTopology as `true` by default to avoid the warning: `(node:59240) [MONGODB DRIVER] Warning: Current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor. You can still use it as false with `Mongo._connectionOptions` or `Meteor.settings?.packages?.mongo?.options`. + +* `cordova@10` + - Update Cordova to 10.0.0 [#11208](https://github.com/meteor/meteor/pull/11208) + +* `typescript@4.2.2` + - Update Typescript to 4.2.2, make sure your read the [breaking changes](https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/#breaking-changes) [#11329](https://github.com/meteor/meteor/pull/11329) + +* `accounts-base@1.9.0` + - Allow to set token expiration to be set in milliseconds. [#11366](https://github.com/meteor/meteor/pull/11366) + +* `facebook-oauth@1.9.0` + - Upgrade default Facebook API to v10 & allow overriding this value. [#11362](https://github.com/meteor/meteor/pull/11362) + +* `minimongo@1.6.2` + - Add [$mul](https://docs.mongodb.com/manual/reference/operator/update/mul/#up._S_mul) to minimongo. [#11364](https://github.com/meteor/meteor/pull/11364) + +* `webapp@1.10.1` + - Fix for UNIX sockets with node cluster. [#11369](https://github.com/meteor/meteor/pull/11369) + + +## v2.1.2, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.1.2` + - Patch to make 2.1.2 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.1.1, 2021-04-06 + +### Changes + +#### Highlights + +- Node.js security [update](https://nodejs.org/en/blog/vulnerability/april-2021-security-releases/) to 12.22.1 + +#### Meteor Version Release + +* `meteor-tool@2.1.1` + - Node.js security [update](https://nodejs.org/en/blog/vulnerability/april-2021-security-releases/) to 12.22.1 + - npm update to 6.14.12 + +### Breaking changes + +* N/A + +### Migration steps + +* N/A + +## v2.1, 2021-02-24 + +### Changes + +#### Highlights + +- Node.js security [update](https://nodejs.org/en/blog/vulnerability/february-2021-security-releases/) to 12.21.0 + +#### Meteor Version Release + +* `meteor-tool@2.1` + - Node.js security [update](https://nodejs.org/en/blog/vulnerability/february-2021-security-releases/) to 12.21.0 + - `meteor create my-app --plan professional` new flag `plan` to enable you to choose a plan from the deploy command. + +### Breaking changes + +* N/A + +### Migration steps + +* N/A + +## v2.0.1, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.0.1` + - Patch to make 2.0.1 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.0, 2021-01-20 + +### Changes + +#### Highlights + +- Free deploy on [Cloud](https://www.meteor.com/cloud): Deploy for free to Cloud with one command: `meteor deploy myapp.meteorapp.com --free`. ([docs](https://docs.meteor.com/commandline.html#meteordeploy)) + + +- Deploy including MongoDB on [Cloud](https://www.meteor.com/cloud): Deploy including MongoDB in a shared instance for free to Cloud with one command: `meteor deploy myapp.meteorapp.com --free --mongo`. ([docs](https://docs.meteor.com/commandline.html#meteordeploy)) + + +- Hot Module Replacement (HMR): Updates the javascript modules in a running app that were modified during a rebuild. Reduces the feedback cycle while developing so you can view and test changes quicker (it even updates the app before the build has finished). Enabled by adding the `hot-module-replacement` package to an app. React components are automatically updated by default using React Fast Refresh. Integrations with other libraries and view layers can be provided by third party packages. Support for Blaze is coming soon. This first version supports app code in the modern web architecture. ([docs](https://guide.meteor.com/build-tool.html#hot-module-replacement)) [#11117](https://github.com/meteor/meteor/pull/11117) + +#### Meteor Version Release + +* `meteor-tool@2.0` + - `meteor create my-app` now creates by default a project using React. If you want to create a new project using Blaze you should use the new option `--blaze`. + - `meteor create --react my-app` is still going to create a React project. + - `meteor create --free` deploy for free to Cloud with one command: `meteor deploy myapp.meteorapp.com --free`. ([docs](https://docs.meteor.com/commandline.html#meteordeploy)). + - `meteor create --free --mongo` deploy including MongoDB in a shared instance for free to Cloud with one command: `meteor deploy myapp.meteorapp.com --free --mongo`. ([docs](https://docs.meteor.com/commandline.html#meteordeploy)) + - `isobuild` fixes a regression on recompiling node modules in different architectures. [#11290](https://github.com/meteor/meteor/pull/11290) + - `isobuild` converts npm-discards.js to TypeScript. [#10663](https://github.com/meteor/meteor/pull/10663) + - `cordova` ensures the pathname of the rootUrl is used in the mobile URL. [#11053](hhttps://github.com/meteor/meteor/pull/11053) + - Add `file.hmrAvailable()` for compiler plugins to check if a file meets the minimum requirements to be updated with HMR [#11117](https://github.com/meteor/meteor/pull/11117) + + +* `hot-module-replacement@1.0.0` + - New package that enables Hot Module Replacement for the Meteor app and provides an API to configure how updates are applied. HMR reduces the feedback cycle while developing by updating modified javascript modules within the running application. ([docs](https://docs.meteor.com/packages/hot-module-replacement.html)) [#11117](https://github.com/meteor/meteor/pull/11117) + - These packages have been updated to support HMR: `autoupdate@1.7.0`, `babel-compiler@7.6.0`, `ddp-client@2.4.0`, `dynamic-import@0.6.0`, `ecmascript@0.15.0`, `modules@0.16.0`, `modules-runtime-hot@0.13.0`, `standard-minifier-css@1.7.2`, `webapp@1.10.0`, `webapp-hashing@1.1.0` + + +* `react-fast-refresh@0.1.0` + - New package that updates React components using HMR. This is enabled by default in apps that have HMR enabled and use a supported React version. ([docs](https://atmospherejs.com/meteor/react-fast-refresh)) [#11117](https://github.com/meteor/meteor/pull/11117) + + +* `dev-error-overlay@0.1.0` + - New package that allows you to see build errors and server crashes in your browser during development. Requires the app to have HMR enabled. [#11117](https://github.com/meteor/meteor/pull/11117) + + +* `accounts-base@1.8.0` and `accounts-password@1.7.0` + - Extra parameters can now be added to reset password, verify e-mail and enroll account links that are generated for account e-mails. By default, these are added as search parameters to the generated url. You can pass them as an object in the appropriate functions. E.g. `Accounts.sendEnrollmentEmail(userId, email, null, extraParams);`. [#11288](https://github.com/meteor/meteor/pull/11288) + + +* `logging@1.2.0` + - Updates dependencies and make debug available for use in non production environments. [#11068](https://github.com/meteor/meteor/pull/11068) + +#### Independent Releases +* `react-meteor-data@2.2.0` + - Fix issue with useTracker and Subscriptions when using deps. [#306](https://github.com/meteor/react-packages/pull/306) + - Remove version constraint on core TypeScript package [#308](https://github.com/meteor/react-packages/pull/308) + + +* `http` + - It has been deprecated. [#11068](https://github.com/meteor/meteor/pull/11068) + +### Breaking changes + +* `http` package has been deprecated. Please start on migrating towards the [fetch](https://atmospherejs.com/meteor/fetch) package instead. + +### Migration steps + +Simple run `meteor update` in your app. + +Great new features and no breaking changes (except one package deprecation). You can always check our [Roadmap](https://docs.meteor.com/roadmap.html) to understand what is next. diff --git a/v3-docs/docs/generators/changelog/versions/2.10.md b/v3-docs/docs/generators/changelog/versions/2.10.md new file mode 100644 index 00000000000..fea64636f80 --- /dev/null +++ b/v3-docs/docs/generators/changelog/versions/2.10.md @@ -0,0 +1,84 @@ + +## v2.10.0, 2023-01-13 + +### Highlights + +* Update skeletons to use React 18 [PR](https://github.com/meteor/meteor/pull/12419) by [StorytellerCZ](https://github.com/StorytellerCZ). +* Use MongoDB types instead of the homebuilt [PR](https://github.com/meteor/meteor/pull/12415) by [perbergland](https://github.com/perbergland). +* Fixing wrong type definitions in MongoDB package [PR](https://github.com/meteor/meteor/pull/12409) by [ebroder](https://github.com/ebroder). +* Typescript to version v4.7.4 [PR](https://github.com/meteor/meteor/pull/12393) by [StorytellerCZ](https://github.com/StorytellerCZ). +* Update test-in-browser dependencies [PR](https://github.com/meteor/meteor/pull/12384) by [harryadel](https://github.com/harryadel). +* Update boilerplate-generator-tests [PR](https://github.com/meteor/meteor/pull/12429) by [harryadel](https://github.com/harryadel). +* Replace double-ended-queue with denque [PR](https://github.com/meteor/meteor/pull/12430) by [harryadel](https://github.com/harryadel). +* Allow multiple runtime config and updated runtime hooks [PR](https://github.com/meteor/meteor/pull/12426) by [ebroder](https://github.com/ebroder). +* Added async forEach and clear for method Hooks [PR](https://github.com/meteor/meteor/pull/12427) by [Grubba27](https://github.com/Grubba27). +* Implemented async Tracker with explicit values [PR](https://github.com/meteor/meteor/pull/12294) by [radekmie](https://github.com/radekmie). +* Improved eslint config [PR](https://github.com/meteor/meteor/pull/12309) by [afrokick](https://github.com/afrokick). + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +N/A + +#### Meteor Version Release + +* `babel-compiler@7.10.2`: + - Updated @meteorjs/babel to version 7.18.0. + - Updated to typescript to version v4.7.4. + +* `boilerplate-generator-tests@1.5.1`: + - Updated parse5 and turned streamToString into a local function. + +* `callback-hook@1.5.0` + - Added forEachAsync. + +* `ecmascript@0.16.5` + - Updated typescript to version 4.7.4. + +* `Command line`: + - Updated React skeletons to use React 18 + +* `Meteor@1.11.0`: + - Replaced double-ended-queue with [denque](https://github.com/invertase/denque) + +* `mongo@1.16.4`: + - Fixed wrong type definitions. + - switch to using MongoDB types instead of the homebuilt. + - Fixed wrong type definitions in MongoDB package related to dropIndexAsync + +* `react-fast-refresh@0.2.5`: + - Updated react-refresh dependency. + +* `test-in-browser@1.3.3`: + - Updated dependencies and removed unused libs. + +* `Tracker@1.3.0`: + - Implemented async Tracker with explicit values + +* `typescript@4.7.4` + - Updated typescript to version 4.7.4. + +* `webapp@1.13.3` + - The forEach method on Hook will stop iterating unless the iterator function returns a truthy value. + Previously, this meant that only the first registered runtime config hook would be called. + +* `@meteorjs/babel@7.18.0-beta.5` + - Updated typescript to version 4.7.4. + +#### Special thanks to +- [@StorytellerCZ](https://github.com/StorytellerCZ). +- [@perbergland](https://github.com/perbergland). +- [@ebroder](https://github.com/ebroder). +- [@harryadel](https://github.com/harryadel). +- [@radekmie](https://github.com/radekmie). +- [@Grubba27](https://github.com/Grubba27). +- [@afrokick](https://github.com/afrokick). + +For making this great framework even better! diff --git a/v3-docs/docs/generators/changelog/versions/2.11.md b/v3-docs/docs/generators/changelog/versions/2.11.md new file mode 100644 index 00000000000..c0a4ec91994 --- /dev/null +++ b/v3-docs/docs/generators/changelog/versions/2.11.md @@ -0,0 +1,137 @@ +## v2.11.0, 2023-03-02 + +### Highlights + +* MongoDB Server 6.x Support +* Embedded Mongo now uses MongoDB 6.0.3 +* Optimized makeLookupFunction + by [radekmie](https://github.com/radekmie) [PR](https://github.com/meteor/meteor/pull/12462) +* In async wrappers, catch exceptions and reject + by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12469) +* Bump Typescript to v4.9.4 by [Firfi](https://github.com/Firfi) [PR](https://github.com/meteor/meteor/pull/12465) +* Ensure the meteor.loginServiceConfiguration subscription always becomes ready + by [Torgen](https://github.com/Torgen) [PR](https://github.com/meteor/meteor/pull/12480) +* Deprecate appcache package + by [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/meteor/pull/12456) +* Made standard-minifier-css debuggable + by [softwarecreations](https://github.com/softwarecreations) [PR](https://github.com/meteor/meteor/pull/12478). +* Upgrading MongoDB Driver to v4.14 + by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12501) +* Remove Blaze dependency and types that live in blaze.d.ts + by [perbergland](https://github.com/perbergland) [PR](https://github.com/meteor/meteor/pull/12428) + +* Switch typescript skeleton to zodern:types and test that it works by [GH ebroder] [PR #12510] +* Remove packages/*/.npm from gitignore and add missing .npm folders by [GH ebroder] [PR #12508] +* Add type definitions for async methods from Meteor 2.9 by [GH ebroder] [PR #12507] +* TypeScript skeleton fixes by [GH ebroder] [PR #12506] +* Fix TypeScript type dependencies for mongo, webapp, and underscore by [GH ebroder] [PR #12505] +* Improve specificity of types previously declared as "Object" by [GH ebroder] [PR #12520] +* Bump to Node 14.21.3 by [GH StorytellerCZ] [PR #12517] + +#### Breaking Changes + +`meteor mongo` command was removed due compatibility with MongoDB v6.x of `mongosh +for more information about MongoDB migration +read our [Migration Guide](https://guide.meteor.com/2.11-migration.html) for this version. + +#### Internal API changes + +App cache is now deprecated. + +#### Migration Steps + +Read our [Migration Guide](https://guide.meteor.com/2.11-migration.html) for this version. + +#### Meteor Version Release + +* `accounts-2fa@2.0.2`: + - removed .npm/package contents and added .gitignore + +* `accounts-base@2.2.7`: + - Updated types to match async methods added in newer versions. + - Ensured the meteor.loginServiceConfiguration subscription always becomes ready, by adding a this.ready() call. + - Specified that previously were declared as "Object" types. More context can be seen in [PR #12520]. + +* `accounts-password@2.3.4`: + - Updated `Accounts.changePassword` and `Accounts.resetPassword` to be correctly verify if the new password is + valid. + - removed .npm/package contents and added .gitignore + +* `appcache@1.2.8` + - Deprecated appcache + package. [applicationCache](https://developer.mozilla.org/en-US/docs/Web/API/Window/applicationCache), which this + package relies on, has been deprecated and is not available on the latest browsers. + +* `babel-compiler@7.10.3`: + - Updated typescript to version 4.9.4. + +* `ecmascript@0.16.6`: + - Updated typescript to version 4.9.4. + +* `email@2.2.4`: + - Updated types to match async methods added in newer versions. + - Specified that previously were declared as "Object" types. More context can be seen in [PR #12520]. + +* `logging@1.3.2`: + - removed .npm/package contents and added .gitignore + +* `Command line`: + - Corrected typo in vue skeleton. + - Command `meteor mongo` was removed due compatibility with MongoDB v6.x of `mongosh` + +* `meteor@1.11.1`: + - updated types to removed unused Blaze types + - Specified that previously were declared as "Object" types. More context can be seen in [PR #12520]. + +* `minimongo@1.9.2`: + - Updated performance of makeLookupFunction + - In async wrappers, catch exceptions and reject + +* `mongo@1.16.5`: + - In async wrappers, catch exceptions and reject + - Updated MongoDB types to match driver version 4.13.0 and MongoDB server version 6.0.3 + - Specified that previously were declared as "Object" types. More context can be seen in [PR #12520]. + - Now uses MongoDB v6.0.3 + - Now uses Node v14.21.3 + +* `npm-mongo@4.14.0`: + - Updated MongoDB driver to version 4.14.0 + +* `oauth@2.2.0`: + - bumped cordova-plugin-inappbrowser to 5.0.0 + +* `react-fast-refresh@0.2.6`: + - removed .npm/package contents and added .gitignore + +* `standard-minifier-css@1.9.0`: + - standard-minifier-css is now debuggable + +* `tracker@1.3.1`: + - Added missing withComputation method in types + +* `typescript@4.9.4` + - Updated typescript to version 4.9.4. + +* `underscore@1.0.12`: + - Added dependency in types to underscore + +* `webapp@1.13.4`: + - Added dependency in types to webapp(to connect) + - removed .npm/package contents and added .gitignore + +* `@meteorjs/babel@7.18.0-beta.6` + - Updated typescript to version 4.9.4. + +#### Special thanks to + +- [@radekmie](https://github.com/radekmie). +- [@ebroder](https://github.com/ebroder). +- [@Firfi](https://github.com/Firfi). +- [@Torgen](https://github.com/Torgen). +- [@StorytellerCZ](https://github.com/StorytellerCZ). +- [@softwarecreations](https://github.com/softwarecreations). +- [@Grubba27](https://github.com/Grubba27). + +For making this great framework even better! + + diff --git a/v3-docs/docs/generators/changelog/versions/2.12.md b/v3-docs/docs/generators/changelog/versions/2.12.md new file mode 100644 index 00000000000..f0b74d35336 --- /dev/null +++ b/v3-docs/docs/generators/changelog/versions/2.12.md @@ -0,0 +1,150 @@ +## v2.12.0, 2023-04-28 + +### Highlights + +* Document main function in webapp by [harryadel](https://github.com/harryadel) [PR](https://github.com/meteor/meteor/pull/12579) +* Add undocument properties to docs by [harryadel](https://github.com/harryadel) [PR](https://github.com/meteor/meteor/pull/12563) +* Bump NPM versions for css minifiers by [wreiske](https://github.com/wreiske) [PR](https://github.com/meteor/meteor/pull/12562) +* Updated Email and Mongo package types by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12554) +* Updated security.md by [jamauro](https://github.com/jamauro) [PR](https://github.com/meteor/meteor/pull/12461) +* Added addHtmlAttributeHook type on WebApp by [DblK](https://github.com/DblK) [PR](https://github.com/meteor/meteor/pull/12545) +* Added loginServiceConfiguration type on Accounts by [DblK](https://github.com/DblK) [PR](https://github.com/meteor/meteor/pull/12539) +* Add TS types for Mongo Collection countDocuments and estimatedDocumentCount by [ArthurHoaro](https://github.com/ArthurHoaro) [PR](https://github.com/meteor/meteor/pull/12533) +* Allow setting a custom ddp-rate-limit message per rule by [wreiske](https://github.com/wreiske) [PR](https://github.com/meteor/meteor/pull/12082) +* Updated MongoDB driver to 4.15 by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12583) +* Adding warn with env variable when using old apis vy [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12585) +* Fix syntax for legacy client by [zodern](https://github.com/zodern) [PR](https://github.com/meteor/meteor/pull/12596) +* Updating MongoDB driver to 4.16 by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12599) +* Update sockjs-client by [harryadel](https://github.com/harryadel) [PR](https://github.com/meteor/meteor/pull/12590) +* [Accounts] set custom collection by [dmromanov](https://github.com/dmromanov) [PR](https://github.com/meteor/meteor/pull/12591) +* Wrappers to help in the async migration by [matheusccastroo](https://github.com/matheusccastroo) [PR](https://github.com/meteor/meteor/pull/12593) +* Mongo query hangs all clients subscribed to a query/collection by [KoenLav](https://github.com/KoenLav) [PR](https://github.com/meteor/meteor/pull/12587) +* Blaze to 2.6.2 by [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/blaze/pull/411) + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +Now if you want to check where do you call old-style api methods +you can use ```WARN_WHEN_USING_OLD_API``` before starting your meteor process. + + +#### Meteor Version Release + +* `accounts-base@2.2.8`: + - Added `loginServiceConfiguration` type. + - Added the `collection` option property, in order to be able to set the collection for Accounts, + more can be seen in the [discussion](https://github.com/meteor/meteor/discussions/12544#discussioncomment-5240763) + and in the [related issue](https://github.com/meteor/meteor-feature-requests/issues/20). + - `onCreateUserHook` now accept promises and wait if necessary. + +* `babel-compiler@7.10.4`: + - Added `es5` compatible syntax. + +* `browser-policy-content@1.1.2`: + - Added `es5` compatible syntax. + +* `browser-policy-framing@1.1.2`: + - Added `es5` compatible syntax. + +* `browser-policy@1.1.2`: + - Updated test name. + +* `callback-hook@1.5.1`: + - Added async hooks possibility to make async migrations easier. + +* `context@0.5.1`: + - Added `es5` compatible syntax. + +* `ddp-rate-limiter@1.2.0`: + - Allow setting a custom ddp-rate-limit message per rule. + +* `ddp-server@2.6.1`: + - Updated sockjs version. + +* `dev-error-overlay@0.1.2`: + - Added `es5` compatible syntax by adding the `ecmascript` package. + +* `dynamic-import@0.7.3`: + - Added `es5` compatible syntax. + +* `ecmascript@0.16.7`: + - Updated tests location. + +* `ecmascript-runtime@0.8.1`: + - Updated npm dependencies. + +* `email@2.2.5`: + - Updated type `CustomEmailOptions` to be a type instead of an interface. + +* `hot-module-replacement@0.5.3`: + - Added `es5` compatible syntax. + + +* `meteor@1.11.2`: + - Added documentation for `isTest`, `isAppTest` and `isPackageTest` methods. + - Added possibility to add async hooks to make async migrations easier. [PR](https://github.com/meteor/meteor/pull/12593) + +* `minifier-css@1.6.4`: + - Bump NPM versions for css minifiers. + +* `minimongo@1.9.3`: + - Updated to be able to track old api usage. + +* `modules-runtime-hot@0.14.2`: + - Added `es5` compatible syntax. + +* `mongo@1.16.6`: + - Added `countDocuments` and `estimatedDocumentCount` types. + - Added warning for when old style apis are being used, to use this feature, + use the variable`WARN_WHEN_USING_OLD_API=true` before starting the Meteor process. + - Oplog driver updated to not throw error when MongoDB server and Meteor client mismatch. [issue](https://github.com/meteor/meteor/issues/12516) + +* `non-core`: + - Blaze to version 2.6.2. + +* `npm-mongo@4.16.0`: + - Updated MongoDB driver to 4.15. + - Updated MongoDB driver to 4.16. + +* `rate-limit@1.1.1`: + - Added `ruleId` property that will be used for setting messages. + +* `react-fast-refresh@0.2.7`: + - Added `es5` compatible syntax. + +* `socket-stream-client@0.5.0`: + - Updated sockjs version. + +* `standard-minifier-css@1.9.2`: + - Bump NPM versions for css minifiers. + +* `tracker@1.3.2`: + - Updated types and updated JSDocs for `Tracker.withComputation`. + +* `underscore@1.0.13`: + - Updated npm dependencies. + +* `webapp@1.13.5`: + - Added `addHtmlAttributeHook` type. + + + +#### Special thanks to + +- [@harryadel](https://github.com/harryadel). +- [@wreiske](https://github.com/wreiske). +- [@ebroder](https://github.com/ebroder). +- [@jamauro](https://github.com/jamauro). +- [@DblK](https://github.com/DblK). +- [@ArthurHoaro](https://github.com/ArthurHoaro). +- [@Grubba27](https://github.com/Grubba27). +- [@zodern](https://github.com/zodern). +- [@dmromanov](https://github.com/dmromanov). +- [@matheusccastroo](https://github.com/matheusccastroo). diff --git a/v3-docs/docs/generators/changelog/versions/2.13.0.md b/v3-docs/docs/generators/changelog/versions/2.13.0.md new file mode 100644 index 00000000000..76a105435dc --- /dev/null +++ b/v3-docs/docs/generators/changelog/versions/2.13.0.md @@ -0,0 +1,75 @@ +## v2.13.0, 2023-07-26 + +### Highlights + +* Handled implicit collection creation oplog message by [radekmie](https://github.com/radekmie) [PR](https://github.com/meteor/meteor/pull/12643). +* Fix upsert logs when using WARN_WHEN_USING_OLD_API flag by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12640). +* Updating mongo types by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12639). +* Fix solid skeleton by [fredmaiaarantes](https://github.com/fredmaiaarantes) [PR](https://github.com/meteor/meteor/pull/12637). +* Setting The Viewport meta tag on skeletons [fredmaiaarantes](https://github.com/fredmaiaarantes) [PR](https://github.com/meteor/meteor/pull/12636). +* Update mongo.d.ts with projection [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/meteor/pull/12635). +* Update guide code for GraphQL [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/meteor/pull/12619). +* Twitter Whitelist issue resolved [Atharshoyeb](https://github.com/Atharshoyeb) [PR](https://github.com/meteor/meteor/pull/12369). +* Node security patch (14.21.4) [PR](https://github.com/meteor/node-v14-esm/pull/1). Thanks a lot [denihs](https://github.com/denihs) for your contribuiton. +* Updated deprecated reference in mongo package by [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/meteor/pull/12653/files). +* Updated BlazeJS git ref in core meteor to 2.7.1 by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12651). +* Added `Meteor.applyAsync` types by [Julusian](https://github.com/Julusian) [PR](https://github.com/meteor/meteor/pull/12645). + + +#### Breaking Changes + +If you are running Meteor with docker you will +need to update your docker file to use our [new docker image](https://hub.docker.com/r/meteor/node) +that contains Nodejs v14.21.4. + +#### Known issues + +Please, [check our known issues page](https://docs.meteor.com/known-issues) +for more information about the problems and issues you might find while migrating. + +#### Internal changes + +* `ddp-server@get-version`: + - Updated livedata server test to be more easily debbuged. + +* `mongo@get-version`: + - Updated deprecated reference in Mongo package. + +#### Migration Steps + + +Please, follow our [migration guide](https://guide.meteor.com/2.13-migration) to understand what's needed to upgrade to Meteor 2.13. + +#### Meteor Version Release + + +* `Command line`: + - Updated metatags for skeletons. + - Updated solidjs skeleton to be more idiomatic. + +* `meteor@1.11.3`: + - Added types for applyAsync and added more documentation for applyAsync options. + +* `mongo@1.16.7`: + - Updated types with projection. + - Fixed wrong upsert logs when using WARN_WHEN_USING_OLD_API flag. + - Handled implicit collection creation oplog message. + +* `test-in-console@1.2.5`: + - Adjusted log indentation. + - All errors will be logged to console. + - Will always use puppeteer@20.4.0 + +* `twitter-oauth@1.3.3`: + - Fixed twitter whitelist issue. + + +#### Special thanks to + +- [@radekmie](https://github.com/radekmie). +- [@Grubba27](https://github.com/Grubba27). +- [@fredmaiaarantes](https://github.com/fredmaiaarantes). +- [@StorytellerCZ](https://github.com/StorytellerCZ). +- [@Atharshoyeb](https://github.com/Atharshoyeb). +- [@Julusian](https://github.com/Julusian). +- [@denihs](https://github.com/denihs). diff --git a/v3-docs/docs/generators/changelog/versions/2.13.1.md b/v3-docs/docs/generators/changelog/versions/2.13.1.md new file mode 100644 index 00000000000..c89f5400b9d --- /dev/null +++ b/v3-docs/docs/generators/changelog/versions/2.13.1.md @@ -0,0 +1,40 @@ +## v2.13.1, 2023-09-04 + +### Highlights + +* Solved zlib issue with Meteor.js and ESM Node.js 14.21.4 [PR #12765] by (GH Grubba27). + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +Please run the following command to update your project: + +```bash + +meteor update --release 2.13.1 + +``` + + +#### Meteor Version Release + + +* `Command line`: + - The bundle version was changed to 14.21.4.1 to use another compiled version of the [ESM Node.js](https://guide.meteor.com/using-node-v14.21.4). + + +#### Special thanks to + +- [@Grubba27](https://github.com/Grubba27). + + +For making this great framework even better! + + diff --git a/v3-docs/docs/generators/changelog/versions/2.13.3.md b/v3-docs/docs/generators/changelog/versions/2.13.3.md new file mode 100644 index 00000000000..cc7d30d8f86 --- /dev/null +++ b/v3-docs/docs/generators/changelog/versions/2.13.3.md @@ -0,0 +1,41 @@ +## v2.13.3, 2023-09-08 + +### Highlights + +* Solves the issue [#12771: Version 2.13.1 suddenly requires a newer glibc version](https://github.com/meteor/meteor/issues/12771). + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +Please run the following command to update your project: + +```bash + +meteor update --release 2.13.3 + +``` + + +#### Meteor Version Release + + +* `Command line`: + - The bundle version was changed to 14.21.4.3 to use another compiled version of the [ESM Node.js](https://guide.meteor.com/using-node-v14.21.4). The previous version was generated using a different unix distribution (Ubuntu) while we should use CentOS. + + +#### Special thanks to + +- [@aquinoit](https://github.com/aquinoit). +- [@fredmaiaarantes](https://github.com/fredmaiaarantes). +- [@Grubba27](https://github.com/Grubba27). + +For making this great framework even better! + + diff --git a/v3-docs/docs/generators/changelog/versions/3.0.md b/v3-docs/docs/generators/changelog/versions/3.0.md new file mode 100644 index 00000000000..a22f83e5cf7 --- /dev/null +++ b/v3-docs/docs/generators/changelog/versions/3.0.md @@ -0,0 +1,718 @@ +## v3.0, TBD + +### Highlights + +#### Breaking Changes + +- `accounts-2fa@3.0.0`: + + - Some methods are now async. See below: + - `Accounts._is2faEnabledForUser` + - `(Meteor Method) - generate2faActivationQrCode` + - `(Meteor Method) - enableUser2fa` + - `(Meteor Method) - disableUser2fa` + - `(Meteor Method) - has2faEnabled` + +- `accounts-base@3.0.0`: + + - `methods.removeOtherTokens` is now async + - `Accounts.destroyToken` is now async + - `Accounts.insertUserDoc` is now async + - `Accounts.updateOrCreateUserFromExternalService` is now async + - `Accounts.expirePasswordToken` is now async + - `Accounts.setupUsersCollection` is now async + - `Meteor.user` is now async in server + +- `accounts-facebook@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-github@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-google@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-meetup@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-meteor-developer@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-password@3.0.0`: + + - Some server methods are now async: + - `Accounts.sendResetPasswordEmail` + - `Accounts.sendEnrollmentEmail` + - `Accounts.sendVerificationEmail` + - `Accounts.addEmail` + - `Accounts.removeEmail` + - `Accounts.verifyEmail` + - `Accounts.createUserVerifyingEmail` + - `Accounts.createUser` + - `Accounts.generateVerificationToken` + - `Accounts.generateResetToken` + - `Accounts.forgotPassword` + - `Accounts.setPassword` -- no longer exists, you should use Accounts.setPasswordAsync [PR](https://github.com/meteor/meteor/pull/13030) + - `Accounts.changePassword` + - `Accounts.setUsername` + - `Accounts.findUserByEmail` + - `Accounts.findUserByUsername` + +- `accounts-passwordless@3.0.0`: + + - `Accounts.sendLoginTokenEmail` is now async. + +- `accounts-twitter@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-ui-unstyled@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-weibo@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `allow-deny@2.0.0`: + + - Updated to accept async functions. + +- `appcache@2.0.0`: + + - Updated internal api to use `handlers` + +- `audit-argument-checks@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `autopublish@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `autoupdate@2.0.0`: + + - Updated api to be async, with asyncronous queueing. + +- `babel-compiler@8.0.0`: + + - Removed `Promise.await` default transform. + - Added top-level-await to packages. + +- `babel-runtime@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `base64@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `binary-heap@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- Build system: + - removed `Assets.getText` + - removed `Assets.getBinary` + +- `blaze@3.0.0`: + - Todo + +- `boilerplate-generator-tests@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `boilerplate-generator@2.0.0`: + + - `toHTML` is no longer available (it was already deprecated). Use `toHTMLStream` instead. + - Updated to use `handlers` + +- `browser-policy-common@2.0.0`: + + - Updated to use `handlers` + +- `browser-policy-content@2.0.0`: + + - Some methods are now async. See below: + - `BrowserPolicy.content.setPolicy` + - `BrowserPolicy.content.allowInlineScripts` + - `BrowserPolicy.content.disallowInlineScripts` + - `BrowserPolicy.content.disallowAll` + - `BrowserPolicy.setDefaultPolicy` + +- `browser-policy-framing@2.0.0`: + - Package was bumped due to a dependency update. No code changes were made. + +- `browser-policy@2.0.0`: + Updated to use async methods from `browser-policy-common` and `browser-policy-content`. + +- `caching-compiler@2.0.0`: + + - `afterLink` is now async. + - Updated to use now async API. + +- `callback-hook@2.0.0`: + + - Added `forEachAsync` method. + +- `check@2.0.0`: + + - Removed `fibers` related tests. + +- `constraint-solver@2.0.0`: + + - Some methods are now async. See below: + + - `ConstraintSolver.getVersionCostSteps` + - `ConstraintSolver.analyze` + - `ConstraintSolver.resolve` + + - Updated tests to be async. + - Removed a few underscore usage. + - Added updated to use async methods + +- `context@1.0.0`: + + - Removed `fibers` from package. + +- `core-runtime@2.0.0`: + + - Created package to load packages and the app. + - This is the pakcages that sets up the Runtime. + +- `crosswalk@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ddp-client@3.0.0`: + + - Added `isAsyncCall` method to know if call is being made by a async method. + - Removed `fibers` from package. + - Updated tests to use async methods. + +- `ddp-common@2.0.0`: + + - Added `.fence` option. + +- `ddp-rate-limiter@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ddp-server@3.0.0`: + + - Updated to use async methods. + - Removed `fibers` from package. + - Updated tests to use async methods. + - Turned server implementation to async. + +- `ddp@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `diff-sequence@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `disable-oplog@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ecmascript-runtime-client@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ecmascript-runtime-server@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ecmascript-runtime@1.0.0`: + + - Added dependency to `@babel/runtime`. + +- `ecmascript@1.0.0`: + + - Added dependency to `@babel/runtime`. + - Moved runtime tests. + +- `ejson@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `email@3.0.0`: + + - `Email.send` is no longer available. Use `Email.sendAsync` instead. + - Updated types to reflext async methods and `Email.send` depracation. + +- `es5-shim@5.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `facebook-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `facebook-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `facts-base@2.0.0`: + + - turned unorderd deps on `ddp` to false. + +- `facts-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `fetch@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `force-ssl-common@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `force-ssl@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `geojson-utils@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `github-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `github-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `google-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `google-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `hot-code-push@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `http@`: + - Updated handlers to use `handlers` +- `id-map@2.0.0`: + + - Added `forEachAsync` method. + +- `insecure@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `inter-process-messaging@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `launch-screen@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `localstorage@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `logging@2.0.0`: + + - Added dependency to `@babel/runtime`. + +- `logic-solver@3.0.0`: + `Logic.disablingAssertions` is now async. + `minMaxWS` is now async. + +- `meetup-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meetup-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meteor-base@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meteor-developer-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meteor-developer-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meteor-tool@3.0.0`: + + - Changes to how meteor apps are being created [PR](https://github.com/meteor/meteor/pull/12697) + +- `meteor@2.0.0`: + + - Async local storage was added to help deal with async methods. + - Added `promiseEmmiter` to help with async methods. + - Removed `fibers` from package. + - `Meteor.absoluteUrl` in localhost uses `127.0.1` by default. + +- `minifier-css@2.0.0`: + + - `minifyCss` is now async. + - Removed `fibers` from package. + +- `minifier-js@3.0.0`: + + - `minifyJs` is now async. + - `terserMinify` no longer takes callbacks + - Removed `fibers` from package. + +* `minimongo@2.0.0`: + - `cursor.observe` now returns `isReady` and `isReadyPromise` wich indicates + if the cursor is ready and if the callbacks are have been called. + If you only use it in the `Client` or as a `LocalCollection` things have not + changed. + +- `mobile-experience@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `mobile-status-bar@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `modern-browsers@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `modules-runtime@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `modules@1.0.0`: + + - Updated `reify` version. + +- `mongo-decimal@`: + + - Updated to use `async` methods. + +- `mongo-dev-server@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `mongo-id@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `mongo-livedata@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `mongo@2.0.0`: + + - Updated to unify methods, `update`,`insert`,`remove`, `fetch` are now async, they are + the same as their `*Async` counterpart. + - `ensureIndex` and `createIndex` are now async. + +- `npm-mongo@5.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `oauth-encryption@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `oauth@`: + + - `_endOfPopupResponseTemplate` and `_endOfRedirectResponseTemplate` are no longer a property but now a function that returns a promise of the same value as before + - the following server methods are now async: + - `OAuth._renderOauthResults` + - `OAuth._endOfLoginResponse` + - `OAuth.renderEndOfLoginResponse` + - `OAuth._storePendingCredential` + - `OAuth._retrievePendingCredential` + - `ensureConfigured` + - `_cleanStaleResults` + +- `oauth@3.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `oauth1@`: + + - the following server methods are now async: + - `OAuth._storeRequestToken` + - `OAuth._retrieveRequestToken` + +- `oauth1@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `oauth2@`: + + - `OAuth._requestHandlers['2']` is now async. + +- `oauth2@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ordered-dict@2.0.0`: + + - Added `forEachAsync` method. + +- `package-stats-opt-out@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `package-version-parser@4.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `promise@1.0.0`: + + - Removed `fibers` usage + +- `random@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `rate-limit@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `reactive-dict@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `reactive-var@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `reload-safetybelt@2.0.0`: + + - Added `ecmascript` package to `package.js` + +- `reload@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `retry@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `routepolicy@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `server-render@1.0.0`: + + - Updated usage with `getBoilerplate` that are now `async`. + +- `service-configuration@2.0.0`: + + - Updated to use `createIndexAsync`. + +- `session@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `sha@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `shell-server@1.0.0`: + + - Updated to handle promises results. + +- `socket-stream-client@1.0.0`: + + - Updated tests to handle `async` code. + +- `spiderable@`: + + - Updated handlers to use `handlers` that are now using express + - removed `fibers` usage if flag is set to `true` + +- `standard-minifier-css@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `standard-minifier-js@3.0.0`: + + - `processFilesForBundle` is now `async`. + +- `standard-minifiers@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `static-html@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `test-helpers@2.0.0`: + + - Updated to use `async` methods. + - Removed `fibers` usage. + - Added possibliy to use `async` tests. + +- `test-in-browser@2.0.0`: + + - Updated css to be in dark mode. + +- `test-in-console@2.0.0`: + + - Updated log identation. + +- `test-server-tests-in-console-once@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `tinytest-harness@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `tinytest@2.0.0`: + + - Added `test name` to logs. + - Removed `fibers` usage. + +- `twitter-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `twitter-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `typescript@5.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `underscore-tests@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `underscore@2.0.0`: + + - Removed dependency in meteor package. + +- `url@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `webapp-hashing@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `webapp@2.0.0`: + + - These methods are now async: + + - `WebAppInternals.reloadClientPrograms()` + - `WebAppInternals.pauseClient()` + - `WebAppInternals.generateClientProgram()` + - `WebAppInternals.generateBoilerplate()` + - `WebAppInternals.setInlineScriptsAllowed()` + - `WebAppInternals.enableSubresourceIntegrity()` + - `WebAppInternals.setBundledJsCssUrlRewriteHook()` + - `WebAppInternals.setBundledJsCssPrefix()` + - `WebAppInternals.getBoilerplate` + + - Changed engine from connect to express and changed api naming to match express. See below: + - `WebApp.connectHandlers.use(middleware)` is now `WebApp.handlers.use(middleware)` + - `WebApp.rawConnectHandlers.use(middleware)` is now `WebApp.rawHandlers.use(middleware)` + - `WebApp.connectApp` is now `WebApp.expressApp` + +- `weibo-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `weibo-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +#### New Public API + + +- `Build system` [PR](https://github.com/meteor/meteor/pull/13030): + - Assets.getTextAsync + - Assets.getBinaryAsync + +- `accounts-base`: (2.9+) + + - `Meteor.userAsync()` + +- `callback-hook`:forEachAsync + + - `forEachAsync` + +- `ddp-server`: (2.8+) + + - `Meteor.callAsync()` + +- `minifier-css`: (2.9+) + + - `CssTools.minifyCssAsync()` + +- `mongo`: + + - `Mongo.Collection`: (2.8+) + - `createCappedCollectionAsync` + - `createIndexAsync` + - `dropCollectionAsync` + - `dropIndexAsync` + - `findOneAsync` + - `insertAsync` + - `removeAsync` + - `updateAsync` + - `upsertAsync` + - `Collection.Cursor`: (2.8+) + - `countAsync` + - `fetchAsync` + - `forEachAsync` + - `mapAsync` + - `[Symbol.asyncIterator]` so this code should work: + ```js + for await (const document of collection.find(query, options)) /* ... */ + ``` + +#### Internal API changes + +`accounts-base`: + +- `_attemptLogin` +- `_loginMethod` +- `_runLoginHandlers` + +* Upgraded `node-gyp` to v9.4.0 +* Upgraded `node-pre-gyp` to `@mapbox/node-pre-gyp` v1.0.11 + +#### New Internal API + +`accounts-password`: + +- `Accounts._checkPasswordAsync` + +#### Special thanks to + +- [@StorytellerCZ](https://github.com/sponsors/StorytellerCZ/) + +For making this great framework even better! diff --git a/v3-docs/docs/generators/changelog/versions/99999-generated-code-warning.md b/v3-docs/docs/generators/changelog/versions/99999-generated-code-warning.md new file mode 100644 index 00000000000..4b3ea646f4d --- /dev/null +++ b/v3-docs/docs/generators/changelog/versions/99999-generated-code-warning.md @@ -0,0 +1,14 @@ +# Changelog + +This is a complete history of changes for Meteor releases. + +[//]: # (Do not edit this file by hand.) + +[//]: # (This is a generated file.) + +[//]: # (If you want to change something in this file) + +[//]: # (go to meteor/docs/generators/changelog/docs) + + + diff --git a/v3-docs/docs/generators/codegen.js b/v3-docs/docs/generators/codegen.js new file mode 100644 index 00000000000..f7400410281 --- /dev/null +++ b/v3-docs/docs/generators/codegen.js @@ -0,0 +1,11 @@ +const { generateChangelog } = require("./changelog/script.js"); +const { listPackages } = require("./packages-listing/script.js"); + +async function main() { + console.log("πŸš‚ Started codegen πŸš‚"); + await generateChangelog(); + await listPackages(); + console.log("πŸš€ Done codegen πŸš€"); +} + +main(); diff --git a/v3-docs/docs/generators/packages-listing/README.md b/v3-docs/docs/generators/packages-listing/README.md new file mode 100644 index 00000000000..a87a3a80728 --- /dev/null +++ b/v3-docs/docs/generators/packages-listing/README.md @@ -0,0 +1,18 @@ +# Listing of all meteor core packages + +This is a script that will generate a list of all meteor core packages, being ran every build. +This ensures that we always have a list of core packages up to date with their correct links to GitHub. + + +We can always add packages to the list by adding them to the `script.js` constant `OUTSIDE_OF_CORE_PACKAGES`. + +Should follow the following format: + +```js +{ + name: 'package-name', + link: 'https://link-to-github.com/meteor/meteor/tree/devel/packages/package-name' +} +``` + +At the end, this script will update the file located in `docs/source/packages/packages-listing.md` with the new list of packages. diff --git a/v3-docs/docs/generators/packages-listing/script.js b/v3-docs/docs/generators/packages-listing/script.js new file mode 100644 index 00000000000..d9b94e9b740 --- /dev/null +++ b/v3-docs/docs/generators/packages-listing/script.js @@ -0,0 +1,55 @@ +const fs = require("fs"); +const HEADER_TEMPLATE = ` + +[//]: # (Do not edit this file by hand.) + +[//]: # (This is a generated file.) + +[//]: # (If you want to change something in this file) + +[//]: # (go to meteor/docs/generators/packages-listing) + +# Core Packages + + +`; + +const OUTSIDE_OF_CORE_PACKAGES = [ + { + name: "blaze", + link: "https://github.com/meteor/blaze", + }, + { + name: "react-packages", + link: "https://github.com/meteor/react-packages", + }, +]; + +const IGNORED = ["depracated", "non-core"]; +const getPackages = () => { + const packages = fs + .readdirSync("../../packages", { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name) + .filter((name) => !IGNORED.includes(name)) + .map((name) => { + return { + name, + link: `https://github.com/meteor/meteor/tree/devel/packages/${name}`, + }; + }); + return [...OUTSIDE_OF_CORE_PACKAGES, ...packages]; +}; + +const generateMarkdown = (packages) => + packages.map(({ name, link }) => `### [${name}](${link}) {#${name}}`).join("\n"); + +exports.listPackages = function() { + console.log("πŸš‚ Started listing πŸš‚"); + const packages = getPackages(); + const markdown = generateMarkdown(packages); + const content = HEADER_TEMPLATE + markdown; + console.log("πŸ“ Writing to file πŸ“"); + fs.writeFileSync("./api/packages-listing.md", content); + console.log("πŸš€ Done package listing πŸš€"); +} diff --git a/v3-docs/docs/history.md b/v3-docs/docs/history.md new file mode 100644 index 00000000000..d1e467c6f06 --- /dev/null +++ b/v3-docs/docs/history.md @@ -0,0 +1,2958 @@ +# Changelog + +This is a complete history of changes for Meteor releases. + +[//]: # (Do not edit this file by hand.) + +[//]: # (This is a generated file.) + +[//]: # (If you want to change something in this file) + +[//]: # (go to meteor/docs/generators/changelog/docs) + + + +## v3.0, TBD + +### Highlights + +#### Breaking Changes + +- `accounts-2fa@3.0.0`: + + - Some methods are now async. See below: + - `Accounts._is2faEnabledForUser` + - `(Meteor Method) - generate2faActivationQrCode` + - `(Meteor Method) - enableUser2fa` + - `(Meteor Method) - disableUser2fa` + - `(Meteor Method) - has2faEnabled` + +- `accounts-base@3.0.0`: + + - `methods.removeOtherTokens` is now async + - `Accounts.destroyToken` is now async + - `Accounts.insertUserDoc` is now async + - `Accounts.updateOrCreateUserFromExternalService` is now async + - `Accounts.expirePasswordToken` is now async + - `Accounts.setupUsersCollection` is now async + - `Meteor.user` is now async in server + +- `accounts-facebook@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-github@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-google@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-meetup@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-meteor-developer@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-password@3.0.0`: + + - Some server methods are now async: + - `Accounts.sendResetPasswordEmail` + - `Accounts.sendEnrollmentEmail` + - `Accounts.sendVerificationEmail` + - `Accounts.addEmail` + - `Accounts.removeEmail` + - `Accounts.verifyEmail` + - `Accounts.createUserVerifyingEmail` + - `Accounts.createUser` + - `Accounts.generateVerificationToken` + - `Accounts.generateResetToken` + - `Accounts.forgotPassword` + - `Accounts.setPassword` -- no longer exists, you should use Accounts.setPasswordAsync [PR](https://github.com/meteor/meteor/pull/13030) + - `Accounts.changePassword` + - `Accounts.setUsername` + - `Accounts.findUserByEmail` + - `Accounts.findUserByUsername` + +- `accounts-passwordless@3.0.0`: + + - `Accounts.sendLoginTokenEmail` is now async. + +- `accounts-twitter@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-ui-unstyled@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `accounts-weibo@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `allow-deny@2.0.0`: + + - Updated to accept async functions. + +- `appcache@2.0.0`: + + - Updated internal api to use `handlers` + +- `audit-argument-checks@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `autopublish@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `autoupdate@2.0.0`: + + - Updated api to be async, with asyncronous queueing. + +- `babel-compiler@8.0.0`: + + - Removed `Promise.await` default transform. + - Added top-level-await to packages. + +- `babel-runtime@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `base64@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `binary-heap@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- Build system: + - removed `Assets.getText` + - removed `Assets.getBinary` + +- `blaze@3.0.0`: + - Todo + +- `boilerplate-generator-tests@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `boilerplate-generator@2.0.0`: + + - `toHTML` is no longer available (it was already deprecated). Use `toHTMLStream` instead. + - Updated to use `handlers` + +- `browser-policy-common@2.0.0`: + + - Updated to use `handlers` + +- `browser-policy-content@2.0.0`: + + - Some methods are now async. See below: + - `BrowserPolicy.content.setPolicy` + - `BrowserPolicy.content.allowInlineScripts` + - `BrowserPolicy.content.disallowInlineScripts` + - `BrowserPolicy.content.disallowAll` + - `BrowserPolicy.setDefaultPolicy` + +- `browser-policy-framing@2.0.0`: + - Package was bumped due to a dependency update. No code changes were made. + +- `browser-policy@2.0.0`: + Updated to use async methods from `browser-policy-common` and `browser-policy-content`. + +- `caching-compiler@2.0.0`: + + - `afterLink` is now async. + - Updated to use now async API. + +- `callback-hook@2.0.0`: + + - Added `forEachAsync` method. + +- `check@2.0.0`: + + - Removed `fibers` related tests. + +- `constraint-solver@2.0.0`: + + - Some methods are now async. See below: + + - `ConstraintSolver.getVersionCostSteps` + - `ConstraintSolver.analyze` + - `ConstraintSolver.resolve` + + - Updated tests to be async. + - Removed a few underscore usage. + - Added updated to use async methods + +- `context@1.0.0`: + + - Removed `fibers` from package. + +- `core-runtime@2.0.0`: + + - Created package to load packages and the app. + - This is the pakcages that sets up the Runtime. + +- `crosswalk@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ddp-client@3.0.0`: + + - Added `isAsyncCall` method to know if call is being made by a async method. + - Removed `fibers` from package. + - Updated tests to use async methods. + +- `ddp-common@2.0.0`: + + - Added `.fence` option. + +- `ddp-rate-limiter@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ddp-server@3.0.0`: + + - Updated to use async methods. + - Removed `fibers` from package. + - Updated tests to use async methods. + - Turned server implementation to async. + +- `ddp@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `diff-sequence@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `disable-oplog@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ecmascript-runtime-client@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ecmascript-runtime-server@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ecmascript-runtime@1.0.0`: + + - Added dependency to `@babel/runtime`. + +- `ecmascript@1.0.0`: + + - Added dependency to `@babel/runtime`. + - Moved runtime tests. + +- `ejson@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `email@3.0.0`: + + - `Email.send` is no longer available. Use `Email.sendAsync` instead. + - Updated types to reflext async methods and `Email.send` depracation. + +- `es5-shim@5.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `facebook-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `facebook-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `facts-base@2.0.0`: + + - turned unorderd deps on `ddp` to false. + +- `facts-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `fetch@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `force-ssl-common@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `force-ssl@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `geojson-utils@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `github-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `github-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `google-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `google-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `hot-code-push@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `http@`: + - Updated handlers to use `handlers` +- `id-map@2.0.0`: + + - Added `forEachAsync` method. + +- `insecure@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `inter-process-messaging@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `launch-screen@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `localstorage@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `logging@2.0.0`: + + - Added dependency to `@babel/runtime`. + +- `logic-solver@3.0.0`: + `Logic.disablingAssertions` is now async. + `minMaxWS` is now async. + +- `meetup-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meetup-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meteor-base@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meteor-developer-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meteor-developer-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `meteor-tool@3.0.0`: + + - Changes to how meteor apps are being created [PR](https://github.com/meteor/meteor/pull/12697) + +- `meteor@2.0.0`: + + - Async local storage was added to help deal with async methods. + - Added `promiseEmmiter` to help with async methods. + - Removed `fibers` from package. + - `Meteor.absoluteUrl` in localhost uses `127.0.1` by default. + +- `minifier-css@2.0.0`: + + - `minifyCss` is now async. + - Removed `fibers` from package. + +- `minifier-js@3.0.0`: + + - `minifyJs` is now async. + - `terserMinify` no longer takes callbacks + - Removed `fibers` from package. + +* `minimongo@2.0.0`: + - `cursor.observe` now returns `isReady` and `isReadyPromise` wich indicates + if the cursor is ready and if the callbacks are have been called. + If you only use it in the `Client` or as a `LocalCollection` things have not + changed. + +- `mobile-experience@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `mobile-status-bar@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `modern-browsers@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `modules-runtime@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `modules@1.0.0`: + + - Updated `reify` version. + +- `mongo-decimal@`: + + - Updated to use `async` methods. + +- `mongo-dev-server@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `mongo-id@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `mongo-livedata@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `mongo@2.0.0`: + + - Updated to unify methods, `update`,`insert`,`remove`, `fetch` are now async, they are + the same as their `*Async` counterpart. + - `ensureIndex` and `createIndex` are now async. + +- `npm-mongo@5.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `oauth-encryption@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `oauth@`: + + - `_endOfPopupResponseTemplate` and `_endOfRedirectResponseTemplate` are no longer a property but now a function that returns a promise of the same value as before + - the following server methods are now async: + - `OAuth._renderOauthResults` + - `OAuth._endOfLoginResponse` + - `OAuth.renderEndOfLoginResponse` + - `OAuth._storePendingCredential` + - `OAuth._retrievePendingCredential` + - `ensureConfigured` + - `_cleanStaleResults` + +- `oauth@3.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `oauth1@`: + + - the following server methods are now async: + - `OAuth._storeRequestToken` + - `OAuth._retrieveRequestToken` + +- `oauth1@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `oauth2@`: + + - `OAuth._requestHandlers['2']` is now async. + +- `oauth2@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `ordered-dict@2.0.0`: + + - Added `forEachAsync` method. + +- `package-stats-opt-out@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `package-version-parser@4.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `promise@1.0.0`: + + - Removed `fibers` usage + +- `random@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `rate-limit@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `reactive-dict@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `reactive-var@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `reload-safetybelt@2.0.0`: + + - Added `ecmascript` package to `package.js` + +- `reload@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `retry@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `routepolicy@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `server-render@1.0.0`: + + - Updated usage with `getBoilerplate` that are now `async`. + +- `service-configuration@2.0.0`: + + - Updated to use `createIndexAsync`. + +- `session@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `sha@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `shell-server@1.0.0`: + + - Updated to handle promises results. + +- `socket-stream-client@1.0.0`: + + - Updated tests to handle `async` code. + +- `spiderable@`: + + - Updated handlers to use `handlers` that are now using express + - removed `fibers` usage if flag is set to `true` + +- `standard-minifier-css@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `standard-minifier-js@3.0.0`: + + - `processFilesForBundle` is now `async`. + +- `standard-minifiers@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `static-html@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `test-helpers@2.0.0`: + + - Updated to use `async` methods. + - Removed `fibers` usage. + - Added possibliy to use `async` tests. + +- `test-in-browser@2.0.0`: + + - Updated css to be in dark mode. + +- `test-in-console@2.0.0`: + + - Updated log identation. + +- `test-server-tests-in-console-once@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `tinytest-harness@1.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `tinytest@2.0.0`: + + - Added `test name` to logs. + - Removed `fibers` usage. + +- `twitter-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `twitter-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `typescript@5.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `underscore-tests@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `underscore@2.0.0`: + + - Removed dependency in meteor package. + +- `url@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `webapp-hashing@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `webapp@2.0.0`: + + - These methods are now async: + + - `WebAppInternals.reloadClientPrograms()` + - `WebAppInternals.pauseClient()` + - `WebAppInternals.generateClientProgram()` + - `WebAppInternals.generateBoilerplate()` + - `WebAppInternals.setInlineScriptsAllowed()` + - `WebAppInternals.enableSubresourceIntegrity()` + - `WebAppInternals.setBundledJsCssUrlRewriteHook()` + - `WebAppInternals.setBundledJsCssPrefix()` + - `WebAppInternals.getBoilerplate` + + - Changed engine from connect to express and changed api naming to match express. See below: + - `WebApp.connectHandlers.use(middleware)` is now `WebApp.handlers.use(middleware)` + - `WebApp.rawConnectHandlers.use(middleware)` is now `WebApp.rawHandlers.use(middleware)` + - `WebApp.connectApp` is now `WebApp.expressApp` + +- `weibo-config-ui@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +- `weibo-oauth@2.0.0`: + + - Package was bumped due to a dependency update. No code changes were made. + +#### New Public API + + +- `Build system` [PR](https://github.com/meteor/meteor/pull/13030): + - Assets.getTextAsync + - Assets.getBinaryAsync + +- `accounts-base`: (2.9+) + + - `Meteor.userAsync()` + +- `callback-hook`:forEachAsync + + - `forEachAsync` + +- `ddp-server`: (2.8+) + + - `Meteor.callAsync()` + +- `minifier-css`: (2.9+) + + - `CssTools.minifyCssAsync()` + +- `mongo`: + + - `Mongo.Collection`: (2.8+) + - `createCappedCollectionAsync` + - `createIndexAsync` + - `dropCollectionAsync` + - `dropIndexAsync` + - `findOneAsync` + - `insertAsync` + - `removeAsync` + - `updateAsync` + - `upsertAsync` + - `Collection.Cursor`: (2.8+) + - `countAsync` + - `fetchAsync` + - `forEachAsync` + - `mapAsync` + - `[Symbol.asyncIterator]` so this code should work: + ```js + for await (const document of collection.find(query, options)) /* ... */ + ``` + +#### Internal API changes + +`accounts-base`: + +- `_attemptLogin` +- `_loginMethod` +- `_runLoginHandlers` + +* Upgraded `node-gyp` to v9.4.0 +* Upgraded `node-pre-gyp` to `@mapbox/node-pre-gyp` v1.0.11 + +#### New Internal API + +`accounts-password`: + +- `Accounts._checkPasswordAsync` + +#### Special thanks to + +- [@StorytellerCZ](https://github.com/sponsors/StorytellerCZ/) + +For making this great framework even better! +## v2.13.3, 2023-09-08 + +### Highlights + +* Solves the issue [#12771: Version 2.13.1 suddenly requires a newer glibc version](https://github.com/meteor/meteor/issues/12771). + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +Please run the following command to update your project: + +```bash + +meteor update --release 2.13.3 + +``` + + +#### Meteor Version Release + + +* `Command line`: + - The bundle version was changed to 14.21.4.3 to use another compiled version of the [ESM Node.js](https://guide.meteor.com/using-node-v14.21.4). The previous version was generated using a different unix distribution (Ubuntu) while we should use CentOS. + + +#### Special thanks to + +- [@aquinoit](https://github.com/aquinoit). +- [@fredmaiaarantes](https://github.com/fredmaiaarantes). +- [@Grubba27](https://github.com/Grubba27). + +For making this great framework even better! + + +## v2.13.1, 2023-09-04 + +### Highlights + +* Solved zlib issue with Meteor.js and ESM Node.js 14.21.4 [PR](https://github.com/meteor/meteor/pull/12765) by (GH Grubba27). + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +Please run the following command to update your project: + +```bash + +meteor update --release 2.13.1 + +``` + + +#### Meteor Version Release + + +* `Command line`: + - The bundle version was changed to 14.21.4.1 to use another compiled version of the [ESM Node.js](https://guide.meteor.com/using-node-v14.21.4). + + +#### Special thanks to + +- [@Grubba27](https://github.com/Grubba27). + + +For making this great framework even better! + + +## v2.13.0, 2023-07-26 + +### Highlights + +* Handled implicit collection creation oplog message by [radekmie](https://github.com/radekmie) [PR](https://github.com/meteor/meteor/pull/12643). +* Fix upsert logs when using WARN_WHEN_USING_OLD_API flag by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12640). +* Updating mongo types by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12639). +* Fix solid skeleton by [fredmaiaarantes](https://github.com/fredmaiaarantes) [PR](https://github.com/meteor/meteor/pull/12637). +* Setting The Viewport meta tag on skeletons [fredmaiaarantes](https://github.com/fredmaiaarantes) [PR](https://github.com/meteor/meteor/pull/12636). +* Update mongo.d.ts with projection [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/meteor/pull/12635). +* Update guide code for GraphQL [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/meteor/pull/12619). +* Twitter Whitelist issue resolved [Atharshoyeb](https://github.com/Atharshoyeb) [PR](https://github.com/meteor/meteor/pull/12369). +* Node security patch (14.21.4) [PR](https://github.com/meteor/node-v14-esm/pull/1). Thanks a lot [denihs](https://github.com/denihs) for your contribuiton. +* Updated deprecated reference in mongo package by [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/meteor/pull/12653/files). +* Updated BlazeJS git ref in core meteor to 2.7.1 by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12651). +* Added `Meteor.applyAsync` types by [Julusian](https://github.com/Julusian) [PR](https://github.com/meteor/meteor/pull/12645). + + +#### Breaking Changes + +If you are running Meteor with docker you will +need to update your docker file to use our [new docker image](https://hub.docker.com/r/meteor/node) +that contains Nodejs v14.21.4. + +#### Known issues + +Please, [check our known issues page](https://docs.meteor.com/known-issues) +for more information about the problems and issues you might find while migrating. + +#### Internal changes + +* `ddp-server@3.0.0`: + - Updated livedata server test to be more easily debbuged. + +* `mongo@2.0.0`: + - Updated deprecated reference in Mongo package. + +#### Migration Steps + + +Please, follow our [migration guide](https://guide.meteor.com/2.13-migration) to understand what's needed to upgrade to Meteor 2.13. + +#### Meteor Version Release + + +* `Command line`: + - Updated metatags for skeletons. + - Updated solidjs skeleton to be more idiomatic. + +* `meteor@1.11.3`: + - Added types for applyAsync and added more documentation for applyAsync options. + +* `mongo@1.16.7`: + - Updated types with projection. + - Fixed wrong upsert logs when using WARN_WHEN_USING_OLD_API flag. + - Handled implicit collection creation oplog message. + +* `test-in-console@1.2.5`: + - Adjusted log indentation. + - All errors will be logged to console. + - Will always use puppeteer@20.4.0 + +* `twitter-oauth@1.3.3`: + - Fixed twitter whitelist issue. + + +#### Special thanks to + +- [@radekmie](https://github.com/radekmie). +- [@Grubba27](https://github.com/Grubba27). +- [@fredmaiaarantes](https://github.com/fredmaiaarantes). +- [@StorytellerCZ](https://github.com/StorytellerCZ). +- [@Atharshoyeb](https://github.com/Atharshoyeb). +- [@Julusian](https://github.com/Julusian). +- [@denihs](https://github.com/denihs). +## v2.12.0, 2023-04-28 + +### Highlights + +* Document main function in webapp by [harryadel](https://github.com/harryadel) [PR](https://github.com/meteor/meteor/pull/12579) +* Add undocument properties to docs by [harryadel](https://github.com/harryadel) [PR](https://github.com/meteor/meteor/pull/12563) +* Bump NPM versions for css minifiers by [wreiske](https://github.com/wreiske) [PR](https://github.com/meteor/meteor/pull/12562) +* Updated Email and Mongo package types by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12554) +* Updated security.md by [jamauro](https://github.com/jamauro) [PR](https://github.com/meteor/meteor/pull/12461) +* Added addHtmlAttributeHook type on WebApp by [DblK](https://github.com/DblK) [PR](https://github.com/meteor/meteor/pull/12545) +* Added loginServiceConfiguration type on Accounts by [DblK](https://github.com/DblK) [PR](https://github.com/meteor/meteor/pull/12539) +* Add TS types for Mongo Collection countDocuments and estimatedDocumentCount by [ArthurHoaro](https://github.com/ArthurHoaro) [PR](https://github.com/meteor/meteor/pull/12533) +* Allow setting a custom ddp-rate-limit message per rule by [wreiske](https://github.com/wreiske) [PR](https://github.com/meteor/meteor/pull/12082) +* Updated MongoDB driver to 4.15 by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12583) +* Adding warn with env variable when using old apis vy [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12585) +* Fix syntax for legacy client by [zodern](https://github.com/zodern) [PR](https://github.com/meteor/meteor/pull/12596) +* Updating MongoDB driver to 4.16 by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12599) +* Update sockjs-client by [harryadel](https://github.com/harryadel) [PR](https://github.com/meteor/meteor/pull/12590) +* [Accounts] set custom collection by [dmromanov](https://github.com/dmromanov) [PR](https://github.com/meteor/meteor/pull/12591) +* Wrappers to help in the async migration by [matheusccastroo](https://github.com/matheusccastroo) [PR](https://github.com/meteor/meteor/pull/12593) +* Mongo query hangs all clients subscribed to a query/collection by [KoenLav](https://github.com/KoenLav) [PR](https://github.com/meteor/meteor/pull/12587) +* Blaze to 2.6.2 by [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/blaze/pull/411) + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +Now if you want to check where do you call old-style api methods +you can use ```WARN_WHEN_USING_OLD_API``` before starting your meteor process. + + +#### Meteor Version Release + +* `accounts-base@2.2.8`: + - Added `loginServiceConfiguration` type. + - Added the `collection` option property, in order to be able to set the collection for Accounts, + more can be seen in the [discussion](https://github.com/meteor/meteor/discussions/12544#discussioncomment-5240763) + and in the [related issue](https://github.com/meteor/meteor-feature-requests/issues/20). + - `onCreateUserHook` now accept promises and wait if necessary. + +* `babel-compiler@7.10.4`: + - Added `es5` compatible syntax. + +* `browser-policy-content@1.1.2`: + - Added `es5` compatible syntax. + +* `browser-policy-framing@1.1.2`: + - Added `es5` compatible syntax. + +* `browser-policy@1.1.2`: + - Updated test name. + +* `callback-hook@1.5.1`: + - Added async hooks possibility to make async migrations easier. + +* `context@0.5.1`: + - Added `es5` compatible syntax. + +* `ddp-rate-limiter@1.2.0`: + - Allow setting a custom ddp-rate-limit message per rule. + +* `ddp-server@2.6.1`: + - Updated sockjs version. + +* `dev-error-overlay@0.1.2`: + - Added `es5` compatible syntax by adding the `ecmascript` package. + +* `dynamic-import@0.7.3`: + - Added `es5` compatible syntax. + +* `ecmascript@0.16.7`: + - Updated tests location. + +* `ecmascript-runtime@0.8.1`: + - Updated npm dependencies. + +* `email@2.2.5`: + - Updated type `CustomEmailOptions` to be a type instead of an interface. + +* `hot-module-replacement@0.5.3`: + - Added `es5` compatible syntax. + + +* `meteor@1.11.2`: + - Added documentation for `isTest`, `isAppTest` and `isPackageTest` methods. + - Added possibility to add async hooks to make async migrations easier. [PR](https://github.com/meteor/meteor/pull/12593) + +* `minifier-css@1.6.4`: + - Bump NPM versions for css minifiers. + +* `minimongo@1.9.3`: + - Updated to be able to track old api usage. + +* `modules-runtime-hot@0.14.2`: + - Added `es5` compatible syntax. + +* `mongo@1.16.6`: + - Added `countDocuments` and `estimatedDocumentCount` types. + - Added warning for when old style apis are being used, to use this feature, + use the variable`WARN_WHEN_USING_OLD_API=true` before starting the Meteor process. + - Oplog driver updated to not throw error when MongoDB server and Meteor client mismatch. [issue](https://github.com/meteor/meteor/issues/12516) + +* `non-core`: + - Blaze to version 2.6.2. + +* `npm-mongo@4.16.0`: + - Updated MongoDB driver to 4.15. + - Updated MongoDB driver to 4.16. + +* `rate-limit@1.1.1`: + - Added `ruleId` property that will be used for setting messages. + +* `react-fast-refresh@0.2.7`: + - Added `es5` compatible syntax. + +* `socket-stream-client@0.5.0`: + - Updated sockjs version. + +* `standard-minifier-css@1.9.2`: + - Bump NPM versions for css minifiers. + +* `tracker@1.3.2`: + - Updated types and updated JSDocs for `Tracker.withComputation`. + +* `underscore@1.0.13`: + - Updated npm dependencies. + +* `webapp@1.13.5`: + - Added `addHtmlAttributeHook` type. + + + +#### Special thanks to + +- [@harryadel](https://github.com/harryadel). +- [@wreiske](https://github.com/wreiske). +- [@ebroder](https://github.com/ebroder). +- [@jamauro](https://github.com/jamauro). +- [@DblK](https://github.com/DblK). +- [@ArthurHoaro](https://github.com/ArthurHoaro). +- [@Grubba27](https://github.com/Grubba27). +- [@zodern](https://github.com/zodern). +- [@dmromanov](https://github.com/dmromanov). +- [@matheusccastroo](https://github.com/matheusccastroo). +## v2.11.0, 2023-03-02 + +### Highlights + +* MongoDB Server 6.x Support +* Embedded Mongo now uses MongoDB 6.0.3 +* Optimized makeLookupFunction + by [radekmie](https://github.com/radekmie) [PR](https://github.com/meteor/meteor/pull/12462) +* In async wrappers, catch exceptions and reject + by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12469) +* Bump Typescript to v4.9.4 by [Firfi](https://github.com/Firfi) [PR](https://github.com/meteor/meteor/pull/12465) +* Ensure the meteor.loginServiceConfiguration subscription always becomes ready + by [Torgen](https://github.com/Torgen) [PR](https://github.com/meteor/meteor/pull/12480) +* Deprecate appcache package + by [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/meteor/pull/12456) +* Made standard-minifier-css debuggable + by [softwarecreations](https://github.com/softwarecreations) [PR](https://github.com/meteor/meteor/pull/12478). +* Upgrading MongoDB Driver to v4.14 + by [Grubba27](https://github.com/Grubba27) [PR](https://github.com/meteor/meteor/pull/12501) +* Remove Blaze dependency and types that live in blaze.d.ts + by [perbergland](https://github.com/perbergland) [PR](https://github.com/meteor/meteor/pull/12428) + +* Switch typescript skeleton to zodern:types and test that it works by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12510) +* Remove packages/*/.npm from gitignore and add missing .npm folders by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12508) +* Add type definitions for async methods from Meteor 2.9 by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12507) +* TypeScript skeleton fixes by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12506) +* Fix TypeScript type dependencies for mongo, webapp, and underscore by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12505) +* Improve specificity of types previously declared as "Object" by [ebroder](https://github.com/ebroder) [PR](https://github.com/meteor/meteor/pull/12520) +* Bump to Node 14.21.3 by [StorytellerCZ](https://github.com/StorytellerCZ) [PR](https://github.com/meteor/meteor/pull/12517) + +#### Breaking Changes + +`meteor mongo` command was removed due compatibility with MongoDB v6.x of `mongosh +for more information about MongoDB migration +read our [Migration Guide](https://guide.meteor.com/2.11-migration.html) for this version. + +#### Internal API changes + +App cache is now deprecated. + +#### Migration Steps + +Read our [Migration Guide](https://guide.meteor.com/2.11-migration.html) for this version. + +#### Meteor Version Release + +* `accounts-2fa@2.0.2`: + - removed .npm/package contents and added .gitignore + +* `accounts-base@2.2.7`: + - Updated types to match async methods added in newer versions. + - Ensured the meteor.loginServiceConfiguration subscription always becomes ready, by adding a this.ready() call. + - Specified that previously were declared as "Object" types. More context can be seen in [PR](https://github.com/meteor/meteor/pull/12520). + +* `accounts-password@2.3.4`: + - Updated `Accounts.changePassword` and `Accounts.resetPassword` to be correctly verify if the new password is + valid. + - removed .npm/package contents and added .gitignore + +* `appcache@1.2.8` + - Deprecated appcache + package. [applicationCache](https://developer.mozilla.org/en-US/docs/Web/API/Window/applicationCache), which this + package relies on, has been deprecated and is not available on the latest browsers. + +* `babel-compiler@7.10.3`: + - Updated typescript to version 4.9.4. + +* `ecmascript@0.16.6`: + - Updated typescript to version 4.9.4. + +* `email@2.2.4`: + - Updated types to match async methods added in newer versions. + - Specified that previously were declared as "Object" types. More context can be seen in [PR](https://github.com/meteor/meteor/pull/12520). + +* `logging@1.3.2`: + - removed .npm/package contents and added .gitignore + +* `Command line`: + - Corrected typo in vue skeleton. + - Command `meteor mongo` was removed due compatibility with MongoDB v6.x of `mongosh` + +* `meteor@1.11.1`: + - updated types to removed unused Blaze types + - Specified that previously were declared as "Object" types. More context can be seen in [PR](https://github.com/meteor/meteor/pull/12520). + +* `minimongo@1.9.2`: + - Updated performance of makeLookupFunction + - In async wrappers, catch exceptions and reject + +* `mongo@1.16.5`: + - In async wrappers, catch exceptions and reject + - Updated MongoDB types to match driver version 4.13.0 and MongoDB server version 6.0.3 + - Specified that previously were declared as "Object" types. More context can be seen in [PR](https://github.com/meteor/meteor/pull/12520). + - Now uses MongoDB v6.0.3 + - Now uses Node v14.21.3 + +* `npm-mongo@4.14.0`: + - Updated MongoDB driver to version 4.14.0 + +* `oauth@2.2.0`: + - bumped cordova-plugin-inappbrowser to 5.0.0 + +* `react-fast-refresh@0.2.6`: + - removed .npm/package contents and added .gitignore + +* `standard-minifier-css@1.9.0`: + - standard-minifier-css is now debuggable + +* `tracker@1.3.1`: + - Added missing withComputation method in types + +* `typescript@4.9.4` + - Updated typescript to version 4.9.4. + +* `underscore@1.0.12`: + - Added dependency in types to underscore + +* `webapp@1.13.4`: + - Added dependency in types to webapp(to connect) + - removed .npm/package contents and added .gitignore + +* `@meteorjs/babel@7.18.0-beta.6` + - Updated typescript to version 4.9.4. + +#### Special thanks to + +- [@radekmie](https://github.com/radekmie). +- [@ebroder](https://github.com/ebroder). +- [@Firfi](https://github.com/Firfi). +- [@Torgen](https://github.com/Torgen). +- [@StorytellerCZ](https://github.com/StorytellerCZ). +- [@softwarecreations](https://github.com/softwarecreations). +- [@Grubba27](https://github.com/Grubba27). + +For making this great framework even better! + + + +## v2.10.0, 2023-01-13 + +### Highlights + +* Update skeletons to use React 18 [PR](https://github.com/meteor/meteor/pull/12419) by [StorytellerCZ](https://github.com/StorytellerCZ). +* Use MongoDB types instead of the homebuilt [PR](https://github.com/meteor/meteor/pull/12415) by [perbergland](https://github.com/perbergland). +* Fixing wrong type definitions in MongoDB package [PR](https://github.com/meteor/meteor/pull/12409) by [ebroder](https://github.com/ebroder). +* Typescript to version v4.7.4 [PR](https://github.com/meteor/meteor/pull/12393) by [StorytellerCZ](https://github.com/StorytellerCZ). +* Update test-in-browser dependencies [PR](https://github.com/meteor/meteor/pull/12384) by [harryadel](https://github.com/harryadel). +* Update boilerplate-generator-tests [PR](https://github.com/meteor/meteor/pull/12429) by [harryadel](https://github.com/harryadel). +* Replace double-ended-queue with denque [PR](https://github.com/meteor/meteor/pull/12430) by [harryadel](https://github.com/harryadel). +* Allow multiple runtime config and updated runtime hooks [PR](https://github.com/meteor/meteor/pull/12426) by [ebroder](https://github.com/ebroder). +* Added async forEach and clear for method Hooks [PR](https://github.com/meteor/meteor/pull/12427) by [Grubba27](https://github.com/Grubba27). +* Implemented async Tracker with explicit values [PR](https://github.com/meteor/meteor/pull/12294) by [radekmie](https://github.com/radekmie). +* Improved eslint config [PR](https://github.com/meteor/meteor/pull/12309) by [afrokick](https://github.com/afrokick). + +#### Breaking Changes + +N/A + +#### Internal API changes + +N/A + +#### Migration Steps + +N/A + +#### Meteor Version Release + +* `babel-compiler@7.10.2`: + - Updated @meteorjs/babel to version 7.18.0. + - Updated to typescript to version v4.7.4. + +* `boilerplate-generator-tests@1.5.1`: + - Updated parse5 and turned streamToString into a local function. + +* `callback-hook@1.5.0` + - Added forEachAsync. + +* `ecmascript@0.16.5` + - Updated typescript to version 4.7.4. + +* `Command line`: + - Updated React skeletons to use React 18 + +* `Meteor@1.11.0`: + - Replaced double-ended-queue with [denque](https://github.com/invertase/denque) + +* `mongo@1.16.4`: + - Fixed wrong type definitions. + - switch to using MongoDB types instead of the homebuilt. + - Fixed wrong type definitions in MongoDB package related to dropIndexAsync + +* `react-fast-refresh@0.2.5`: + - Updated react-refresh dependency. + +* `test-in-browser@1.3.3`: + - Updated dependencies and removed unused libs. + +* `Tracker@1.3.0`: + - Implemented async Tracker with explicit values + +* `typescript@4.7.4` + - Updated typescript to version 4.7.4. + +* `webapp@1.13.3` + - The forEach method on Hook will stop iterating unless the iterator function returns a truthy value. + Previously, this meant that only the first registered runtime config hook would be called. + +* `@meteorjs/babel@7.18.0-beta.5` + - Updated typescript to version 4.7.4. + +#### Special thanks to +- [@StorytellerCZ](https://github.com/StorytellerCZ). +- [@perbergland](https://github.com/perbergland). +- [@ebroder](https://github.com/ebroder). +- [@harryadel](https://github.com/harryadel). +- [@radekmie](https://github.com/radekmie). +- [@Grubba27](https://github.com/Grubba27). +- [@afrokick](https://github.com/afrokick). + +For making this great framework even better! + + + +## 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 + +- modernize tools/run-updater.js by [afrokick](https://github.com/afrokick) +- feat(error message): Especifing error message when cross-boundary by [Grubba27](https://github.com/Grubba27) +- Type definitions for core packages by [piotrpospiech](https://github.com/piotrpospiech) +- Add https proxy support to meteor-installer by [heschong](https://github.com/heschong) +- Fix case insensitive lookup resource overuse by [ToyboxZach](https://github.com/ToyboxZach) +- Update default Facebook API to v15 and fix local changelog by [StorytellerCZ](https://github.com/StorytellerCZ) +- Bump to Node v14.21.1 by [StorytellerCZ](https://github.com/StorytellerCZ) +- Use true mongo binary types by [znewsham](https://github.com/znewsham) +- Add docs for Accounts.registerLoginHandler by [shivam1646](https://github.com/shivam1646) +- Updated MongoDB driver to 4.11 by [radekmie](https://github.com/radekmie) +- Show port in restart message by [harryadel](https://github.com/harryadel) +- In the client, don't wait if the stub doesn't return a promise by [denihs](https://github.com/denihs) +- The rest of type definitions for core packages by [piotrpospiech](https://github.com/piotrpospiech) +- Removing underscore in packages by [harryadel](https://github.com/harryadel): + - [twitter-oauth] Remove underscore + - [test-in-browser] Remove underscore + - [webapp-hashing] Remove underscore + - [browser-policy] Remove underscore + - [ecmascript] Remove underscore + - [browser-policy-framing] Remove underscore + - [diff-sequence] Remove underscore + - [facts-ui] Remove underscore + - [geojson-utils] Remove underscore + +#### Breaking Changes + +N/A + +#### Migration Steps + +_In case you want types in your app using the core packages types/zodern:types (now you do have the option)_ + +1. Remove `@types/meteor` package +2. Install [`zodern:types`](https://github.com/zodern/meteor-types) package +3. Follow [installation guide for the Meteor Apps](https://github.com/zodern/meteor-types#meteor-apps) to update + +#### Meteor Version Release + +* `accounts-base@2.2.5` + - added types for package. +* `browser-policy@1.1.1` + - adjusted package tests. +* `browser-policy-common@1.0.12` + - added types for package. +* `browser-policy-framing@1.1.1` + - removed underscore. +* `check@1.3.2` + - added types for package. +* `ddp@1.4.0` + - added types for package. +* `ddp-client@2.6.1` + - In the client, don't wait if the stub doesn't return a promise. +* `ddp-rate-limiter@1.1.1` + - added types for package. +* `diff-sequence@1.1.2` + - removed underscore. +* `ecmascript@0.16.3` + - removed underscore. +* `ejson@1.1.3` + - added types for package. +* `ejson@2.2.2` + - added types for package. +* `facebook-oauth@1.12.0` + - Updated default version of Facebook GraphAPI to v15 +* `facts-ui@1.0.1` + - removed underscore. +* `fetch@0.1.2` + - added types for package. +* `geojson-utils@1.0.11` + - removed underscore. +* `hot-module-replacement@0.5.2` + - added types for package. +* `meteor@1.10.2` + - added types for package. +* `modern-browsers@0.1.9` + - added types for package. +* `modules-runtime@0.13.2` + - added accurate error messages. +* `modules-runtime-hot@0.14.1` + - added accurate error messages. +* `mongo@1.16.1` + - added types for package. + - added true mongo binary +* `npm-mongo@4.11.0` + - updated npm mongo version to match npm one. +* `promise@0.13.0` + - added types for package. +* `random@1.2.1` + - added types for package. +* `reactive-dict@1.3.1` + - added types for package. +* `reactive-dict@1.0.12` + - added types for package. +* `server-render@0.4.1` + - added types for package. +* `service-configuration@1.3.1` + - added types for package. +* `session@1.2.1` + - added types for package. +* `test-in-browser@1.3.1` + - removed underscore. +* `tracker@1.2.1` +- added types for package. +* `twitter-oauth@1.3.1` + - removed underscore. +* `underscore@1.0.11` + - added types for package. +* `webapp@1.13.2` + - added types for package. +* `webapp-hashing@1.1.1` + - added types for package. +## v2.8, 2022-10-19 + +#### Highlights +* New MongoDB Package Async API. [PR](https://github.com/meteor/meteor/pull/12028) +* Node update to [v14.20.1](https://nodejs.org/en/blog/release/v14.20.1/) as part of the [September 22nd security release](https://nodejs.org/en/blog/vulnerability/september-2022-security-releases/) +* Update MongoDB driver to 4.9. [PR](https://github.com/meteor/meteor/pull/12097) +* Meteor.callAsync method. [PR](https://github.com/meteor/meteor/pull/12196) +* Added new Chakra-ui Skeleton. [PR](https://github.com/meteor/meteor/pull/12181) +* Added new Solid Skeleton. [PR](https://github.com/meteor/meteor/pull/12186) + +#### Breaking Changes +N/A + +#### Migration Steps +Read our [Migration Guide](https://guide.meteor.com/2.8-migration.html) for this version. + +#### Meteor Version Release +* `modules@0.19.0`: + - Updating reify version. [PR](https://github.com/meteor/meteor/pull/12055). +* `minimongo@1.9.0`: + - New methods to work with the Async API. [PR](https://github.com/meteor/meteor/pull/12028). + - Solved invalid dates in Minimongo Matcher [PR](https://github.com/meteor/meteor/pull/12165). +* `mongo@1.16.0`: + - Adding async counterparts that allows gradual migration from Fibers. [PR](https://github.com/meteor/meteor/pull/12028). + - Improved oplogV2V1Converter implementation. [PR](https://github.com/meteor/meteor/pull/12116). + - Exit on MongoDB connection error. [PR](https://github.com/meteor/meteor/pull/12115). + - Fixed MongoConnection._onFailover hook. [PR](https://github.com/meteor/meteor/pull/12125). + - Fixed handling objects in oplogV2V1Converter. [PR](https://github.com/meteor/meteor/pull/12107). +* `meteor@1.10.1`: + - Create method to check if Fibers is enabled by flag DISABLE_FIBERS. [PR](https://github.com/meteor/meteor/pull/12100). + - Fix bugs for linter build plugins. [PR](https://github.com/meteor/meteor/pull/12120). + - Document meteor show METEOR. [PR](https://github.com/meteor/meteor/pull/12124). + - Update Cordova Android to 10.1.2. [PR](https://github.com/meteor/meteor/pull/12131). + - Fixed flaky test. [PR](https://github.com/meteor/meteor/pull/12129). + - Refactoring/Remove unused imports from tools folder. [PR](https://github.com/meteor/meteor/pull/12084). + - Fix problem when publishing async methods. [PR](https://github.com/meteor/meteor/pull/12152). + - Update skeletons Apollo[PR](https://github.com/meteor/meteor/pull/12091) and other skeletons [PR](https://github.com/meteor/meteor/pull/12099) + - Added callAsync method for calling async methods [PR](https://github.com/meteor/meteor/pull/12196). +* `meteor-installer@2.7.5`: + - 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`: + - Fixing bug where tokens where never expiring. [PR](https://github.com/meteor/meteor/pull/12088). +* `accounts-base@2.2.4`: + - Adding new options to the `Accounts.config()` method: `loginTokenExpirationHours` and `tokenSequenceLength`. [PR](https://github.com/meteor/meteor/pull/12088). +* `Meteor Repo`: + - Included githubactions in the dependabot config. [PR](https://github.com/meteor/meteor/pull/12061). + - Visual rework in meteor readme. [PR](https://github.com/meteor/meteor/pull/12133). + - Remove useraccounts from Guide. [PR](https://github.com/meteor/meteor/pull/12090). +* `minifier-css@1.6.1`: + - Update postcss package to avoid issues with `Browserslist` and `caniuse-lite`. [PR](https://github.com/meteor/meteor/pull/12136). +* `minifier-js@2.7.5`: + - Update terser package due to security fixes and to take advantage of terser improvements. [PR](https://github.com/meteor/meteor/pull/12137). +* `standard-minifier-css@1.8.2`: + - Update dependencies to avoid issues with `Browserslist` and `caniuse-lite`. [PR](https://github.com/meteor/meteor/pull/12141). +* `standard-minifier-js@2.8.1`: + - Update dependencies to avoid issues with `Browserslist` and `caniuse-lite`. [PR](https://github.com/meteor/meteor/pull/12142). +* `ddp-server@2.5.1`: + - Rename setPublicationStrategy and getPublicationStrategy arguments. [PR](https://github.com/meteor/meteor/pull/12166). + +#### Special thanks to +- [@fredmaiaarantes](https://github.com/fredmaiaarantes) +- [@radekmie](https://github.com/radekmie) +- [@naveensrinivasan](https://github.com/naveensrinivasan) +- [@zodern](https://github.com/zodern) +- [@brucejo75](https://github.com/brucejo75) +- [@matheusccastroo](https://github.com/matheusccastroo) +- [@victoriaquasar](https://github.com/victoriaquasar) +- [@StorytellerCZ](https://github.com/StorytellerCZ) +- [@Grubba27](https://github.com/Grubba27) +- [@denihs](https://github.com/denihs) +- [@edimarlnx](https://github.com/edimarlnx) + +For making this great framework even better! + +## v2.7.3, 2022-05-3 + +#### Highlights +* `accounts-passwordless@2.1.2`: + - Throwing an error when the login tokens are not generated well calling requestLoginTokenForUser. [PR](https://github.com/meteor/meteor/pull/12047/files). +* Node updated to v14.19.3 +* npm update to v6.14.17 +* Fix recompiling npm packages for web arch. [PR](https://github.com/meteor/meteor/pull/12023). + +#### Breaking Changes +N/A + +#### Migration Steps + +#### Meteor Version Release +* `accounts-passwordless@2.1.2`: + - Throwing an error when the login tokens are not generated well calling requestLoginTokenForUser. [PR](https://github.com/meteor/meteor/pull/12047/files). +* `babel-runtime@1.5.1`: + - Make client 25kb smaller. [PR](https://github.com/meteor/meteor/pull/12051). +* Node updated to v14.19.3 +* npm update to v6.14.17 +* Fix win style paths being added to watch sets. +* Fix recompiling npm packages for web arch. [PR](https://github.com/meteor/meteor/pull/12023). + +## v2.7.2, 2022-05-10 + +#### Highlights + +#### Breaking Changes +N/A +#### Migration Steps + +#### Meteor Version Release + +* `mongo@1.15.0` + - New option `Meteor.settings.packages.mongo.reCreateIndexOnOptionMismatch` for case when an index with the same name, but different options exists it will be re-created. + - If there is an error on index creation Meteor will output a better message naming the collection and index where the error occured. [PR](https://github.com/meteor/meteor/pull/11995). +* `modern-browsers@0.1.8` + - New api `getMinimumBrowserVersions` to access the `minimumBrowserVersions`. [PR](https://github.com/meteor/meteor/pull/11998). +* `socket-stream-client@0.5.0` + - Ability to disable sockjs on client side. [PR](https://github.com/meteor/meteor/pull/12007/). +* `meteor-node-stubs@1.2.3`: + - Fix using meteor-node-stubs in IE. [PR](https://github.com/meteor/meteor/pull/12014). +* New ARCH environment variable that permit users to set uname info. [PR](https://github.com/meteor/meteor/pull/12020). +* Skeleton dependencies updated. +* New Tailwind skeleton. [PR](https://github.com/meteor/meteor/pull/12000). + +#### Independent Releases + +## v2.7.1, 2022-03-31 + +#### Highlights + +#### Breaking Changes + +* `accounts-2fa@2.0.0` + - The method `has2faEnabled` no longer takes a selector as an argument, just the callback. + - `generate2faActivationQrCode` now throws an error if it's being called when the user already has 2FA enabled. + +#### Migration Steps + +#### Meteor Version Release + +* `accounts-2fa@2.0.0` + - Reduce one DB call on 2FA login. [PR](https://github.com/meteor/meteor/pull/11985) + - Throw error when user is not found on `Accounts._is2faEnabledForUser` + - Remove vulnerability from the method `has2faEnabled` + - Now the package auto-publish the field `services.twoFactorAuthentication.type` for logged in users. +* `accounts-password@2.3.1` + - Use method `Accounts._check2faEnabled` when validating 2FA +* `accounts-passwordless@2.1.1` + - Use method `Accounts._check2faEnabled` when validating 2FA +* `oauth@2.1.2` + - Check effectively if popup was blocked by browser. [PR](https://github.com/meteor/meteor/pull/11984) +* `standard-minifier-css@1.8.1` + - PostCSS bug fixes. [PR](https://github.com/meteor/meteor/pull/11987/files) + +#### Independent Releases + +## v2.7, 2022-03-24 + +#### Highlights +* Bump node version to 14.19.1 +* TailwindCSS 3.x support +* Typescript `4.5.4` upgrade +* New core package: `accounts-2fa` +* Support for 2FA in `accounts-password` and `accounts-passwordless` +* PostCSS's plugins are run by `standard-minifier-css` if the app has PostCSS configured +* App skeletons and test packages were updated to `meteor-node-stubs@1.2.1` + +#### Breaking Changes + +N/A + +#### Migration Steps + +Read our [Migration Guide](https://guide.meteor.com/2.7-migration.html) for this version. + +#### Meteor Version Release + +* `standard-minifier-css@1.8.0` + - Runs PostCSS plugins if the app has a PostCSS config and the `postcss-load-config` npm package installed. Supports TailwindCSS 3.x [PR 1](https://github.com/Meteor-Community-Packages/meteor-postcss/pull/56) [PR 2](https://github.com/meteor/meteor/pull/11903) + +* `react-fast-refresh@0.2.3` + - Fix tracking states with circular dependencies. [PR](https://github.com/meteor/meteor/pull/11923) + +* `accounts-2fa@1.0.0` + - New package to provide 2FA support + +* `accounts-password@2.3.0` + - 2FA support + +* `accounts-passwordless@2.1.0` + - 2FA support + +* `@meteorjs/babel@7.16.0` + - Upgrade TypeScript to `4.5.4` + +* `babel-compiler@7.9.0` + - Upgrade TypeScript to `4.5.4` + +* `ecmascript@0.16.2` + - Upgrade TypeScript to `4.5.4` + +* `typescript@4.5.4` + - Upgrade TypeScript to `4.5.4` [PR](https://github.com/meteor/meteor/pull/11846) + +* `accounts-ui-unstyled@1.6.0` + - `Accounts.ui.config` can now be set via `Meteor.settings.public.packages.accounts-ui-unstyled`. + +* `meteor-tool@2.7` + - CSS minifiers must now handle any caching themselves [PR](https://github.com/meteor/meteor/pull/11882) + - CSS minifiers are always given lazy css resources instead of only during production builds [PR](https://github.com/meteor/meteor/pull/11897) + - Files passed to CSS minifiers now have `file.readAndWatchFileWithHash`, same as for compilers [PR](https://github.com/meteor/meteor/pull/11882) + - If a minifier has a `beforeMinify` function, it will be called once during each build before the minifier is run the first time [PR](https://github.com/meteor/meteor/pull/11882) + - Add `Plugin.fs.readdirWithTypesSync` [PR](https://github.com/meteor/meteor/pull/11882) + +* `ejson@1.1.2` + - Fixing error were EJSON.equals fail to compare object and array if first param is object and second is array. [PR](https://github.com/meteor/meteor/pull/11866), [Issue](https://github.com/meteor/meteor/issues/11864). + +* `oauth@1.4.1` + - If OAuth._retrieveCredentialSecret() fails trying to get credentials inside Accounts.oauth.tryLoginAfterPopupClosed(), we call it again once more. + +* `accounts-base@2.2.2` + - Fix an issue where an extra field defined in `defaultFieldSelector` would not get published to the client + - Proving the login results to the `_onLoginHook` when finishing login inside `callLoginMethod`. [PR](https://github.com/meteor/meteor/pull/11913). + +* `github-oauth@1.4.0` + - More data will be retrieved and saved under `services.github` on the user account. + - Add option to disallow sign-up on GitHub using `allow_signup` [parameter](https://docs.github.com/en/developers/apps/building-oauth-apps/authorizing-oauth-apps#parameters), this will be activated based on your Accounts settings, specifically if the option `forbidClientAccountCreation` is set to `true`. + +* `email@2.2.1` + - Throwing error when trying to send email in a production environment but without a mail URL set. [PR](https://github.com/meteor/meteor/pull/11891), [Issue](https://github.com/meteor/meteor/issues/11709). + +* `facebook-oauth@1.11.0` + - Updated Facebook API to version 12.0 + +* `google-oauth@1.4.2` + - Migrate from `http` to `fetch` + +* `modules-runtime@0.13.0` + - Fix some npm modules being imported as an empty object. [PR](https://github.com/meteor/meteor/pull/11954), [Issue 1](https://github.com/meteor/meteor/issues/11900), [Issue 2](https://github.com/meteor/meteor/issues/11853). + +* `meteor-node-stubs@1.2.1` + - Adds support for [node:](https://nodejs.org/api/esm.html#node-imports) imports. + +* `minifier-jss@2.8.0` + - Updating terser. It will fix this [issue](https://github.com/meteor/meteor/issues/11721) and [this](https://github.com/meteor/meteor/issues/11930) one. [PR](https://github.com/meteor/meteor/pull/11983). + +#### Independent Releases + +## v2.6.1, 2022-02-18 + +#### Highlights + +* Fix regression on build speed by updating babel dependencies to 7.17.x +* We have removed IE 9 from our browser test list +* We are changing the device used for testing, Samsung Galaxy S7, as browserstack is having issues provisioning it. We will be using now Samsung Galaxy Note 10. +* Fix issue when generating tarballs from Windows systems related to execute permissions +* Fix issues with HMR and meteor build --debug [PR](https://github.com/meteor/meteor/pull/11922) + + +#### Breaking Changes + +- IE 9 might not be compatible from now on, although, we will still consider PR's fixing it. + +#### Migration Steps + +#### Meteor Version Release + +* `meteor-tool@2.6.1` + - Use latest @meteor/babel dependency with @babel@7.17.x + +* `@meteorjs/babel@7.15.1` + - Use babel@7.17.x + +* `babel-compiler@7.8.1` + - Use latest @meteor/babel dependency with @babel@7.17.x + +* `hot-module-replacement@0.5.1` + - Fix issues with HMR and meteor build --debug [PR](https://github.com/meteor/meteor/pull/11922) + +* `webapp@1.13.1` + - Fix issues with HMR and meteor build --debug [PR](https://github.com/meteor/meteor/pull/11922) + +#### Independent Releases + +* `mongo@1.14.6` at 2022-02-18 + - Remove false-positive warning for supported operation a.0.b:{} +* `mongo@1.14.5` at 2022-02-16 + - Fix multiple array operators bug and add support for debug messages + - Fix isArrayOperator function regexp false-positive +* `mongo@1.14.4` at 2022-02-11 + - Fix sync return for insert methods inside _collection private method [PR](https://github.com/meteor/meteor/pull/11907) + - Support the new "projection" field inside the decision of using oplog for a published cursor or not [PR](https://github.com/meteor/meteor/pull/11908) +* `mongo@1.14.3` at 2022-02-08 + - Remove throw on _id exclusion inside mongo collection finds. [PR](https://github.com/meteor/meteor/pull/11894). +* `mongo@1.14.2` at 2022-02-06 + - Fix flatten object issue when internal object value is an array on oplog converter. [PR](https://github.com/meteor/meteor/pull/11888). +* `mongo@1.14.1` at 2022-02-04 + - Fix flatten object issue when the object is empty on oplog converter. [PR](https://github.com/meteor/meteor/pull/11885), [Issue](https://github.com/meteor/meteor/issues/11884). + +## v2.6, 2022-02-01 + +#### Highlights + +* MongoDB Node.js driver Upgrade from 3.6.10 to 4.3.1 +* MongoDB Server 5.x Support +* Embedded Mongo now uses MongoDB 5.0.5 +* You are now able to use dark theme specific splash screens for both iOS and Android by passing an object `{src: 'light-image-src-here.png', srcDarkMode: 'dark-mode-src-here.png'}` to the corresponding key in `App.launchScreens` + +#### Breaking Changes + +* `mongo@1.14.0` + - This is not a breaking change in Meteor itself but as this is a major upgrade in the MongoDB Node.js driver you should read the [Migration Guide](https://guide.meteor.com/2.6-migration.html), especially if you are using rawCollection. + +* `meteor-tool@2.6` + - Legacy launch screens keys for iOS on `App.launchScreens` are now deprecated in favor of new storyboard compliant keys [PR #11797](https://github.com/meteor/meteor/pull/11797). This will drop the following keys we have: `['iphone5','iphone6','iphone6p_portrait','iphone6p_landscape','iphoneX_portrait','iphoneX_landscape','ipad_portrait_2x','ipad_landscape_2x','iphone','iphone_2x','ipad_portrait','ipad_landscape']`. Read the [Migration Guide](https://guide.meteor.com/2.6-migration.html) for more details. + +#### Migration Steps + +Read our [Migration Guide](https://guide.meteor.com/2.6-migration.html) for this version. + +#### Meteor Version Release + +* `mongo@1.14.0` + - `applySkipLimit` option for count() on find cursors is no longer supported. Read more about it [here](https://guide.meteor.com/2.6-migration.html), in the `Cursor.count()` section. + - internal result of operations inside Node.js MongoDB driver have changed. If you are depending on rawCollection results (not only the effect inside the DB), please review the expected format as we have done [here](https://github.com/meteor/meteor/blob/155ae639ee590bae66237fc1c29295072ec92aef/packages/mongo/mongo_driver.js#L658) + - useUnifiedTopology is not an option anymore, it defaults to true. + - native parser is not an option anymore, it defaults to false in the mongo connection. + - poolSize not an option anymore, we are using max/minPoolSize for the same behavior on mongo connection. + - fields option is deprecated, we are maintaining a translation layer to "projection" field (now prefered) until the next minor version, where we will start showing alerts. + - _ensureIndex is now showing a deprecation message + - we are maintaining a translation layer for the new oplog format, so if you read or rely on any behavior of it please read our oplog_v2_converter.js code + - update/insert/remove behavior is maintained in the Meteor way, documented in our docs, but we are now using replaceOne/updateOne/updateMany internally. This is subject to changes in the API rewrite of MongoDB without Fibers AND if you are using rawCollection directly you have to review your methods otherwise you will see deprecation messages if you are still using the old mongodb style directly. + - waitForStepDownOnNonCommandShutdown=false is not needed anymore when spawning the mongodb process + - _synchronousCursor._dbCursor.operation is not an option anymore in the raw cursor from nodejs mongodb driver. If you want to access the options, use _synchronousCursor._dbCursor.(GETTERS) - for example, _synchronousCursor._dbCursor.readPreference. + - the default write preference for replica sets on mongo v5 is w:majority + - If you are using MongoDB inside a Docker container in your dev environment, you might need to append directConnection=true in your mongouri to avoid the new mongo driver Service Discovery feature + +* `allow-deny@1.1.1` + - Handle `MongoBulkWriteError` as `BulkWriteError` was already handled. + +* `meteor-tool@2.6.0` + - Cordova changes to support new Launch Screens. + - Mongo changes to support new embedded version, 5.0.5. + - Fix resolving npm deps of local packages when on different drive. [PR](https://github.com/meteor/meteor/pull/11868) + +* `minimongo@1.8.0` + - Changes to keep everything compatible with MongoDB Server 5.x and MongoDB Node.js driver 4.x. + +* `npm-mongo@4.3.1` + - Upgraded MongoDB Node.js driver to 4.3.1 + +* `tinytest@1.2.1` + - Custom message support for `throws` + +#### Independent Releases + +## v2.5.8, 2022-05-31 + +#### Highlights + +* Fixed 2.5.7 MongoDB error +* Patch release to update Node to version 14.19.3 and npm version to 6.14.17. + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +## v2.5.7, 2022-05-31 + +#### Highlights + +* Patch release to update Node and npm versions. + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.7` + - Patch release to update Node and npm versions. + +## v2.5.6, 2022-01-25 + +#### Highlights + +* Go back to using node-fibers mainline dependency instead of a fork. Also ships fibers binaries. + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.6` + - Go back to using node-fibers mainline dependency instead of a fork. Also ships fibers binaries. + +## v2.5.5, 2022-01-18 + +#### Highlights + +* Bump node version to 14.18.3 - security patch +* Change the tar implementation for streams, used on deploying and unpacking packages. Reduced "upload bundle" time when deploying is expected. + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.5` + - Bump node version to 14.18.3 - security patch + - Change the tar implementation for streams, used on deploying and unpacking packages. Reduced "upload bundle" time when deploying is expected. + +* `accounts-base@2.2.1` + - Fixes onLogin firing twice. [PR](https://github.com/meteor/meteor/pull/11785) and [Issue](https://github.com/meteor/meteor/issues/10853) + +#### Independent Releases + +* `oauth@2.1.1` + - Fixes end of redirect response for oauth inside iframes. [PR](https://github.com/meteor/meteor/pull/11825) and [Issue](https://github.com/meteor/meteor/issues/11817) + +## v2.5.4, 2022-01-14 + +This version should be ignored. Proceed to 2.5.5 above. + +## v2.5.3, 2022-01-04 + +#### Highlights + +* Fixes invalid package.json error with `resolve` + +#### Breaking Changes + +- N/A + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.3` + - Fixes invalid package.json files breaking Meteor run. [PR](https://github.com/meteor/meteor/pull/11832) and [Issue](https://github.com/meteor/meteor/issues/11830) + +#### Independent Releases + +## v2.5.2, 2021-12-21 + +#### Highlights + +* Reify performance improvements +* Node.js update to 14.18.2 +* HMR Fixes + +#### Breaking Changes + +* If a module calls `module.hot.decline()`, calling `module.hot.accept()` later now does nothing instead of overriding `module.hot.decline()`. + +#### Migration Steps + +- N/A + +#### Meteor Version Release + +* `meteor-tool@2.5.2` + - Changes @meteorjs/babel and @meteorjs/reify to improve Reify performance. + - Upgrades Node.js to 14.18.2 + - Fixes isopacket [load failure](https://github.com/meteor/meteor/issues/10930) on Windows. [PR](https://github.com/meteor/meteor/pull/11740) + +* `hot-module-replacement@0.5.0` + - Prevents hot.accept from overriding hot.decline. [PR](https://github.com/meteor/meteor/pull/11801) + - Fixes falling back to hot code push on web archs. [PR](https://github.com/meteor/meteor/pull/11795) + +* `@meteorjs/babel@7.15.0` + - Updates @meteorjs/reify to improve Reify performance. + +* `@meteorjs/reify@0.23.0` + - Uses `@meteorjs/reify` instead of `reify` + - Check scope when wrapping to fix slowness in MUI v5. [PR](https://github.com/meteor/reify/pull/1) and [Issue](https://github.com/benjamn/reify/issues/277). + +* `standard-minifier-js@2.8.0` + - Bump to apply improvements from Reify + +* `typescript@4.4.1` + - Bump to apply improvements from Reify + +* `babel-compiler@7.8.0` + - Bump to apply improvements from Reify + +* `ecmascript@0.16.1` + - Bump to apply improvements from Reify + +* `modules@0.18.0` + - Bump to apply improvements from Reify + +#### Independent Releases + +* `react-fast-refresh@0.2.2` + - [Fixes](https://github.com/meteor/meteor/issues/11744) bugs. [PR](https://github.com/meteor/meteor/pull/11794/) + +* `accounts-ui@1.4.2` + - Update usage of `accounts-passwordless` to be compatible with 2.0.0. + +* `minifier-js@2.7.3` + - Revert `evaluate` option that was set to false in 2.7.2. + +* `standard-minifier-js@2.7.3` + - Using `minifier-js@2.7.3` + + +* `npm-mongo@4.2.1` + - Update MongoDB driver version to 4.2.1 + +## v2.5.1, 2021-11-17 + +#### Highlights +- Mac M1 Support - darwin arm64. [Read more](https://blog.meteor.com/). + +#### Breaking Changes +- `Meteor.loginWithToken` from the new package `accounts-passwordless` was conflicting with another method with the same name on `accounts-base` so we had to rename the method of `accounts-passwordless` package to `Meteor.passwordlessLoginWithToken`. + +#### Meteor Version Release + +* `meteor-tool@2.5.1` + - Meteor supports now Mac M1 chips (darwin arm64) + +* `accounts-passwordless@2.0.0` + - `Meteor.loginWithToken` from the new package `accounts-passwordless` was conflicting with another method with the same name on `accounts-base` so we had to rename the method of `accounts-passwordless` package to `Meteor.passwordlessLoginWithToken`. + +#### Independent Releases +* `minifier-js@2.7.2` + - Stopped using `evaluate` option in the compression to fix a [bug](https://github.com/meteor/meteor/issues/11756). + - Updated `terser` to [v5.9.0](https://github.com/terser/terser/blob/master/CHANGELOG.md#v590) to fix various bugs + +* `standard-minifier-js@2.7.2` + - Using `minifier-js@2.7.2` + +* `github-oauth@1.3.2` + - Migrate from `http` to `fetch` + - Fix GitHub login params to adhere to changes in GitHub API + +## v2.5, 2021-10-21 + +#### Highlights + +* New package: `accounts-passwordless` +* Cordova Android v10 +* HMR now works on all architectures and legacy browsers +* `Accounts.config()` and third-party login services can now be configured from Meteor settings + +#### Breaking Changes + +* Cordova Android v10 now enables AndroidX. If you use any cordova-plugin that depends or uses any old support library, you need to include the cordova-plugin-androidx-adapter cordova-plugin, otherwise you will get build errors. + +#### Meteor Version Release + +* CircleCI testing image was updated to include Android 30 and Node 14 + +* `meteor-tool@2.5` + - Cordova Android upgraded to v10 + - HMR improvements related to `hot-module-replacement@0.4.0` + - Fix finding local packages on Windows located on drives other than C + - Fix infinite loop in import scanner when file is on a different drive than source root + - Fix Meteor sometimes not detecting changes to a file after the first time it is modified + - Fixes Meteor sometimes hanging on Windows. Reverts the temporary fix in Meteor 2.4 of disabling native file watchers for some commands + - Uses recursive file watchers on Windows and macOS. In most situations removes the up to 5 seconds delay before detecting the first change to a file, and is more efficient. + - Node updated to [v14.18.1](https://nodejs.org/en/blog/release/v14.18.1/), following [October 12th 2021 security release](https://nodejs.org/en/blog/vulnerability/oct-2021-security-releases/) + - Skeletons had their dependencies updated + +* `accounts-passwordless@1.0.0` + - New accounts package to provide passwordless authentication. + +* `accounts-password@2.2.0` + - Changes to reuse code between passwordless and password packages. + +* `accounts-base@2.2.0` + - You can now apply all the settings for `Accounts.config` in `Meteor.settings.packages.accounts-base`. They will be applied automatically at the start of your app. Given the limitations of `json` format you can only apply configuration that can be applied via types supported by `json` (ie. booleans, strings, numbers, arrays). If you need a function in any of the config options the current approach will still work. The options should have the same name as in `Accounts.config`, [check them out in docs.](https://docs.meteor.com/api/accounts-multi.html#AccountsCommon-config). + - Changes to reuse code between passwordless and password packages. + +* `accounts-ui-unstyled@1.6.0` + - Add support for `accounts-passwordless`. + +* `service-configuration@1.3.0` + - You can now define services configuration via `Meteor.settings.packages.service-configuration` by adding keys as service names and their objects being the service settings. You will need to refer to the specific service for the settings that are expected, most commonly those will be `secret` and `appId`. + +* `autoupdate@1.8.0` + - Enable HMR for all web arch's + +* `ecmascript@0.16.0` + - Enable HMR for all web arch's + +* `hot-module-replacement@0.4.0` + - Provides polyfills needed by Meteor.absoluteUrl in legacy browsers + - Improvements for HMR to work in all architectures and legacy browsers + +* `module-runtime@0.14.0` + - Improvements for legacy browsers + +* `react-fast-refrest@0.2.0` + - Enable HMR for all web arch's + +* `typescript@4.4.0` + - Enable HMR for all web arch's + +* `webapp@1.13.0` + - Update `cordova-plugin-meteor-webapp` to v2 + - Removed dependency on `cordova-plugin-whitelist` as it is now included in core + - Cordova Meteor plugin is now using AndroidX + - Added new settings option `Meteor.settings.packages.webapp.alwaysReturnContent` that will always return content on requests like `POST`, essentially enabling behavior prior to Meteor 2.3.1. + +#### Independent Releases + +* `modern-browsers@0.1.6` + - Added `mobileSafariUI` as an alias for Mobile Safari + +* `minifier-js@2.7.1` + - Updated `terser` to [v5.8.0](https://github.com/terser/terser/blob/master/CHANGELOG.md#v580) to fix various bugs + +* `standard-minifier-js@2.7.1` + - Updated `@babel/runtime` to [v7.15.4](https://github.com/babel/babel/releases/tag/v7.15.4) + +* `accounts-ui@1.4.1` + - Update compatibility range with `less` from 3.0.2 to 4.0.0 + +* `accounts-ui-unstyled@1.5.1` + - Update compatibility range with `less` from 3.0.2 to 4.0.0 + +* `google-config-ui@1.0.3` + - Deliver siteUrl in the same way as other config-ui packages + +* `ecmascript-runtime-client@0.12.1` + - Revert `core-js` to v3.15.2 due to issues in legacy build with arrays, [see issue for more details](https://github.com/meteor/meteor/issues/11662) + +* `modern-browsers@0.1.7` + - Added `firefoxMobile` as an alias for `firefox` + +* `dynamic-import@0.7.2` + - Fixes 404 in dynamic-import/fetch when ROOT_URL is set with a custom path. [see issue](https://github.com/meteor/meteor/issues/11701) + +## v2.4.1, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.4.1` + - Patch to make 2.4.1 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.4, 2021-09-15 + +#### Highlights + +* Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) +* Email package now allows setting `Email.customTransport` to override sending method. +* Use `createIndex` instead of `_ensureIndex` to align with new MongoDB naming. +* Apollo skeleton has been upgraded for [Apollo server v3](https://github.com/apollographql/apollo-server/blob/main/CHANGELOG_historical.md#v300) +* `reify` has been updated to v0.22.2 which reduces the overhead of `import` statements and some uses of `export ... from`, especially when a module is imported a large number of times or re-exports a large number of exports from other modules. PRs [1](https://github.com/benjamn/reify/pull/246), [2](https://github.com/benjamn/reify/pull/291) +* Meteor NPM installer is [now available for all platforms](https://github.com/meteor/meteor/pull/11590). +* DDP server now allows you to set publication strategies for your publications to control mergebox behavior +* On Windows Meteor should no longer be hanging on commands + +#### Migration steps + +1. Replace all usage of `collection._ensureIndex` with `collection.createIndex`. You only need to rename the method as the functionality is the same. +2. If you are using a [well known service](https://nodemailer.com/smtp/well-known/) for the email package switch to using `Meteor.settings.packages.email` settings instead of `MAIL_URL` env variable. Alternatively you can utilize the new `Email.customTransport` function to override the default package behavior and use your own. [Read the email docs](https://docs.meteor.com/api/email.html) for implementation details. + +#### Meteor Version Release + +* Skeletons dependencies updated + +* `meteor-tool@2.4` + - `meteor show` now reports if a package is deprecated + - `reify` update to v0.22.2 which bring optimizations for imports. PRs [1](https://github.com/benjamn/reify/pull/246), [2](https://github.com/benjamn/reify/pull/291) + - Apollo skeleton now uses [Apollo server v3](https://github.com/apollographql/apollo-server/blob/main/CHANGELOG.md#v300) - [migration guide](https://www.apollographql.com/docs/apollo-server/migration/) + - Upgraded `chalk` to v4.1.1 + - Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + - `METEOR_SETTINGS` is now accepted an all modes + - Native file watchers are now disabled on Windows for many file-intensive actions (like, `create`, `update`, `build` etc.), this solves an issue with hanging Meteor commands on Windows + +* `webapp@1.12` + - npm dependencies have been updated + - Added hook to change runtime config delivered to the client app, [read more](https://github.com/meteor/meteor/pull/11506) + - Added hook to get notified when the app is updated, [read more](https://github.com/meteor/meteor/pull/11607) + - `@vlasky/whomst@0.1.7` + - Added `addUpdateNotifyHook` that gets called when runtime configuration is updated + +* `logging@1.3.0` + - Switch from `cli-color` to `chalk` to have the same dependency as meteor-tool + - Fix detecting eval + - Copy over code from `Meteor._debug` to `Log.debug` which will be deprecated in the future + +* `email@2.2` + - Modernized package code + - Add alternative API function that you can hook into to utilize your own sending method: `Email.customTransport`. [Read the docs](https://docs.meteor.com/api/email.html#Email-customTransport) + - Use `Meteor.settings` for easy setup to sending email via [known providers](https://nodemailer.com/smtp/well-known/). [Read the docs](https://docs.meteor.com/api/email.html) + +* `ddp-server@2.5.0` + - One of three different publication strategies can be selected for any Meteor publication - SERVER_MERGE, NO_MERGE and NO_MERGE_NO_HISTORY. These control the behaviour of the Meteor mergebox, providing a compromise between client-server bandwidth usage and server side memory usage. [See PR](https://github.com/meteor/meteor/pull/11368) or [the documentation](https://docs.meteor.com/api/pubsub.html#Publication-strategies) for more details. + +* `mongo@1.13.0` + - Add `createIndex` as a collection function (in MongoDB since MongoDB v3). This is a new name for `_ensureIndex` which MongoDB has deprecated and removed in MongoDB 5.0. Use of `_ensureIndex` will show a deprecation warning on development. + +* `accounts-base@2.1.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `accounts-oauth@1.4.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `accounts-password@2.1.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `oauth@2.1.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `oauth1@1.5.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `facebook-oauth@1.10.0` + - Added login handler hook, like in the Google package for easier management in React Native and similar apps. [PR](https://github.com/meteor/meteor/pull/11603) + +* `service-configuration@1.5.0` + - Migrated usage of `_ensureIndex` to `createIndex` + +* `ecmascript-runtime-client@0.12.0` + - `core-js@3.16.0` + +* `ecmascript-runtime-server@0.11.0` + - `core-js@3.16.0` + +* `ecmascript-runtime@0.8.0` + - Version bump to ensure changes from server & client runtime get propagated. + +* `tinytest@1.2.0` + - Add option to temporarily replace `Tinytest.add` or `Tinytest.addAsync` by `Tinytest.only` or `Tinytest.onlyAsync` so only the tests added using `only*` are going to be executed. + +* `test-helpers@1.3.0` + - Support for `Tinytest.only` and `Tinytest.onlyAsync` + +* `modules@0.17.0` + - Update `reify` to `0.22.2` + +* `standard-minifier-js@2.7.0` + - `@babel/runtime@7.15.3` + - Code modernization + - Improved error handling + +* `minifier-js@2.7.0` + - Added tests + - Code modernization + +* `standard-minifier-css@1.7.4` + - `@babel/runtime@7.15.3` + +* `minifier-css@1.6.0` + - Updated dependencies + - `postcss@8.3.5` + - `cssnano@4.1.11` + +* `callback-hook@1.4.0` + - Added `forEach` iterator to be more in-line with the ES use for iterations. `each` is now deprecated, but will remain supported. + +## v2.3.7, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.3.7` + - Patch to make 2.3.7 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.3.6, 2021-09-02 + +#### Highlights + +* Updated Node.js per [August 31st security release](https://nodejs.org/en/blog/vulnerability/aug-2021-security-releases2/) + +#### Meteor Version Release + +* `meteor-tool@2.3.6` + - Node.js updated to [v14.17.6](https://nodejs.org/en/blog/release/v14.17.6/) + +#### Independent Releases + +* `minifier-js@2.6.1` + - Terser updated to [4.8.0](https://github.com/terser/terser/blob/master/CHANGELOG.md#v480) + +* `routepolicy@1.1.1` + - Removed `underscore` dependency since it was not used in the package + +* `email@2.1.1` + - Updated `nodemailer` to v6.6.3 + +* `callback-hook@1.3.1` + - Modernized the code + - Fixed a variable assignment bug in `dontBindEnvironment` function + +* `less@4.0.0` + - Updated `less` to v4.1.1 + - Fixed tests + +* `npm-mongo@3.9.1` + - `mongodb@3.6.10` + +* `accounts-base@2.0.1` + - Create index on `services.password.enroll.when` + - Blaze weak dependency updated to v2.5.0 + +* `facebook-oauth@1.9.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `github-oauth@1.3.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `google-oauth@1.3.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `meetup-oauth@1.1.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `meteor-developer-oauth@1.3.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `weibo-oauth@1.3.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + +* `oauth1@1.4.1` + - Allow usage of `http` package both v1 and v2 for backward compatibility + - Blaze weak dependency updated to v2.5.0 + +* `ddp-server@2.4.1` + - Fix a bug where `testMessageOnConnect` has always been sent + +* `accounts-password@2.0.1` + - Fix use of `isEnroll` in reset password + +* `mdg:geolocation@1.3.1` + - Fixed API to work with Meteor 2.3+ + +* `mdg:reload-on-resume@1.0.5` + - Fixed API to work with Meteor 2.3+ + +## v2.3.5, 2021-08-12 + +#### Highlights + +* Updated Node.js per the [August security release](https://nodejs.org/en/blog/vulnerability/aug-2021-security-releases/) +* Includes same improvements as in Meteor v2.2.3 + - Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + - `@meteorjs/babel@7.12.0` + +#### Meteor Version Release + +* `meteor-tool@2.3.5` + - Node.js updated to [v14.17.5](https://nodejs.org/en/blog/release/v14.17.5/) + - Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + - `@meteorjs/babel@7.12.0` + - Fix broken source maps in VSCode - [PR](https://github.com/meteor/meteor/pull/11584) + +## v2.3.4, 2021-08-03 + +* Fix an issue in `bare` and `vue` skeletons + +## v2.3.3, 2021-08-02 + +* Security patch of Node.js to [14.17.4](https://nodejs.org/en/blog/release/v14.17.4/) +* App skeletons had the following dependencies updated: + - `meteor-node-stubs@1.1.0` + - `@babel/runtime@7.14.8` +* `babel/parser@7.14.9` for server dev bundle + +## v2.3.2, 2021-07-13 + +#### Meteor Version Release + +* `meteor-tool@2.3.2` + - fixes a bug that makes `meteor run android` run with the new aab package flag + +## v2.3.1, 2021-07-08 + +#### Highlights + +* Fix windows issue when running webapp package. +* Node.js updated to 14.17.3, following [security release](https://nodejs.org/en/blog/vulnerability/july-2021-security-releases/) + +#### Breaking Changes + +* Meteor will now generate ".aab" (bundle files) by default when building for Android. This is the [new default format](https://android-developers.googleblog.com/2021/06/the-future-of-android-app-bundles-is.html) for Android apps. Use the new build flag `--packageType=apk` if you still need to generate APK. + +#### Meteor Version Release + +* Updated travis CI environment to use Node.js 14.17.3 + +* `meteor-tool@2.3.1` + - Node.js updated to [14.17.2](https://nodejs.org/en/blog/release/v14.17.2/) and [14.17.3](https://nodejs.org/en/blog/release/v14.17.3/) + - `@babel/runtime` dependency updated to v7.14.6 across the tool and testing apps + - Skeletons dependencies updated + - Apollo skeleton removed `apollo-boost` dependency which is no longer needed + - New build flag `--packageType` to choose between apk/bundle for android builds (defaults to bundle). + +#### Independent Releases + +* `webapp@1.11.1` + - Remove `posix` from npm shrinkwrap, to fix a bug it causes on Windows. + +* `less@3.0.2` + - Updated `@babel/runtime` to v7.14.6 + - Updated `less` to v3.11.3 + +* `standard-minifiers-css@1.7.3` + - Updated `@babel/runtime` to v7.14.6 + +* `standard-minifiers-js@2.6.1` + - Updated `@babel/runtime` to v7.14.6 + +* `dynamic-import@0.7.1` + - Fix [Safari 14 bug](https://bugs.webkit.org/show_bug.cgi?id=226547) with indexedDB + +## v2.3, 2021-06-24 + +#### Highlights + +* Node.js update to 14.17.1 from 12.22.1 πŸŽ‰ + +* Typescript update to [4.3.2](https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/) + +* Packages had their backward compatibility to before Meteor 1.0 removed. See below for more details. + +* Improved tracking of which files are used by build plugins to know when it should do a full rebuild, a faster client-only rebuild, or can completely skip rebuilding after a file is modified. This should work with any type of file in any directory, and for both files in the app and files in packages. The most noticeable improvement is when modifying a file only used on the client Meteor will only rebuild the client, even if the file is not inside `imports` or a `client` folder. + +### Summary of breaking changes + +- As Node.js version was upgraded to a new major version we recommend that you review if your npm dependencies are compatible with Node.js 14. + - If we receive reports from breaking changes we are going to list them here but so far we are not aware of any. + - We recommend that you read Node.js [release notes](https://nodejs.org/en/blog/release/v14.0.0/) though. + +- Accounts have undergone some major changes including major version bump. See below for more details. + +- All official packages that have been deprecated have now the deprecated flag and will inform you about that if you install or update them. + +- If you are working with enrollments in user accounts, do note that the enrollment token handling is now separate from reset password token. The token is now under `services.password.enroll`, so adjust your code accordingly if you use it. + +### Migration steps + +- As Node.js version was upgraded we recommend that you remove your `node_modules` folder (`rm -rf node_modules`) and run `meteor npm i` to be sure you compile all the binary dependencies again using the new Node.js version. + - Maybe you also want to recreate your lock file. + - If you get an error try `meteor reset` which will clear caches, beware that this will also remove your local DB for your app. + +- If you are maintaining a package that depends on one of the accounts packages which had a major version bump you will either need to set the new version manually or set `api.versionsFrom('2.3')`. + You can also have it reference its current version and 2.3 like this: `api.versionsFrom(['1.12', '2.3'])`, for specific package it can be like this: `api.use('accounts-base@1.0.1 || 2.0.0')`. + +- Old API for packages definitions has been removed. The old underscore method names (e.g. `api.add_files()`) will no longer work, please use the camel case method names (e.g. `api.addFiles()`). + +### Breaking changes +* Removed deprecated `mobile-port` flag + +* Removed deprecated `raw` name from `isobuild` + +* Removed deprecated package API method names `Package.on_use`, `Package.on_test`, `Package._transitional_registerBuildPlugin` and `api.add_files`, if you haven't till now, please use the current camel case versions. + +* `accounts-base@2.0.0` + - Deprecated backward compatibility function `logoutOtherClients` has been removed. + +* `accounts-password@2.0.0` + - Deprecated backward compatibility functionality for `SRP` passwords from pre-Meteor 1.0 days has been removed. + - Enroll account workflow has been separated from reset password workflow (the enrollment token records are now stored in a separate db field `services.password.enroll`). + +* `ddp-client@2.5.0` + - Removed deprecated backward compatibility method names for Meteor before 1.0 + +* `ddp-server@2.4.0` + - Removed deprecated backward compatibility method names for Meteor before 1.0 + +* `meteor-base@1.5.0` + - Removed `livedata` dependency which was there for packages build for 0.9.0 + +* `minimongo@1.7.0` + - Removed the `rewind` method that was noop for compatibility with Meteor 0.8.1 + +* `mongo@1.12.0` + - Removed the `rewind` method that was noop for compatibility with Meteor 0.8.1 + +* `oauth@2.0.0` + - Removed deprecated `OAuth.initiateLogin` and other functionality like the addition of `?close` in return URI for deprecated OAuth flow pre Meteor 1.0 + +* `markdown@2.0.0` + - Use lazy imports to prevent it from being added to the initial bundle + - This package is now deprecated + +* `http@2.0.0` + - Internally http has been replaced by [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API), should still work as previous version, but edge cases might be different. This is to aid you in transition to fetch. Note that this means that the `npmRequestOptions` parameter to `HTTP.call` has been removed, as `request` is no longer used internally. + +* `socket-stream-client@0.4.0` + - Remove IE8 checks + +#### Meteor Version Release + +* `meteor-tool@2.3` + - Node.js update to 14.17.1 from 12.22.1 πŸŽ‰ + - This is a major upgrade in Node.js. See the [release notes](https://nodejs.org/en/blog/release/v14.0.0/) for more details. + - `npm` update to 6.14.13. + - `fibers` has been updated to v5.0.0. + - `promise` has been updated to v8.1.0. + - `node-gyp` has been updated to v8.0.0. + - `node-pre-gyp` has been updated to v0.15.0. + - `@babel/runtime` has been updated to v7.14.0. + - `request` has been updated to v2.88.2. + - `uuid` has been updated to v3.4.0. + - `graceful-fs` has been updated to v4.2.6. + - `tar` has been updated to v2.2.2. + - `sqlite3` has been updated to v5.0.2. + - `http-proxy` has been updated to v1.18.1. + - `wordwrap` has been updated to v1.0.0. + - `moment` has been updated to v2.29.1. + - `glob` has been updated to v7.1.6. + - `split2` has been updated to v3.2.2. + - `lru-cache` has been updated to v4.1.5. + - `anser` has been updated to v2.0.1. + - `xmlbuilder2` has been updated to v1.8.1. + - `ws` has been updated to v7.4.5. + - `underscore` has been updated to v1.13.1 + - `optimism` has been updated to v0.16.1 + - `@wry/context` has been update to v0.6.0 + - Reduced time spent by server (re)start in development by adding a cache for Reify. This optimization is on by default in development. Set the new `METEOR_TOOL_ENABLE_REIFY_RUNTIME_CACHE` and `METEOR_REIFY_CACHE_DIR` environment variables to adjust it or turn it on for production [read more in the PR](https://github.com/meteor/meteor/pull/11400). + - New flag `--platforms` has been added to the `build` command to specify the platform you want to build for. `meteor build . --platforms=android`. This is useful for example when you are not using a MacOS and you want to build your app only for Android. Also to save time on CI not building all the platforms all the time. See [PR](https://github.com/meteor/meteor/pull/11437) for details. + - The undocumented environment variable `DDP_DEFAULT_CONNECTION_URL` behavior has changed. Setting `DDP_DEFAULT_CONNECTION_URL` when running the server (development: `meteor run` or production: `node main.js`) sets the default DDP server value for meteor. But this did not work for `cordova` apps. Now you can define the `cordova` app default DDP server value by setting `DDP_DEFAULT_CONNECTION_URL` when building (`meteor build`). + - Skeletons dependencies updated to latest version + - Svelte skeleton now has HMR + - New deploy option: `--build-only`. Helpful if you want to build first and after some validations proceeding with the upload and deploy. [Read more](https://galaxy-guide.meteor.com/deploy-command-line.html#cache-only) + - Improved watched system to properly rebuild `client` even when a file is outside of `client` or `imports` folders. See [PR](https://github.com/meteor/meteor/pull/11474) for details. + - Fix an issue when `App.appendToConfig` crashed Cordova build. + - Reify compiler now uses cache in runtime. [Read more](https://github.com/meteor/meteor/pull/11400) + +* `launch-screen@1.3.0` + - Removes LaunchScreen from web clients. + +* `meteor-babel@7.11.0 (@meteorjs/babel)` + - Fixes for Samsung Internet v6.2+ to be considered modern browser and addition of [logical assignment operators](https://github.com/tc39/proposal-logical-assignment) via `babel-presets-meteor`. + - This package was renamed to `@meteorjs/babel`. + +* `hot-module-replacement@0.3.0` + - Fixes various HMR bugs and edge cases see [PR for more](https://github.com/meteor/meteor/pull/11405). + +* `email@2.1.0` + - Updates `nodemailer` to `6.6.0` and it now adds `charset=utf-8` to `text/plain` messages by default. + +* `server-render@0.4.0` + - Updated npm dependencies + +* `accounts-base@2.0.0` + - New hook `setAdditionalFindUserOnExternalLogin` has been added which allows you to customize user selection on external logins if you want to, for example, login a user who has the same e-mail as the external account. + +* `ddp-server@2.4.0` + - Added support for `this.unblock()` in `Meteor.publish()` context. See [PR](https://github.com/meteor/meteor/pull/11392) for more details. + - Add support in `Meteor.publish()` for async functions + +* `webapp@1.11.0` + - Webapp will respond appropriately to unsupported requests instead of sending content, including handling for new HTTP verbs. See [PR](https://github.com/meteor/meteor/pull/11224) for more details. + +#### Independent Releases + +* `ddp-server@2.3.3` + - Updates dependencies which removes Node's HTTP deprecation warning. + +* `socket-stream-client@0.3.2` + - Updates dependencies which removes Node's HTTP deprecation warning. + +* `ddp-client@2.4.1` + - Re-ordering fields in DDP message for better client readability. + +* `mongo@1.11.1` + - Fixes a `Timestamp.ONE is undefined` bug. + +* `mongo-id@1.0.8` + - Removes unused dependency `id-map`. + +* `accounts-server@1.7.1` + - To better test password format & limit password to 256 characters, you can change this limit by setting `Meteor.settings.packages.accounts.passwordMaxLength`. + +* `static-html@1.3.1` + - Removes `underscore` dependency. + +* `dev-error-overlay@0.1.1` + - Fixes sometimes page content being on top of error overlay. + +* `id-map@1.1.1` + - Removes unused dependencies and modernizing the code. + +* `http@1.4.4` + - Used the new deprecation package flag instead of loud console warning. + +* `logic-solver@2.0.8` + - Fixed `package.js` to use current `api` method calls. + +* `socket-stream-client@0.3.3` + - Update `faye-websocket` dependency to v0.11.4. + +* `jshint@1.1.8` + - The package has been deprecated. + +* `npm-bcrypt@0.9.4` + - The package has been deprecated. + +* `ecmascript-runtime-client@0.11.1` + - Updated `core-js` to v3.14.0 + +* `ecmascript-runtime-server@0.11.1` + - Updated `core-js` to v3.14.0 + +* `url@1.3.2` + - Updated `core-js` to v3.14.0 + +* `hot-module-replacement@0.2.1` + - Add missing dependency. + +* `observe-sequence@1.0.17` + - Updated dependencies + +* `observe-sequence@1.0.18` + - When `#each` argument is unsupported it will be shown + - Moving package under Blaze repository + +* `react-fast-refresh@0.1.1` + - Fixed the package to work in IE11 + +## v2.2.4, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.2.4` + - Patch to make 2.2.4 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.2.3, 2021-08-12 + +#### Highlights + +* Security update to Node.js [12.22.5](https://nodejs.org/en/blog/release/v12.22.5/) +* Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + +#### Meteor Version Release + +* `meteor-tool@2.3.3` + - Updated Node.js to 12.22.5 per [Node security update](https://nodejs.org/en/blog/vulnerability/aug-2021-security-releases/) + - Typescript updated to [v4.3.5](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + - `@meteorjs/babel@7.12.0` + +* `@meteorjs/babel@7.12.0` && `@meteorjs/babel@7.13.0` + - Dependencies updated to their latest versions + +* `babel-compile@7.7.0` + - `@meteorjs/babel@7.12.0` + +* `ecmascript@0.15.3` + - Typescript and Babel version bump + +* `typescript@4.3.5` + - [`typescript@4.3.5`](https://github.com/Microsoft/TypeScript/releases/tag/v4.3.5) + +## v2.2.2, 2021-08-02 + +#### Highlights + +- Security update to Node.js [12.22.4](https://nodejs.org/en/blog/release/v12.22.4/) + +## v2.2.1, 2021-06-02 + +#### Highlights + +- Node.js updated to [12.22.2](https://nodejs.org/en/blog/release/v12.22.2/) +- npm updated to 6.14.13 + +#### Meteor Version Release + +* `meteor-tool@2.2.1` + - Updated Node.js to 12.22.2 per [Node security update](https://nodejs.org/en/blog/vulnerability/july-2021-security-releases/) + +## v2.2, 2021-04-15 + +#### Highlights + +- MongoDB Update to 4.4.4 +- Cordova Update to 10 +- Typescript Update to 4.2.2 +- New skeleton: `meteor create myapp --svelte` + +### Breaking changes + +* N/A + +### Migration steps + +* `meteor-tool` maybe you need to install the new Visual C++ Redistributable for Visual Studio 2019 to run MongoDB 4.4.4 on Windows. [read more](https://docs.meteor.com/windows.html) + +* `mongo` package is now using useUnifiedTopology as `true` by default otherwise the new driver was producing a warning (see details below). It's important to test your app with this change. + +* `cordova` plugins and main libraries were updated from 9 to 10. It's important to test your app with these changes. + +* `typescript` was updated to 4.2.2, make sure your read the [breaking changes](https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/#breaking-changes). + +#### Meteor Version Release + +* `meteor-tool@2.2` + - Update embedded MongoDB version to 4.4.4 [#11341](https://github.com/meteor/meteor/pull/11341) + - Maybe you need to install the new Visual C++ Redistributable for Visual Studio 2019 to run on Windows. [read more](https://docs.meteor.com/windows.html) + - Fix WindowsLikeFilesystem true when release string includes case insensitive word microsoft. [#11321](https://github.com/meteor/meteor/pull/11321) + - Fix absoluteFilePath on Windows. [#11346](https://github.com/meteor/meteor/pull/11346) + - New skeleton: `meteor create myapp --svelte` + - Update Blaze skeleton to use HMR + +* `npm-mongo@3.9.0` + - Update MongoDB driver version to 3.6.6 + +* `mongo@1.11.0` + - Using useUnifiedTopology as `true` by default to avoid the warning: `(node:59240) [MONGODB DRIVER] Warning: Current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor. You can still use it as false with `Mongo._connectionOptions` or `Meteor.settings?.packages?.mongo?.options`. + +* `cordova@10` + - Update Cordova to 10.0.0 [#11208](https://github.com/meteor/meteor/pull/11208) + +* `typescript@4.2.2` + - Update Typescript to 4.2.2, make sure your read the [breaking changes](https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/#breaking-changes) [#11329](https://github.com/meteor/meteor/pull/11329) + +* `accounts-base@1.9.0` + - Allow to set token expiration to be set in milliseconds. [#11366](https://github.com/meteor/meteor/pull/11366) + +* `facebook-oauth@1.9.0` + - Upgrade default Facebook API to v10 & allow overriding this value. [#11362](https://github.com/meteor/meteor/pull/11362) + +* `minimongo@1.6.2` + - Add [$mul](https://docs.mongodb.com/manual/reference/operator/update/mul/#up._S_mul) to minimongo. [#11364](https://github.com/meteor/meteor/pull/11364) + +* `webapp@1.10.1` + - Fix for UNIX sockets with node cluster. [#11369](https://github.com/meteor/meteor/pull/11369) + + +## v2.1.2, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.1.2` + - Patch to make 2.1.2 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.1.1, 2021-04-06 + +### Changes + +#### Highlights + +- Node.js security [update](https://nodejs.org/en/blog/vulnerability/april-2021-security-releases/) to 12.22.1 + +#### Meteor Version Release + +* `meteor-tool@2.1.1` + - Node.js security [update](https://nodejs.org/en/blog/vulnerability/april-2021-security-releases/) to 12.22.1 + - npm update to 6.14.12 + +### Breaking changes + +* N/A + +### Migration steps + +* N/A + +## v2.1, 2021-02-24 + +### Changes + +#### Highlights + +- Node.js security [update](https://nodejs.org/en/blog/vulnerability/february-2021-security-releases/) to 12.21.0 + +#### Meteor Version Release + +* `meteor-tool@2.1` + - Node.js security [update](https://nodejs.org/en/blog/vulnerability/february-2021-security-releases/) to 12.21.0 + - `meteor create my-app --plan professional` new flag `plan` to enable you to choose a plan from the deploy command. + +### Breaking changes + +* N/A + +### Migration steps + +* N/A + +## v2.0.1, 2021-10-12 + +#### Meteor Version Release + +* `meteor-tool@2.0.1` + - Patch to make 2.0.1 compatible with Push to Deploy feature in Galaxy (Meteor Cloud) + +## v2.0, 2021-01-20 + +### Changes + +#### Highlights + +- Free deploy on [Cloud](https://www.meteor.com/cloud): Deploy for free to Cloud with one command: `meteor deploy myapp.meteorapp.com --free`. ([docs](https://docs.meteor.com/commandline.html#meteordeploy)) + + +- Deploy including MongoDB on [Cloud](https://www.meteor.com/cloud): Deploy including MongoDB in a shared instance for free to Cloud with one command: `meteor deploy myapp.meteorapp.com --free --mongo`. ([docs](https://docs.meteor.com/commandline.html#meteordeploy)) + + +- Hot Module Replacement (HMR): Updates the javascript modules in a running app that were modified during a rebuild. Reduces the feedback cycle while developing so you can view and test changes quicker (it even updates the app before the build has finished). Enabled by adding the `hot-module-replacement` package to an app. React components are automatically updated by default using React Fast Refresh. Integrations with other libraries and view layers can be provided by third party packages. Support for Blaze is coming soon. This first version supports app code in the modern web architecture. ([docs](https://guide.meteor.com/build-tool.html#hot-module-replacement)) [#11117](https://github.com/meteor/meteor/pull/11117) + +#### Meteor Version Release + +* `meteor-tool@2.0` + - `meteor create my-app` now creates by default a project using React. If you want to create a new project using Blaze you should use the new option `--blaze`. + - `meteor create --react my-app` is still going to create a React project. + - `meteor create --free` deploy for free to Cloud with one command: `meteor deploy myapp.meteorapp.com --free`. ([docs](https://docs.meteor.com/commandline.html#meteordeploy)). + - `meteor create --free --mongo` deploy including MongoDB in a shared instance for free to Cloud with one command: `meteor deploy myapp.meteorapp.com --free --mongo`. ([docs](https://docs.meteor.com/commandline.html#meteordeploy)) + - `isobuild` fixes a regression on recompiling node modules in different architectures. [#11290](https://github.com/meteor/meteor/pull/11290) + - `isobuild` converts npm-discards.js to TypeScript. [#10663](https://github.com/meteor/meteor/pull/10663) + - `cordova` ensures the pathname of the rootUrl is used in the mobile URL. [#11053](hhttps://github.com/meteor/meteor/pull/11053) + - Add `file.hmrAvailable()` for compiler plugins to check if a file meets the minimum requirements to be updated with HMR [#11117](https://github.com/meteor/meteor/pull/11117) + + +* `hot-module-replacement@1.0.0` + - New package that enables Hot Module Replacement for the Meteor app and provides an API to configure how updates are applied. HMR reduces the feedback cycle while developing by updating modified javascript modules within the running application. ([docs](https://docs.meteor.com/packages/hot-module-replacement.html)) [#11117](https://github.com/meteor/meteor/pull/11117) + - These packages have been updated to support HMR: `autoupdate@1.7.0`, `babel-compiler@7.6.0`, `ddp-client@2.4.0`, `dynamic-import@0.6.0`, `ecmascript@0.15.0`, `modules@0.16.0`, `modules-runtime-hot@0.13.0`, `standard-minifier-css@1.7.2`, `webapp@1.10.0`, `webapp-hashing@1.1.0` + + +* `react-fast-refresh@0.1.0` + - New package that updates React components using HMR. This is enabled by default in apps that have HMR enabled and use a supported React version. ([docs](https://atmospherejs.com/meteor/react-fast-refresh)) [#11117](https://github.com/meteor/meteor/pull/11117) + + +* `dev-error-overlay@0.1.0` + - New package that allows you to see build errors and server crashes in your browser during development. Requires the app to have HMR enabled. [#11117](https://github.com/meteor/meteor/pull/11117) + + +* `accounts-base@1.8.0` and `accounts-password@1.7.0` + - Extra parameters can now be added to reset password, verify e-mail and enroll account links that are generated for account e-mails. By default, these are added as search parameters to the generated url. You can pass them as an object in the appropriate functions. E.g. `Accounts.sendEnrollmentEmail(userId, email, null, extraParams);`. [#11288](https://github.com/meteor/meteor/pull/11288) + + +* `logging@1.2.0` + - Updates dependencies and make debug available for use in non production environments. [#11068](https://github.com/meteor/meteor/pull/11068) + +#### Independent Releases +* `react-meteor-data@2.2.0` + - Fix issue with useTracker and Subscriptions when using deps. [#306](https://github.com/meteor/react-packages/pull/306) + - Remove version constraint on core TypeScript package [#308](https://github.com/meteor/react-packages/pull/308) + + +* `http` + - It has been deprecated. [#11068](https://github.com/meteor/meteor/pull/11068) + +### Breaking changes + +* `http` package has been deprecated. Please start on migrating towards the [fetch](https://atmospherejs.com/meteor/fetch) package instead. + +### Migration steps + +Simple run `meteor update` in your app. + +Great new features and no breaking changes (except one package deprecation). You can always check our [Roadmap](https://docs.meteor.com/roadmap.html) to understand what is next. diff --git a/v3-docs/docs/index.md b/v3-docs/docs/index.md new file mode 100644 index 00000000000..cd528e784f8 --- /dev/null +++ b/v3-docs/docs/index.md @@ -0,0 +1,52 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + text: "Meteor Docs" + tagline: "All the documentation you need to build and deploy your app with Meteor." + image: + src: /logo.png + alt: Meteor + actions: + - theme: brand + text: Get Started + link: /about/what-is + - theme: alt + text: Install + link: /about/install + +# TODO: Update with Docs features and links as they are added +features: + - title: Zero Config + icon: πŸ› οΈ + details: Use popular frameworks and tools right out-of-the-box. Focus on building features instead of configuring tools. + + - title: Front-end Agnostic + icon: 🎨 + details: Choose your preferred front-end framework like React, VueJS, Blaze, Svelte, or Solid. + + - title: RPCs API + icon: πŸ“‘ + details: Easily connect back-end and front-end with Methods. Our Remote Procedure Call (RPC) system + + - title: Easy to Deploy + icon: πŸš€ + details: Deploy using one command from the CLI or directly from your Git repository by using Meteor Cloud. + + - title: Real-time Features + icon: ⚑ + details: Develop apps with real-time features like chats and collaborative apps with ease by using publications and subscriptions. + + - title: TypeScript Support + icon: πŸ“ + details: Experience the power of TypeScript inference to boost productivity for your full-stack application. + + - title: Built-in Accounts + icon: πŸ‘€ + details: Login and Accounts package ready to use with your app. Never rebuilt an authentication system again. + + - title: Pioneering and Reliable + icon: πŸ† + details: Developed for over a decade and trusted by industry giants. Alows you to build and scale efficiently. +--- diff --git a/v3-docs/docs/jsdoc/docdata-jsdoc-template/publish.js b/v3-docs/docs/jsdoc/docdata-jsdoc-template/publish.js new file mode 100644 index 00000000000..53075f2219e --- /dev/null +++ b/v3-docs/docs/jsdoc/docdata-jsdoc-template/publish.js @@ -0,0 +1,165 @@ +/*global require: true */ +(function () { + 'use strict'; + + // This file receives data from JSDoc via the `publish` exported function, + // and converts it into JSON that is written to a file. + + var fs = require('jsdoc/fs'); + var helper = require('jsdoc/util/templateHelper'); + + var stringify = require("canonical-json"); + + // This is the big map of name -> data that we'll write to a file. + var dataContents = {}; + // List of just the names, which we'll also write to a file. + var names = []; + + /** + * Get a tag dictionary from the tags field on the object, for custom fields + * like package + * @param {JSDocData} data The thing you get in the TaffyDB from JSDoc + * @return {Object} Keys are the parameter names, values are the values. + */ + var getTagDict = function (data) { + var tagDict = {}; + + if (data.tags) { + data.tags.forEach(function (tag) { + tagDict[tag.title] = tag.value; + }); + } + + return tagDict; + }; + + // Fix up a JSDoc entry and add it to `dataContents`. + var addToData = function (entry) { + Object.assign(entry, getTagDict(entry)); + + // strip properties we don't want + entry.comment = undefined; + entry.___id = undefined; + entry.___s = undefined; + entry.tags = undefined; + + // generate `.filepath` and `.lineno` from `.meta` + if (entry.meta && entry.meta.path) { + var packagesFolder = 'packages/'; + var index = entry.meta.path.indexOf(packagesFolder); + if (index != -1 && !entry.isprototype) { + var fullFilePath = entry.meta.path.substr(index + packagesFolder.length) + '/' + entry.meta.filename; + entry.filepath = fullFilePath; + entry.lineno = entry.meta.lineno; + } + } + + entry.meta = undefined; + + if (!entry.importfrompackage && entry.filepath) { + entry.module = entry.filepath.split('/')[0]; + } else { + entry.module = entry.importfrompackage; + } + + names.push(entry.longname); + dataContents[entry.longname] = entry; + }; + + /** + Entry point where JSDoc calls us. It passes us data in the form of + a TaffyDB object (which is an in-JS database of sorts that you can + query for records. + + @param {TAFFY} taffyData See . + @param {object} opts + @param {Tutorial} tutorials + */ + exports.publish = function(taffyData) { + var data = helper.prune(taffyData); + + var namespaces = helper.find(data, {kind: "namespace"}); + + // prepare all of the namespaces + namespaces.forEach(function (namespace) { + if (namespace.summary) { + addToData(namespace); + } + }); + + var properties = helper.find(data, {kind: "member"}); + + properties.forEach(function (property) { + if (property.summary) { + addToData(property); + } + }); + + // Callback descriptions are going to be embedded into Function descriptions + // when they are used as arguments, so we always attach them to reference + // them later. + var callbacks = helper.find(data, {kind: "typedef"}); + callbacks.forEach(function (cb) { + delete cb.comment; + addToData(cb); + }); + + var functions = helper.find(data, {kind: "function"}); + var constructors = helper.find(data, {kind: "class"}); + + // we want to do all of the same transformations to classes and functions + functions = functions.concat(constructors); + + // insert all of the function data into the namespaces + functions.forEach(function (func) { + if (! func.summary) { + // we use the @summary tag to indicate that an item is documented + return; + } + + func.options = []; + var filteredParams = []; + + // Starting a param with `options.` makes it an option, not a + // param. Dot (`.`) in this case binds tighter than comma, so + // `options.foo,bar` will create an option named `foo, bar` + // (representing two options in the docs). We process pipes so + // that `options.foo|bar` also results in `foo, bar`. + (func.params || []).forEach(function (param) { + param.name = param.name.replace(/,|\|/g, ", "); + + var splitName = param.name.split("."); + + if (splitName.length < 2 || splitName[0] !== "options") { + // not an option + filteredParams.push(param); + return; + } + + param.name = splitName[1]; + + func.options.push(param); + }); + + func.params = filteredParams; + + // the entire unparsed doc comment. takes up too much room in the + // data file. + delete func.comment; + + addToData(func); + }); + + // write full docs JSON + var jsonString = stringify(dataContents, null, 2); + var jsString = "export default" + jsonString + ";"; + jsString = "// This file is automatically generated by JSDoc; regenerate it with scripts/admin/jsdoc/jsdoc.sh\n" + jsString; + var docsDataFilename = "./v3-docs/docs/data/data.js"; + fs.writeFileSync(docsDataFilename, jsString); + + // write name tree JSON + jsonString = stringify(names.sort(), null, 2); + var nameTreeFilename= "./v3-docs/docs/data/names.json"; + fs.writeFileSync(nameTreeFilename, jsonString); + }; +})(); diff --git a/v3-docs/docs/jsdoc/jsdoc-conf.json b/v3-docs/docs/jsdoc/jsdoc-conf.json new file mode 100644 index 00000000000..4f220413fbb --- /dev/null +++ b/v3-docs/docs/jsdoc/jsdoc-conf.json @@ -0,0 +1,22 @@ +{ + "plugins": ["plugins/markdown"], + "markdown": { + "parser": "gfm" + }, + "source": { + "exclude": [ + "packages/ddp/sockjs-0.3.4.js", + "packages/test-in-browser/diff_match_patch_uncompressed.js", + "packages/jquery/jquery.js", + "packages/underscore/underscore.js", + "packages/json/json2.js", + "packages/minimongo/minimongo_tests.js", + "tools/node_modules", + "tools/skel-pack/package.js", + "docs", + "guide", + "**/node_modules", + "npm-packages" + ] + } +} diff --git a/v3-docs/docs/jsdoc/jsdoc.sh b/v3-docs/docs/jsdoc/jsdoc.sh new file mode 100755 index 00000000000..f40c75f3aca --- /dev/null +++ b/v3-docs/docs/jsdoc/jsdoc.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +INFINITY=10000 + +TOPDIR=$(pwd) +METEOR_DIR="../../" +cd "$METEOR_DIR" + +# Ensure that jsdoc failure actually makes this script fail. +set -o pipefail + +# Call git grep to find all js files with the appropriate comment tags, +# and only then pass it to JSDoc which will parse the JS files. +# This is a whole lot faster than calling JSDoc recursively. +git grep -ialE "@(summary|borrows|namespace|memberof|alias)" | xargs -L ${INFINITY} -t \ + "$TOPDIR/node_modules/.bin/jsdoc" \ + -t "$TOPDIR/jsdoc/docdata-jsdoc-template" \ + -c "$TOPDIR/jsdoc/jsdoc-conf.json" \ + 2>&1 | grep -v 'WARNING: JSDoc does not currently handle' diff --git a/v3-docs/docs/package-lock.json b/v3-docs/docs/package-lock.json new file mode 100644 index 00000000000..55d9e175c45 --- /dev/null +++ b/v3-docs/docs/package-lock.json @@ -0,0 +1,1810 @@ +{ + "name": "docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "vue-collapsed": "^1.3.0" + }, + "devDependencies": { + "canonical-json": "^0.0.4", + "jsdoc": "^4.0.2", + "vitepress": "1.0.1" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", + "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.6.0", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.0", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.6.tgz", + "integrity": "sha512-aA+awb5yoml8TQ3CzI5Ue7sM3VMRC4l1zJJW4fgZ8OCL1wshJZhNzaf0PL85DSnOUw6QuFgeHGD/eq/xwwAF2g==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.2.0.tgz", + "integrity": "sha512-OlFvx+nyr5C8zpcMBnSGir0YPD6K11uYhouqhNmm1qLiis4GA7SsGtu07r9gKS9omks8RtQqHrJL4S+lqWK01A==", + "dev": true + }, + "node_modules/@shikijs/transformers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.2.0.tgz", + "integrity": "sha512-xKn7DtA65DQV4FOfYsrvqM80xOy2xuXnxWWKsZmHv1VII/IOuDUDsWDu3KnpeLH6wqNJWp1GRoNUsHR1aw/VhQ==", + "dev": true, + "dependencies": { + "shiki": "1.2.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", + "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "dev": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.16.tgz", + "integrity": "sha512-fZG2CG8624qphMf4aj59zNHckMx1G3lxODUuyM9USKuLznXCh66TP+tEbPOCcml16hA0GizJ4D8w6F34hrfbcw==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.0.16" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.16.tgz", + "integrity": "sha512-IA8SSGiZbNgOi4wLT3mRvd71Q9KE0KvMfGk6haa2GZ6bL2K/xMA8Fvvj3o1maspfUXrGcCXutaqbLqbGx/espQ==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.0.16", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.16.tgz", + "integrity": "sha512-Lew4FrGjDjmanaUWSueNE1Rre83k7jQpttc17MaoVw0eARWU5DgZ1F/g9GNUMZXVjbP9rwE+LL3gd9XfXCfkvA==", + "dev": true, + "dependencies": { + "rfdc": "^1.3.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "dev": true, + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "dev": true, + "dependencies": { + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", + "dev": true, + "dependencies": { + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/canonical-json": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/canonical-json/-/canonical-json-0.0.4.tgz", + "integrity": "sha512-2sW7x0m/P7dqEnO0O87U7RTVQAaa7MELcd+Jd9FA6CYgYtwJ1TlDWIYMD8nuMkH1KoThsJogqgLyklrt9d/Azw==", + "dev": true + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", + "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^12.2.3", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^12.3.2", + "markdown-it-anchor": "^8.4.1", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc/node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "dev": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "dev": true, + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.20.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.0.tgz", + "integrity": "sha512-wU7iZw2BjsaKDal3pDRDy/HpPB6cuFOnVUCcw9aIPKG98+ZrXx3F+szkos8BVME5bquyKDKvRlOJFG8kMkcAbg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "dev": true, + "peer": true + }, + "node_modules/shiki": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.2.0.tgz", + "integrity": "sha512-xLhiTMOIUXCv5DqJ4I70GgQCtdlzsTqFLZWcMHHG3TAieBUbvEGthdrlPDlX4mL/Wszx9C6rEcxU6kMlg4YlxA==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.2.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/vite": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.3.tgz", + "integrity": "sha512-+i1oagbvkVIhEy9TnEV+fgXsng13nZM90JQbrcPrf6DvW2mXARlz+DK7DLiDP+qeKoD1FCVx/1SpFL1CLq9Mhw==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.36", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.1.tgz", + "integrity": "sha512-eNr5pOBppYUUjEhv8S0S2t9Tv95LQ6mMeHj6ivaGwfHxpov70Vduuwl/QQMDRznKDSaP0WKV7a82Pb4JVOaqEw==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.2.0", + "@shikijs/transformers": "^1.2.0", + "@types/markdown-it": "^13.0.7", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.16", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "shiki": "^1.2.0", + "vite": "^5.2.2", + "vue": "^3.4.21" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-collapsed": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vue-collapsed/-/vue-collapsed-1.3.0.tgz", + "integrity": "sha512-d2qwv0fj4aaoekI+6x1RgxpoK0s5K8HLj70E+dWxIKkgzADcZ9kUrnXRazgIz9ETYkKOi6j2CWv/8+rS8Kr3LQ==" + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true + } + } +} diff --git a/v3-docs/docs/package.json b/v3-docs/docs/package.json new file mode 100644 index 00000000000..748ffdba668 --- /dev/null +++ b/v3-docs/docs/package.json @@ -0,0 +1,18 @@ +{ + "scripts": { + "generate-jsdoc": "jsdoc/jsdoc.sh", + "codegen": "jsdoc/jsdoc.sh && node ./generators/codegen.js", + "docs:dev": "npm run codegen && vitepress dev", + "docs:build": "npm run codegen && vitepress build", + "docs:preview": "vitepress preview", + "deploy:preview": "npm run docs:build && npm run docs:preview" + }, + "devDependencies": { + "canonical-json": "^0.0.4", + "jsdoc": "^4.0.2", + "vitepress": "1.0.1" + }, + "dependencies": { + "vue-collapsed": "^1.3.0" + } +} diff --git a/v3-docs/docs/packages/accounts-2fa.md b/v3-docs/docs/packages/accounts-2fa.md new file mode 100644 index 00000000000..627ace87662 --- /dev/null +++ b/v3-docs/docs/packages/accounts-2fa.md @@ -0,0 +1,222 @@ +# accounts-2fa + +This package allows you to provide a way for your users to enable 2FA on their accounts, using an authenticator app such as Google Authenticator, or 1Password. When the user is logged in on your app, they will be able to generate a new QR code and read this code on the app they prefer. After that, they'll start receiving their codes. Then, they can finish enabling 2FA on your app, and every time they try to log in to your app, you can redirect them to a place where they can provide a code they received from the authenticator. + +To provide codes that are exactly compatible with all other Authenticator apps and services that implements TOTP, this package uses [node-2fa](https://www.npmjs.com/package/node-2fa) which works on top of [notp](https://github.com/guyht/notp), **that** implements TOTP ([RFC 6238](https://www.ietf.org/rfc/rfc6238.txt)) (the Authenticator standard), which is based on HOTP ([RFC 4226](https://www.ietf.org/rfc/rfc4226.txt)). + +> This package is meant to be used with [`accounts-password`](../api/accounts.md#passwords) or [`accounts-passwordless`](./accounts-passwordless.md), so if you don't have either of those in your project, you'll need to add one of them. In the future, we want to enable the use of this package with other login methods, our oauth methods (Google, GitHub, etc...). + +## 2FA Activation Flow {#activating-2fa} + +The first step, in order to enable 2FA, is to generate a QR code so that the user can scan it in an authenticator app and start receiving codes. + + + +Receives an `appName` which is the name of your app that will show up when the user scans the QR code. Also, a callback called, on success, with a QR code in SVG format, a QR secret, and the URI that can be used to activate the 2FA in an authenticator app, +or a single `Error` argument on failure. + +On success, this function will also add an object to the logged user's services object containing the QR secret: + +```js +services: { + ... + twoFactorAuthentication: { + secret: "***" + } +} +``` + +Here it's an example on how to call this function: + +```js +import { Buffer } from "buffer"; +import { Accounts } from 'meteor/accounts-base'; + + +// component +const [qrCode, setQrCode] = useState(null); + + + +``` + +This method can fail throwing the following error: + +- "The 2FA is activated. You need to disable the 2FA first before trying to generate a new activation code [2fa-activated]" if trying to generate an activation when the user already have 2FA enabled. + +At this point, the 2FA won't be activated just yet. Now that the user has access to the codes generated by their authenticator app, you can call the function `Accounts.enableUser2fa`: + + + +It should be called with a code that the users will receive from the authenticator app once they read the QR code. The callback is called with a single `Error` argument on failure. If the code provided is correct, a `type` will be added to the user's `twoFactorAuthentication` object and now 2FA is considered enabled: + +```js +services: { + ... + twoFactorAuthentication: { + type: "otp", + secret: "***", + } +} +``` + +To verify whether or not a user has 2FA enabled, you can call the function `Accounts.has2faEnabled`: + + + +This function must be called when the user is logged in. + + +## Disabling 2FA {#disabling-2fa} + +To disable 2FA for a user use this method: + + + +To call this function the user must be already logged in. + +## Log in with 2FA {#log-in-with-2fa} + +Now that you have a way to allow your users to enable 2FA on their accounts, you can create a login flow based on that. + +As said at the beginning of this guide, this package is currently working with two other packages: `accounts-password` and `accounts-passwordless`. Below there is an explanation on how to use this package with them. + + +## Working with accounts-password {#working-with-accounts-password} + +When calling the function `Meteor.loginWithPassword`, if the 2FA is enabled for the user, an error will be returned to the callback, so you can redirect the user to a place where they can provide a code. + +As an example: + +```js + +``` + +If the 2FA is not enabled, the user will be logged in normally. + +The function you will need to call now to allow the user to login is `Meteor.loginWithPasswordAnd2faCode`: + + + +Now you will be able to receive a code from the user and this function will verify if the code is valid. If it is, the user will be logged in. + +So the call of this function should look something like this: + +```js + +``` + +This method can fail throwing one of the following errors: + +- "2FA code must be informed [no-2fa-code]" if a 2FA code was not provided. +- "Invalid 2FA code [invalid-2fa-code]" if the provided 2FA code is invalid. + + +## Working with accounts-passwordless {#working-with-accounts-passwordless} + +Following the same logic from the previous package, if the 2FA is enabled, an error will be returned to the callback of the function +[`Meteor.passwordlessLoginWithToken`](./accounts-passwordless.md#Meteor-passwordlessLoginWithToken), + then you can redirect the user to a place where they can provide a code. + +Here is an example: + +```js + +``` + +Now you can call the function `Meteor.passwordlessLoginWithTokenAnd2faCode` that will allow you to provide a selector, token, and 2FA code: + + + +This method can fail throwing one of the following errors: + +- "2FA code must be informed [no-2fa-code]" if a 2FA code was not provided. +- "Invalid 2FA code [invalid-2fa-code]" if the provided 2FA code is invalid. + +## Integrating an Authentication Package with accounts-2fa {#integrating-auth-package} + +To integrate this package with any other existing Login method, it's necessary following two steps: + +1 - For the client, create a new method from your current login method. So for example, from the method `Meteor.loginWithPassword` we created a new one called `Meteor.loginWithPasswordAnd2faCode`, and the only difference between them is that the latest one receives one additional parameter, the 2FA code, but we call the same function on the server side. + +2 - For the server, inside the function that will log the user in, you verify if the function `Accounts._check2faEnabled` exists, and if yes, you call it providing the user object you want to check if the 2FA is enabled, and if either of these statements are false, you proceed with the login flow. This function exists only when the package `accounts-2fa` is added to the project. + +If both statements are true, and the login validation succeeds, you verify if a code was provided: if not, throw an error; if it was provided, verify if the code is valid by calling the function `Accounts._isTokenValid`. if `Accounts._isTokenValid` returns false, throw an error. + +Here it's an example: + +```js +const result = validateLogin(); +if (!result.error && Accounts._check2faEnabled?.(user)) { + if (!code) { + Accounts._handleError("2FA code must be informed."); + } + if ( + !Accounts._isTokenValid(user.services.twoFactorAuthentication.secret, code) + ) { + Accounts._handleError("Invalid 2FA code."); + } +} + +return result; +``` diff --git a/v3-docs/docs/packages/accounts-passwordless.md b/v3-docs/docs/packages/accounts-passwordless.md new file mode 100644 index 00000000000..938b00e0335 --- /dev/null +++ b/v3-docs/docs/packages/accounts-passwordless.md @@ -0,0 +1,39 @@ +# Passwordless + +Passwordless package allows you to create a login for users without the need for user to provide password. Upon registering or login an email is sent to the user's email with a code to enter to confirm login and a link to login directly. Since the user is responding to the email it will also verify the email. + +The first step to in the passwordless process is for the user to sign-up or request a token to their email address. You can do that with the following: + + +If the user is signing up you can pass in the `userData` object like in [Accounts.createUser](/api/accounts#Accounts-createUser). + + +The second step in the passwordless flow. Like all the other `loginWith` functions call this method to login the user with the token they have inputted. + + +Use this function if you want to manually send the email to users to login with token from the server. Do note that you will need to create the token/sequence and save it in the DB yourself. This is good if you want to change how the tokens look or are generated, but unless you are sure of what you are doing we don't recommend it. + +

Settings Options

+ +You can use the function `Accounts.config` in the server to change some settings on this package: + +- **tokenSequenceLength**: use `Accounts.config({tokenSequenceLength: _Number_})` to the size of the token sequence generated. The default is 6. + +- **loginTokenExpirationHours**: use `Accounts.config({loginTokenExpirationHours: _Number_})` to set the amount of time a token sent is valid. As it's just a number, you can use, for example, 0.5 to make the token valid for just half hour. The default is 1 hour. + +

E-mail templates

+ +`accounts-passwordless` brings new templates that you can edit to change the look of emails which send code to users. The email template is named `sendLoginToken` and beside `user` and `url`, the templates also receive a data object with `sequence` which is the user's code. + +```javascript +sendLoginToken: { + text: (user, url, { sequence }) => { + /* text template */ + }; +} +``` + +

Enable 2FA for this package

+ +You can add 2FA to your login flow by using the package [accounts-2fa](./accounts-2fa.md). +You can find an example showing how this would look like [here](./accounts-2fa.md#working-with-accounts-passwordless). diff --git a/v3-docs/docs/packages/accounts-ui.md b/v3-docs/docs/packages/accounts-ui.md new file mode 100644 index 00000000000..c7246efcb61 --- /dev/null +++ b/v3-docs/docs/packages/accounts-ui.md @@ -0,0 +1,29 @@ +# accounts-ui + +A turn-key user interface for Meteor Accounts. + +To add Accounts and a set of login controls to an application, add the +`accounts-ui` package and at least one login provider package: +`accounts-password`, `accounts-facebook`, `accounts-github`, +`accounts-google`, `accounts-twitter`, or `accounts-weibo`. + +Then simply add the `{{> loginButtons}}` helper to an HTML file. This +will place a login widget on the page. If there is only one provider configured +and it is an external service, this will add a login/logout button. If you use +`accounts-password` or use multiple external login services, this will add +a "Sign in" link which opens a dropdown menu with login options. If you plan to +position the login dropdown in the right edge of the screen, use +`{{> loginButtons align="right"}}` in order to get the dropdown to lay +itself out without expanding off the edge of the screen. + +To configure the behavior of `{{> loginButtons}}`, use +[`Accounts.ui.config`](../api/accounts.md#loggingIn). + +`accounts-ui` also includes modal popup dialogs to handle links from +[`sendResetPasswordEmail`](../api/accounts.md#Accounts-sendResetPasswordEmail), +[`sendVerificationEmail`](../api/accounts.md#Accounts-sendVerificationEmail), +and [`sendEnrollmentEmail`](../api/accounts.md#Accounts-sendEnrollmentEmail). These +do not have to be manually placed in HTML: they are automatically activated +when the URLs are loaded. + +If you want to control the look and feel of your accounts system a little more, we recommend reading the [useraccounts](http://guide.meteor.com/accounts.html#useraccounts) section of the Meteor Guide. diff --git a/v3-docs/docs/packages/appcache.md b/v3-docs/docs/packages/appcache.md new file mode 100644 index 00000000000..3b4b572355b --- /dev/null +++ b/v3-docs/docs/packages/appcache.md @@ -0,0 +1,111 @@ +# AppCache + +> This package has been deprecated since [applicationCache](https://developer.mozilla.org/en-US/docs/Web/API/Window/applicationCache), which this package relies on, has been deprecated and is not available on the latest browsers. Plaese consider using [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) as an replacement. + +The `appcache` package stores the static parts of a Meteor application +(the client side Javascript, HTML, CSS, and images) in the browser's +[application cache](https://en.wikipedia.org/wiki/AppCache). To enable +caching simply add the `appcache` package to your project. + +* Once a user has visited a Meteor application for the first time and + the application has been cached, on subsequent visits the web page + loads faster because the browser can load the application out of the + cache without contacting the server first. + +* Hot code pushes are loaded by the browser in the background while the + app continues to run. Once the new code has been fully loaded the + browser is able to switch over to the new code quickly. + +* The application cache allows the application to be loaded even when + the browser doesn't have an Internet connection, and so enables using + the app offline. + +(Note however that the `appcache` package by itself doesn't make +*data* available offline: in an application loaded offline, a Meteor +Collection will appear to be empty in the client until the Internet +becomes available and the browser is able to establish a DDP +connection). + +To turn AppCache off for specific browsers use: + +```js +Meteor.AppCache.config({ + chrome: false, + firefox: false +}); +``` + +The supported browsers that can be enabled or disabled include, but are +not limited to, `android`, `chrome`, `chromium`, `chromeMobileIOS`, +`firefox`, `ie`, `mobileSafari` and `safari`. + +Browsers limit the amount of data they will put in the application +cache, which can vary due to factors such as how much disk space is +free. Unfortunately if your application goes over the limit rather +than disabling the application cache altogether and running the +application online, the browser will instead fail that particular +*update* of the cache, leaving your users running old code. + +Thus it's best to keep the size of the cache below 5MB. The +`appcache` package will print a warning on the Meteor server console +if the total size of the resources being cached is over 5MB. + +Starting from `appcache@1.2.5`, if you need more advanced logic +to enable/disable the cache, you can use the `enableCallback` option +that is evaluated on a per-request basis. For example: + +```js +// Enable offline mode using a value from database and certificate validation +Meteor.AppCache.config({ + // This option is available starting from appcache@1.2.4 + enableCallback: () => { + if (!getSettingsFromDb("public.appcache_enabled")) { + return false; + } + + const validation = validateClientCert({ + clientCertPayload: req.headers["x-client-cert"], + url: req.url.href, + }); + + return validation.passed; + }, +}); +``` + +If you have files too large to fit in the cache you can disable +caching by URL prefix. For example, + +```js +Meteor.AppCache.config({ onlineOnly: ['/online/'] }); +``` + +causes files in your `public/online` directory to not be cached, and +so they will only be available online. You can then move your large +files into that directory and refer to them at the new URL: + +```html + +``` + +If you'd prefer not to move your files, you can use the file names +themselves as the URL prefix: + +```js +Meteor.AppCache.config({ + onlineOnly: [ + '/bigimage.jpg', + '/largedata.json' + ] +}); +``` + +though keep in mind that since the exclusion is by prefix (this is a +limitation of the application cache manifest), excluding +`/largedata.json` will also exclude such URLs as +`/largedata.json.orig` and `/largedata.json/file1`. + +For more information about how Meteor interacts with the application +cache, see the +[AppCache page](https://github.com/meteor/meteor/wiki/AppCache) +in the Meteor wiki. diff --git a/v3-docs/docs/packages/audit-argument-checks.md b/v3-docs/docs/packages/audit-argument-checks.md new file mode 100644 index 00000000000..5b97b256d25 --- /dev/null +++ b/v3-docs/docs/packages/audit-argument-checks.md @@ -0,0 +1,13 @@ +# Audit Argument Checks + + +This package causes Meteor to require that all arguments passed to methods and +publish functions are [checked](../api/check.md). Any method that does not pass each +one of its arguments to `check` will throw an error, which will be logged on the +server and which will appear to the client as a +`500 Internal server error`. This is a simple way to help ensure that your +app has complete check coverage. + +Methods and publish functions that do not need to validate their arguments can +simply run `check(arguments, [Match.Any])` to satisfy the +`audit-argument-checks` coverage checker. diff --git a/v3-docs/docs/packages/autoupdate.md b/v3-docs/docs/packages/autoupdate.md new file mode 100644 index 00000000000..a54575e5067 --- /dev/null +++ b/v3-docs/docs/packages/autoupdate.md @@ -0,0 +1,62 @@ +# Autoupdate + +This is the Meteor package that provides hot code push (HCP) functionality. + +Every Meteor application that wasn't created with the `--minimal` option +has this package already through `meteor-base` and HCP should work out of the +box. For those running `--minimal` applications and want to benefit from this +package, just add it with `meteor add autoupdate`. + +> `autoupdate` adds up to 30KB on your client's production bundle. + +With this package Meteor will use DDP to publish a collection called +_'meteor_autoupdate_clientVersions'_. This collection will be subscribed by the +user's client and every time the client identifies a change in the published +version it will refresh itself. + +## Browser Client + +The refresh will happen in the browser in two different ways: a _soft update_, +and a _hard update_. If Meteor identifies that only stylesheets were changed, then it +will verify if the user's browser is capable of reloading CSS on the fly, and a +soft update will take place. The soft update will replace the old stylesheet +with the new stylesheet without triggering a full page reload. + +In cases where a change in a server's or client's compiled file happens, the hard +update will take place: Meteor will force a complete browser reload using the +`reload` package. + +> Among other things, the `reload` package tries do reload the application +> preserving some unchanged cached files. + +## Cordova Client + +There is no soft update with Cordova apps, the client is always fully refreshed +once a change is detected. + +### `usesCleartextTraffic` +Starting with Android 9 (API level 28), [cleartext support is disabled](https://developer.android.com/training/articles/security-config) by default. +During development `autoupdate` uses cleartext to publish new client versions. +If your app targets Android 9 or greater, it will be necessary to create a +`mobile-config.js` file enabling the use of cleartext in order to have HCP working: + +```js +App.appendToConfig(` + + +`); +``` + +### `--mobile-server` +Additionally, for the HCP functionality to work it is also mandatory to provide +the address for the application server with `--mobile-server` option. If you're +testing your app on an emulator you should run it with `meteor run android --mobile-server 10.0.2.2:3000`. +If you're running it on a real device, the application server and the device +should be on the same network, and you should run your app with `meteor run android --mobile-server XXX.XXX.XXX.XXX` +where *XXX.XXX.XXX.XXX* is your local development address, _e.g. 192.168.1.4_. + +> To have a better understanding of how HCP works for mobile apps already +> published to production refer to [Hot code push on mobile](https://guide.meteor.com/cordova.html#hot-code-push) diff --git a/v3-docs/docs/packages/browser-policy.md b/v3-docs/docs/packages/browser-policy.md new file mode 100644 index 00000000000..248c49fe7cf --- /dev/null +++ b/v3-docs/docs/packages/browser-policy.md @@ -0,0 +1,175 @@ +# Browser Policy + +The `browser-policy` family of packages, part of +[Webapp](https://github.com/meteor/meteor/tree/master/packages/webapp), lets you +set security-related policies that will be enforced by newer browsers. These +policies help you prevent and mitigate common attacks like cross-site scripting +and clickjacking. + +## Details + +When you add `browser-policy` to your app, you get default configurations for +the HTTP headers X-Frame-Options and Content-Security-Policy. X-Frame-Options +tells the browser which websites are allowed to frame your app. You should only +let trusted websites frame your app, because malicious sites could harm your +users with [clickjacking attacks](https://www.owasp.org/index.php/Clickjacking). +[Content-Security-Policy](https://developer.mozilla.org/en-US/docs/Security/CSP/Introducing_Content_Security_Policy) +tells the browser where your app can load content from, which encourages safe +practices and mitigates the damage of a cross-site-scripting attack. +`browser-policy` also provides functions for you to configure these policies if +the defaults are not suitable. + +If you only want to use Content-Security-Policy or X-Frame-Options but not both, +you can add the individual packages `browser-policy-content` or +`browser-policy-framing` instead of `browser-policy`. + +For most apps, we recommend that you take the following steps: + +- Add `browser-policy` to your app to enable a starter policy. With this starter + policy, your app's client code will be able to load content (images, scripts, + fonts, etc.) only from its own origin, except that XMLHttpRequests and WebSocket + connections can go to any origin. Further, your app's client code will not be + able to use functions such as `eval()` that convert strings to code. Users' + browsers will only let your app be framed by web pages on the same origin as + your app. +- You can use the functions described below to customize the policies. If your + app does not need any inline Javascript such as inline ` + + +``` + +```javascript [index.js] +/* global WebApp Assets */ +import crypto from "crypto"; +import express from "express"; + +const router = express.Router(); + +router.get("/", async function (req, res, next) { + const buf = await Assets.getTextAsync("index.html"); + + if (buf.length > 0) { + const eTag = crypto.createHash("md5").update(buf).digest("hex"); + + if (req.headers["if-none-match"] === eTag) { + res.writeHead(304, "Not Modified"); + return res.end(); + } + + res.writeHead(200, { + ETag: eTag, + "Content-Type": "text/html", + }); + + return res.end(buf); + } + + return res.end("Index page not found!"); +}); + +WebApp.handlers.use(router); + +``` + +::: +There are a couple things to think about with this approach. + +We're reading the contents of index.html using the [Assets](../api/assets.md) module that makes it really easy to read files out of the _private_ root folder. + +We're using the [connect-route](https://www.npmjs.com/package/connect-route) NPM package to simplify WebApp route processing. But you can use any package you want to understand what is being requested. + +And finally, if you decide to use this technique you'll want to make sure you understand how conflicting client side routing will affect user experience. + +### Dynamic Runtime Configuration + +In some cases it is valuable to be able to control the **meteor_runtime_config** variable that initializes Meteor at runtime. + +#### Example + +There are occasions when a single Meteor server would like to serve multiple cordova applications that each have a unique `ROOT_URL`. But there are 2 problems: + +1. The Meteor server can only be configured to serve a single `ROOT_URL`. +2. The `cordova` applications are build time configured with a specific `ROOT_URL`. + +These 2 conditions break `autoupdate` for the cordova applications. `cordova-plugin-meteor-webapp` will fail the update if the `ROOT_URL` from the server does not match the build time configured `ROOT_URL` of the cordova application. + +To remedy this problem `webapp` has a hook for dynamically configuring `__meteor_runtime_config__` on the server. + +#### Dynamic Runtime Configuration Hook + +```js +WebApp.addRuntimeConfigHook( + ({ arch, request, encodedCurrentConfig, updated }) => { + // check the request to see if this is a request that requires + // modifying the runtime configuration + if (request.headers.domain === "calling.domain") { + // make changes to the config for this domain + // decode the current runtime config string into an object + const config = WebApp.decodeRuntimeConfig(current); + // make your changes + config.newVar = "some value"; + config.oldVar = "new value"; + // encode the modified object to the runtime config string + // and return it + return WebApp.encodeRuntimeConfig(config); + } + // Not modifying other domains so return undefined + return undefined; + } +); +``` + + + + +Additionally, 2 helper functions are available to decode the runtime config string and encode the runtime config object. + + + + +### Updated Runtime Configuration Hook + +```js +const autoupdateCache; +// Get a notification when the runtime configuration is updated +// for each arch +WebApp.addUpdatedNotifyHook(({arch, manifest, runtimeConfig}) => { + // Example, see if runtimeConfig.autoupdate has changed and if so + // do something + if(!_.isEqual(autoupdateCache, runtimeConfig.autoupdate)) { + autoupdateCache = runtimeConfig.autoupdate; + // do something... + } +}) +``` + + + + diff --git a/v3-docs/docs/public/logo.png b/v3-docs/docs/public/logo.png new file mode 100644 index 00000000000..c3335379817 Binary files /dev/null and b/v3-docs/docs/public/logo.png differ diff --git a/v3-docs/docs/public/meteor-blue.png b/v3-docs/docs/public/meteor-blue.png new file mode 100644 index 00000000000..c91f7a97180 Binary files /dev/null and b/v3-docs/docs/public/meteor-blue.png differ diff --git a/v3-docs/docs/public/meteor-logo.png b/v3-docs/docs/public/meteor-logo.png new file mode 100644 index 00000000000..ca7bb89de55 Binary files /dev/null and b/v3-docs/docs/public/meteor-logo.png differ diff --git a/v3-docs/docs/public/meteor.png b/v3-docs/docs/public/meteor.png new file mode 100644 index 00000000000..5ccc82d1389 Binary files /dev/null and b/v3-docs/docs/public/meteor.png differ diff --git a/v3-docs/docs/public/openssl-suport-table.png b/v3-docs/docs/public/openssl-suport-table.png new file mode 100644 index 00000000000..97a6bb11dc7 Binary files /dev/null and b/v3-docs/docs/public/openssl-suport-table.png differ diff --git a/v3-docs/docs/search/algolia.js b/v3-docs/docs/search/algolia.js new file mode 100644 index 00000000000..5005d608140 --- /dev/null +++ b/v3-docs/docs/search/algolia.js @@ -0,0 +1,116 @@ +// algolia crawler -> go to algolia [crawler dashboard](https://crawler.algolia.com/) if you want to +// apply any changes to the crawler +// this is maintained here so that we can have a backup of the crawler configuration and +// git history of the changes made to the crawler configuration + +// This was based onhttps://v3-docs.meteor.com/ +new Crawler({ + appId: "....", + apiKey: "....", + rateLimit: 8, + maxDepth: 10, + startUrls: ["https://v3-docs.meteor.com/"], + renderJavaScript: false, + sitemaps: ["https://v3-docs.meteor.com/sitemap.xml"], + exclusionPatterns: [], + ignoreCanonicalTo: false, + discoveryPatterns: ["https://v3-docs.meteor.com/**"], + schedule: "at 05:10 on Saturday", + actions: [ + { + indexName: "meteor_docs_v3", + pathsToMatch: ["https://v3-docs.meteor.com/**"], + recordExtractor: ({ $, helpers }) => { + return helpers.docsearch({ + recordProps: { + lvl0: { + selectors: "", + defaultValue: "Documentation", + }, + lvl1: ".content h1", + lvl2: ".content h2", + lvl3: ".content h3", + lvl4: ".content h4", + lvl5: ".content h5", + content: ".content p, .content li", + lang: { + defaultValue: ['en','en-US'], + }, + language: { + defaultValue: ['en','en-US'], + }, + }, + indexHeadings: true, + aggregateContent: true, + recordVersion: 'v3', + }); + }, + }, + ], + initialIndexSettings: { + meteor_docs_v3: { + attributesForFaceting: ["type", "lang"], + attributesToRetrieve: ["hierarchy", "content", "anchor", "url"], + attributesToHighlight: ["hierarchy", "hierarchy_camel", "content"], + attributesToSnippet: ["content:10"], + camelCaseAttributes: ["hierarchy", "hierarchy_radio", "content"], + searchableAttributes: [ + "unordered(hierarchy_radio_camel.lvl0)", + "unordered(hierarchy_radio.lvl0)", + "unordered(hierarchy_radio_camel.lvl1)", + "unordered(hierarchy_radio.lvl1)", + "unordered(hierarchy_radio_camel.lvl2)", + "unordered(hierarchy_radio.lvl2)", + "unordered(hierarchy_radio_camel.lvl3)", + "unordered(hierarchy_radio.lvl3)", + "unordered(hierarchy_radio_camel.lvl4)", + "unordered(hierarchy_radio.lvl4)", + "unordered(hierarchy_radio_camel.lvl5)", + "unordered(hierarchy_radio.lvl5)", + "unordered(hierarchy_radio_camel.lvl6)", + "unordered(hierarchy_radio.lvl6)", + "unordered(hierarchy_camel.lvl0)", + "unordered(hierarchy.lvl0)", + "unordered(hierarchy_camel.lvl1)", + "unordered(hierarchy.lvl1)", + "unordered(hierarchy_camel.lvl2)", + "unordered(hierarchy.lvl2)", + "unordered(hierarchy_camel.lvl3)", + "unordered(hierarchy.lvl3)", + "unordered(hierarchy_camel.lvl4)", + "unordered(hierarchy.lvl4)", + "unordered(hierarchy_camel.lvl5)", + "unordered(hierarchy.lvl5)", + "unordered(hierarchy_camel.lvl6)", + "unordered(hierarchy.lvl6)", + "content", + ], + distinct: true, + attributeForDistinct: "url", + customRanking: [ + "desc(weight.pageRank)", + "desc(weight.level)", + "asc(weight.position)", + ], + ranking: [ + "words", + "filters", + "typo", + "attribute", + "proximity", + "exact", + "custom", + ], + highlightPreTag: '', + highlightPostTag: "", + minWordSizefor1Typo: 3, + minWordSizefor2Typos: 7, + allowTyposOnNumericTokens: false, + minProximity: 1, + ignorePlurals: true, + advancedSyntax: true, + attributeCriteriaComputedByMinProximity: true, + removeWordsIfNoResults: "allOptional", + }, + }, +}); diff --git a/v3-docs/docs/troubleshooting/expired-certificate.md b/v3-docs/docs/troubleshooting/expired-certificate.md new file mode 100644 index 00000000000..5678a59e046 --- /dev/null +++ b/v3-docs/docs/troubleshooting/expired-certificate.md @@ -0,0 +1,87 @@ + +# Expired Certificates +Troubleshooting Expired Certificates Issues + + + +Let's Encrypt Root Certificate expired on September 30th and this change is causing some issues. We explain the possible problems below and also how to solve them. + +This is not an issue with Meteor or Galaxy, but a natural process if you are using Let's Encrypt's generated certificates. + + +## Can't run Meteor commands {#commands} + +Galaxy and all Meteor servers uses Let's Encrypt, which announced a change in May in this [post](https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021) about DST Root CA X3 expiring on September 30, 2021. + +Older versions of Meteor, more specifically anything older than Meteor v1.9 shipped with a Node.JS version below v10, which used OpenSSL < 1.0.2. + + +![](/openssl-suport-table.png) + + +If you are getting errors like Connection error (certificate has expired) when running Meteor commands it means that you are running a version of Meteor older than v1.9. + +A workaround, for now, is to run all the meteor commands with the following environment variable ***NODE_TLS_REJECT_UNAUTHORIZED***, for example in the deploy command: + +```bash +NODE_TLS_REJECT_UNAUTHORIZED=0 meteor deploy +``` + +Also note that if you are running old distributions, like Ubuntu 16 and before, locally, or in any of your CI pipelines you may also face this issue. In this case, we do recommend updating your distribution, or your local repository of root certificates (the how-to of this varies based on your distribution). + +This is not a Meteor or Galaxy issue, but it's a change in the Let's Encrypt certificate in our resources that you are accessing. + + +## Requests failing {#server-requests} + +If your server is accessing external resources where the target host is using Let's Encrypt certificates and your app is running an old Meteor version, you will also need to add `NODE_TLS_REJECT_UNAUTHORIZED` to your server environment variables. + +If you are using Galaxy, it's as simple as adding this to your settings file: + +```json +{ + "galaxy.meteor.com": { + "env": { + "NODE_TLS_REJECT_UNAUTHORIZED": "0" + } + } +} +``` + +***Please note:*** We don't recommend continued use of this workaround, as any SSL certificate is going to be authorized and you are exposing your application to serious security issues. The best option is to update Meteor to latest version, or at least Meteor 1.9 as it is the first using Node.js 12. + +You can check our list of supported Meteor versions [here](https://github.com/meteor/meteor/blob/devel/SECURITY.md#supported-versions). If your applications is not in one of them, you should migrate as soon as possible. + +This is not a Meteor or Galaxy issue, but it's a change in the Let's Encrypt certificate in the external resource that you are accessing. + + +## Client Compatibility {#client-compatibility} + +As stated before, Galaxy issues Let's Encrypt certificates automatically for all clients. This is source of confusion, as if you are depending on older clients being able to access your website, this won't work. + +If Let's encrypt certificates are not good for your clients you would need to acquire other certificate from a different provider and upload your custom certificate into Galaxy. + +You can also generate a Let's Encrypt certificate manually and upload to Galaxy, but specifying an alternative preferred chain on certbot: + +``` +sudo certbot certonly --manual --preferred-chain "ISRG Root X1" --preferred-challenges dns +``` + +More info can be obtained [here](https://letsencrypt.org/certificates). + +If you are using Galaxy, you need to follow the requirements and steps [here](https://galaxy-guide.meteor.com/encryption.html#Custom%20certificate) after generating the certificate. Galaxy only accepts custom certs in `.pem` format, the same as nginx uses. + +This is not a Meteor or Galaxy issue, but it's a change in the Let's Encrypt certificate you are using. + + +## Clients Known to be not working {#clients-not-working} + +Here is a succinct list of known to be not working clients: + +- Mac OS X prior to 10.12.1. Any browser, except firefox that bundles root chains, won't work. +- Node.JS HTTP requests prior to v10. This includes any Meteor version prior to 1.9(except). +- Any client using OpenSSL 1.0.2 and before. + +Please note that this is not an exhaustive list, but based on our reports and experience. + +This is not a Meteor or Galaxy issue, but it's a change in the Let's Encrypt certificate you are using. diff --git a/v3-docs/docs/troubleshooting/known-issues.md b/v3-docs/docs/troubleshooting/known-issues.md new file mode 100644 index 00000000000..f533d80a76b --- /dev/null +++ b/v3-docs/docs/troubleshooting/known-issues.md @@ -0,0 +1,39 @@ + +# Known issues in 2.13 + +Troubleshooting in Meteor 2.13 + +## Cannot extract version of meteor tool {#cannot-extract-meteor-tool} + + +For some users, the `meteor update` to version 2.13 command may fail with the following error or similar: + +```shell +Error: incorrect data check + at Zlib.zlibOnError [as onerror] (zlib.js:187:17) + => awaited here: + ... + at /tools/cli/main.js:1165:7 { + errno: -3, + code: 'Z_DATA_ERROR' + } + +``` + +## The issue {#the-issue} + +It seems related to [our first ESM version of Node.js v14.21.4](https://github.com/meteor/node-v14-esm) and the `zlib` package. +We have been able to reproduce this issue only in Mac Intel. + +You can follow along with the [GitHub issue](https://github.com/meteor/meteor/issues/12731) for updates. + +## Solution {#solution} + +The solution for this issue is running the following command in your terminal: + +```shell + +curl https://install.meteor.com/\?release\=2.13.3 | sh + +``` + diff --git a/v3-docs/docs/troubleshooting/windows.md b/v3-docs/docs/troubleshooting/windows.md new file mode 100644 index 00000000000..47dfa91c2d5 --- /dev/null +++ b/v3-docs/docs/troubleshooting/windows.md @@ -0,0 +1,25 @@ + +# Windows + +Trouble installing Meteor on Windows + +## Can't start Mongo server {#cant-start-mongo-server} + +If your embed MongoDB is not starting when you run `meteor` and you see messages like these: + +```shell script +C:\Users\user\app> meteor +=> Started proxy. +Unexpected mongo exit code 3221225781. Restarting. +Unexpected mongo exit code 3221225781. Restarting. +Unexpected mongo exit code 3221225781. Restarting. +Can't start Mongo server. +``` + +You [probably](https://github.com/meteor/meteor/issues/10036#issuecomment-416485306) need to install `Visual C++ Redistributable for Visual Studio`, depending on your Windows and Meteor embbeded version of MongoDB the version of Visual Studio could be different. You can check the version that we are using in our Windows test environment [here](https://github.com/meteor/meteor/blob/devel/appveyor.yml#L10) + +Starting from MongoDB 4.4.4 we started to use Visual Studio 2019. + +Until MongoDB 4.2 [this](https://www.microsoft.com/en-us/download/confirmation.aspx?id=48145) was the usually the right version to be installed. + +After installing `vc_redist.x64` you should be able to run Meteor and MongoDB server without problems. diff --git a/v3-docs/v3-migration-docs/.gitignore b/v3-docs/v3-migration-docs/.gitignore new file mode 100644 index 00000000000..a9038cf6cec --- /dev/null +++ b/v3-docs/v3-migration-docs/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.vitepress/cache +/.vitepress/dist \ No newline at end of file diff --git a/v3-docs/v3-migration-docs/.vitepress/config.mts b/v3-docs/v3-migration-docs/.vitepress/config.mts new file mode 100644 index 00000000000..c645c291dbc --- /dev/null +++ b/v3-docs/v3-migration-docs/.vitepress/config.mts @@ -0,0 +1,70 @@ +import { defineConfig } from "vitepress"; + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "Meteor 3.0 Migration Guide", + description: "Guide on migrating from Meteor 2.x to Meteor 3.0", + lang: 'en-US', + head: [["link", { rel: "icon", href: "/logo.png" }]], + lastUpdated: true, + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + nav: [ + { text: 'Meteor 3.0 Docs', link: 'https://v3-docs.meteor.com' }, + ], + sidebar: [ + { + text: "Guide", + items: [ + {text: "Overview", link: "/"}, + {text: "Frequently Asked Questions", link: "/frequently-asked-questions/"}, + {text: "Breaking Changes", link: "/breaking-changes/"}, + {text: "Meteor.call x Meteor.callAsync", link: "/breaking-changes/call-x-callAsync"}, + {text: "Upgrading packages", link: "/breaking-changes/upgrading-packages"}, + ] + }, + { + text: "TypeScript", + items: [ + {text: "Types for Meteor 3", link: "/typescript/meteor-types"}, + ] + }, + { + text: "API Changes", + items: [ + {text: "Strict Mode", link: "/api/strict-mode"}, + {text: "Global Variables", link: "/api/global-variables"}, + {text: "Renamed Functions", link: "/api/renamed-functions"}, + {text: "Removed Functions", link: "/api/removed-functions"}, + {text: "Using Async Functions", link: "/api/async-functions"}, + ] + }, + { + text: "Front end", + items: [ + {text: "React Changes", link: "/front-end/react"}, + {text: "Blaze Changes", link: "/front-end/blaze"}, + ] + }, + { + text: "Migrating to Async in v2", + link: "/migrating-to-async-in-v2/index" + } + ], + socialLinks: [{ icon: "github", link: "https://github.com/meteor/meteor" }], + + search: { + provider: "local", + }, + footer: { + message: + 'Released under the MIT License.', + copyright: + 'Copyright (c) 2011 - present Meteor Software.', + }, + editLink: { + pattern: "https://github.com/meteor/meteor/edit/release-3.0/v3-docs/v3-migration-docs/:path", + text: "Edit this page on GitHub", + }, + }, +}); diff --git a/v3-docs/v3-migration-docs/.vitepress/theme/custom.css b/v3-docs/v3-migration-docs/.vitepress/theme/custom.css new file mode 100644 index 00000000000..9fb81aef42c --- /dev/null +++ b/v3-docs/v3-migration-docs/.vitepress/theme/custom.css @@ -0,0 +1,557 @@ +/** + * Colors: Solid + * -------------------------------------------------------------------------- */ + + :root { + --vp-c-white: #ffffff; + --vp-c-black: #000000; + + --vp-c-neutral: var(--vp-c-black); + --vp-c-neutral-inverse: var(--vp-c-white); +} + +.dark { + --vp-c-neutral: var(--vp-c-white); + --vp-c-neutral-inverse: var(--vp-c-black); +} + +/** + * Colors: Palette + * + * The primitive colors used for accent colors. These colors are referenced + * by functional colors such as "Text", "Background", or "Brand". + * + * Each colors have exact same color scale system with 3 levels of solid + * colors with different brightness, and 1 soft color. + * + * - `XXX-1`: The most solid color used mainly for colored text. It must + * satisfy the contrast ratio against when used on top of `XXX-soft`. + * + * - `XXX-2`: The color used mainly for hover state of the button. + * + * - `XXX-3`: The color for solid background, such as bg color of the button. + * It must satisfy the contrast ratio with pure white (#ffffff) text on + * top of it. + * + * - `XXX-soft`: The color used for subtle background such as custom container + * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors + * on top of it. + * + * The soft color must be semi transparent alpha channel. This is crucial + * because it allows adding multiple "soft" colors on top of each other + * to create a accent, such as when having inline code block inside + * custom containers. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-gray-1: #dddde3; + --vp-c-gray-2: #e4e4e9; + --vp-c-gray-3: #ebebef; + --vp-c-gray-soft: rgba(142, 150, 170, 0.14); + + --vp-c-indigo-1: #3451b2; + --vp-c-indigo-2: #3a5ccc; + --vp-c-indigo-3: #5672cd; + --vp-c-indigo-soft: rgba(100, 108, 255, 0.14); + + --vp-c-blue-1: #383695; + --vp-c-blue-2: #3e3e9e; + --vp-c-blue-3: #4c4ca7; + --vp-c-blue-soft: rgba(100, 108, 255, 0.14); + + --vp-c-green-1: #18794e; + --vp-c-green-2: #299764; + --vp-c-green-3: #30a46c; + --vp-c-green-soft: rgba(16, 185, 129, 0.14); + + --vp-c-orange-1: #FF6A3E; + --vp-c-orange-2: #FF7A4D; + --vp-c-orange-3: #FF8A5C; + --vp-c-orange-soft: rgba(255, 106, 62, 0.14); + + --vp-c-meteor-red-1: #BF212E; + --vp-c-meteor-red-2: #A01A24; + --vp-c-meteor-red-3: #7F141D; + --vp-c-meteor-red-soft: rgba(191, 33, 46, 0.16); + + --vp-c-yellow-1: #915930; + --vp-c-yellow-2: #946300; + --vp-c-yellow-3: #9f6a00; + --vp-c-yellow-soft: rgba(234, 179, 8, 0.14); + + --vp-c-red-1: #b8272c; + --vp-c-red-2: #d5393e; + --vp-c-red-3: #e0575b; + --vp-c-red-soft: rgba(244, 63, 94, 0.14); + + --vp-c-sponsor: #db2777; +} + +.dark { + --vp-c-gray-1: #515c67; + --vp-c-gray-2: #414853; + --vp-c-gray-3: #32363f; + --vp-c-gray-soft: rgba(101, 117, 133, 0.16); + + --vp-c-indigo-1: #a8b1ff; + --vp-c-indigo-2: #5c73e7; + --vp-c-indigo-3: #3e63dd; + --vp-c-indigo-soft: rgba(100, 108, 255, 0.16); + + --vp-c-blue-1: #4b6cb7; + --vp-c-blue-2: #3e4f8c; + --vp-c-blue-3: #36436b; + --vp-c-blue-soft: rgba(100, 108, 255, 0.16); + + --vp-c-green-1: #3dd68c; + --vp-c-green-2: #30a46c; + --vp-c-green-3: #298459; + --vp-c-green-soft: rgba(16, 185, 129, 0.16); + + --vc-c-orange-1: #ff7e17; + --vc-c-orange-2: #e66c00; + --vc-c-orange-3: #b35e00; + --vc-c-orange-soft: rgba(255, 126, 23, 0.16); + + --vc-c-meteor-red-1: #BF212E; + --vc-c-meteor-red-2: #A01A24; + --vc-c-meteor-red-3: #7F141D; + --vc-c-meteor-red-soft: rgba(191, 33, 46, 0.16); + + --vp-c-yellow-1: #f9b44e; + --vp-c-yellow-2: #da8b17; + --vp-c-yellow-3: #a46a0a; + --vp-c-yellow-soft: rgba(234, 179, 8, 0.16); + + --vp-c-red-1: #f66f81; + --vp-c-red-2: #f14158; + --vp-c-red-3: #b62a3c; + --vp-c-red-soft: rgba(244, 63, 94, 0.16); +} + +/** + * Colors: Background + * + * - `bg`: The bg color used for main screen. + * + * - `bg-alt`: The alternative bg color used in places such as "sidebar", + * or "code block". + * + * - `bg-elv`: The elevated bg color. This is used at parts where it "floats", + * such as "dialog". + * + * - `bg-soft`: The bg color to slightly distinguish some components from + * the page. Used for things like "carbon ads" or "table". + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-bg: #ffffff; + --vp-c-bg-alt: #f6f6f7; + --vp-c-bg-elv: #ffffff; + --vp-c-bg-soft: #f6f6f7; +} + +.dark { + + --vp-c-bg: #101926; + --vp-c-bg-alt: #0a0f1f; + --vp-c-bg-elv: #101926; + --vp-c-bg-soft: #0a0f1f; +} + +/** + * Colors: Borders + * + * - `divider`: This is used for separators. This is used to divide sections + * within the same components, such as having separator on "h2" heading. + * + * - `border`: This is designed for borders on interactive components. + * For example this should be used for a button outline. + * + * - `gutter`: This is used to divide components in the page. For example + * the header and the lest of the page. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-border: #c2c2c4; + --vp-c-divider: #e2e2e3; + --vp-c-gutter: #e2e2e3; +} + +.dark { + --vp-c-border: #3c3f44; + --vp-c-divider: #2e2e32; + --vp-c-gutter: #000000; +} + +/** + * Colors: Text + * + * - `text-1`: Used for primary text. + * + * - `text-2`: Used for muted texts, such as "inactive menu" or "info texts". + * + * - `text-3`: Used for subtle texts, such as "placeholders" or "caret icon". + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-text-1: rgba(60, 60, 67); + --vp-c-text-2: rgba(60, 60, 67, 0.78); + --vp-c-text-3: rgba(60, 60, 67, 0.56); +} + +.dark { + --vp-c-text-1: rgba(255, 255, 245, 0.86); + --vp-c-text-2: rgba(235, 235, 245, 0.6); + --vp-c-text-3: rgba(235, 235, 245, 0.38); +} + +/** + * Colors: Function + * + * - `default`: The color used purely for subtle indication without any + * special meanings attached to it such as bg color for menu hover state. + * + * - `brand`: Used for primary brand colors, such as link text, button with + * brand theme, etc. + * + * - `tip`: Used to indicate useful information. The default theme uses the + * brand color for this by default. + * + * - `warning`: Used to indicate warning to the users. Used in custom + * container, badges, etc. + * + * - `danger`: Used to show error, or dangerous message to the users. Used + * in custom container, badges, etc. + * + * To understand the scaling system, refer to "Colors: Palette" section. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-default-1: var(--vp-c-gray-1); + --vp-c-default-2: var(--vp-c-gray-2); + --vp-c-default-3: var(--vp-c-gray-3); + --vp-c-default-soft: var(--vp-c-gray-soft); + + --vp-c-brand-1: var(--vp-c-meteor-red-1); + --vp-c-brand-2: var(--vp-c-meteor-red-2); + --vp-c-brand-3: var(--vp-c-meteor-red-3); + --vp-c-brand-soft: var(--vp-c-blue-soft); + + /* DEPRECATED: Use `--vp-c-brand-1` instead. */ + --vp-c-brand: var(--vp-c-brand-1); + + --vp-c-tip-1: var(--vp-c-brand-1); + --vp-c-tip-2: var(--vp-c-brand-2); + --vp-c-tip-3: var(--vp-c-brand-3); + --vp-c-tip-soft: var(--vp-c-brand-soft); + + --vp-c-warning-1: var(--vp-c-yellow-1); + --vp-c-warning-2: var(--vp-c-yellow-2); + --vp-c-warning-3: var(--vp-c-yellow-3); + --vp-c-warning-soft: var(--vp-c-yellow-soft); + + --vp-c-danger-1: var(--vp-c-red-1); + --vp-c-danger-2: var(--vp-c-red-2); + --vp-c-danger-3: var(--vp-c-red-3); + --vp-c-danger-soft: var(--vp-c-red-soft); +} + +/** + * Typography + * -------------------------------------------------------------------------- */ + +:root { + --vp-font-family-base: 'Chinese Quotes', 'Inter var', 'Inter', ui-sans-serif, + system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + 'Helvetica Neue', Helvetica, Arial, 'Noto Sans', sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --vp-font-family-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, + Consolas, 'Liberation Mono', 'Courier New', monospace; +} + +/** + * Shadows + * -------------------------------------------------------------------------- */ + +:root { + --vp-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.06); + --vp-shadow-2: 0 3px 12px rgba(0, 0, 0, 0.07), 0 1px 4px rgba(0, 0, 0, 0.07); + --vp-shadow-3: 0 12px 32px rgba(0, 0, 0, 0.1), 0 2px 6px rgba(0, 0, 0, 0.08); + --vp-shadow-4: 0 14px 44px rgba(0, 0, 0, 0.12), 0 3px 9px rgba(0, 0, 0, 0.12); + --vp-shadow-5: 0 18px 56px rgba(0, 0, 0, 0.16), 0 4px 12px rgba(0, 0, 0, 0.16); +} + +/** + * Z-indexes + * -------------------------------------------------------------------------- */ + +:root { + --vp-z-index-footer: 10; + --vp-z-index-local-nav: 20; + --vp-z-index-nav: 30; + --vp-z-index-layout-top: 40; + --vp-z-index-backdrop: 50; + --vp-z-index-sidebar: 60; +} + +/** + * Icons + * -------------------------------------------------------------------------- */ + +:root { + --vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E"); + --vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E"); +} + +/** + * Layouts + * -------------------------------------------------------------------------- */ + +:root { + --vp-layout-max-width: 1440px; +} + +/** + * Component: Header Anchor + * -------------------------------------------------------------------------- */ + +:root { + --vp-header-anchor-symbol: '#'; +} + +/** + * Component: Code + * -------------------------------------------------------------------------- */ + +:root { + --vp-code-line-height: 1.7; + --vp-code-font-size: 0.875em; + --vp-code-color: var(--vp-c-brand-1); + --vp-code-link-color: var(--vp-c-brand-1); + --vp-code-link-hover-color: var(--vp-c-brand-2); + --vp-code-bg: var(--vp-c-default-soft); + + --vp-code-block-color: var(--vp-c-text-2); + --vp-code-block-bg: var(--vp-c-bg-alt); + --vp-code-block-divider-color: var(--vp-c-gutter); + + --vp-code-lang-color: var(--vp-c-text-3); + + --vp-code-line-highlight-color: var(--vp-c-default-soft); + --vp-code-line-number-color: var(--vp-c-text-3); + + --vp-code-line-diff-add-color: var(--vp-c-green-soft); + --vp-code-line-diff-add-symbol-color: var(--vp-c-green-1); + + --vp-code-line-diff-remove-color: var(--vp-c-red-soft); + --vp-code-line-diff-remove-symbol-color: var(--vp-c-red-1); + + --vp-code-line-warning-color: var(--vp-c-yellow-soft); + --vp-code-line-error-color: var(--vp-c-red-soft); + + --vp-code-copy-code-border-color: var(--vp-c-divider); + --vp-code-copy-code-bg: var(--vp-c-bg-soft); + --vp-code-copy-code-hover-border-color: var(--vp-c-divider); + --vp-code-copy-code-hover-bg: var(--vp-c-bg); + --vp-code-copy-code-active-text: var(--vp-c-text-2); + --vp-code-copy-copied-text-content: 'Copied'; + + --vp-code-tab-divider: var(--vp-code-block-divider-color); + --vp-code-tab-text-color: var(--vp-c-text-2); + --vp-code-tab-bg: var(--vp-code-block-bg); + --vp-code-tab-hover-text-color: var(--vp-c-text-1); + --vp-code-tab-active-text-color: var(--vp-c-text-1); + --vp-code-tab-active-bar-color: var(--vp-c-brand-1); +} + +/** + * Component: Button + * -------------------------------------------------------------------------- */ + +:root { + --vp-button-brand-border: transparent; + --vp-button-brand-text: var(--vp-c-white); + --vp-button-brand-bg: var(--vp-c-blue-3); + --vp-button-brand-hover-border: transparent; + --vp-button-brand-hover-text: var(--vp-c-white); + --vp-button-brand-hover-bg: var(--vp-c-blue-2); + --vp-button-brand-active-border: transparent; + --vp-button-brand-active-text: var(--vp-c-white); + --vp-button-brand-active-bg: var(--vp-c-blue-1); + + --vp-button-alt-border: transparent; + --vp-button-alt-text: var(--vp-c-text-1); + --vp-button-alt-bg: var(--vp-c-default-3); + --vp-button-alt-hover-border: transparent; + --vp-button-alt-hover-text: var(--vp-c-text-1); + --vp-button-alt-hover-bg: var(--vp-c-default-2); + --vp-button-alt-active-border: transparent; + --vp-button-alt-active-text: var(--vp-c-text-1); + --vp-button-alt-active-bg: var(--vp-c-default-1); + + --vp-button-sponsor-border: var(--vp-c-text-2); + --vp-button-sponsor-text: var(--vp-c-text-2); + --vp-button-sponsor-bg: transparent; + --vp-button-sponsor-hover-border: var(--vp-c-sponsor); + --vp-button-sponsor-hover-text: var(--vp-c-sponsor); + --vp-button-sponsor-hover-bg: transparent; + --vp-button-sponsor-active-border: var(--vp-c-sponsor); + --vp-button-sponsor-active-text: var(--vp-c-sponsor); + --vp-button-sponsor-active-bg: transparent; +} + +/** + * Component: Custom Block + * -------------------------------------------------------------------------- */ + +:root { + --vp-custom-block-font-size: 14px; + --vp-custom-block-code-font-size: 13px; + + --vp-custom-block-info-border: transparent; + --vp-custom-block-info-text: var(--vp-c-text-1); + --vp-custom-block-info-bg: var(--vp-c-default-soft); + --vp-custom-block-info-code-bg: var(--vp-c-default-soft); + + --vp-custom-block-tip-border: transparent; + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--vp-c-brand-soft); + --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); + + --vp-custom-block-warning-border: transparent; + --vp-custom-block-warning-text: var(--vp-c-text-1); + --vp-custom-block-warning-bg: var(--vp-c-warning-soft); + --vp-custom-block-warning-code-bg: var(--vp-c-warning-soft); + + --vp-custom-block-danger-border: transparent; + --vp-custom-block-danger-text: var(--vp-c-text-1); + --vp-custom-block-danger-bg: var(--vp-c-danger-soft); + --vp-custom-block-danger-code-bg: var(--vp-c-danger-soft); + + --vp-custom-block-details-border: var(--vp-custom-block-info-border); + --vp-custom-block-details-text: var(--vp-custom-block-info-text); + --vp-custom-block-details-bg: var(--vp-custom-block-info-bg); + --vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg); +} + +/** + * Component: Input + * -------------------------------------------------------------------------- */ + +:root { + --vp-input-border-color: var(--vp-c-border); + --vp-input-bg-color: var(--vp-c-bg-alt); + + --vp-input-switch-bg-color: var(--vp-c-gray-soft); +} + +/** + * Component: Nav + * -------------------------------------------------------------------------- */ + +:root { + --vp-nav-height: 64px; + --vp-nav-bg-color: var(--vp-c-bg); + --vp-nav-screen-bg-color: var(--vp-c-bg); + --vp-nav-logo-height: 24px; +} + +.hide-nav { + --vp-nav-height: 0px; +} + +.hide-nav .VPSidebar { + --vp-nav-height: 22px; +} + +/** + * Component: Local Nav + * -------------------------------------------------------------------------- */ + +:root { + --vp-local-nav-bg-color: var(--vp-c-bg); +} + +/** + * Component: Sidebar + * -------------------------------------------------------------------------- */ + +:root { + --vp-sidebar-width: 272px; + --vp-sidebar-bg-color: var(--vp-c-bg-alt); +} + +/** + * Colors Backdrop + * -------------------------------------------------------------------------- */ + +:root { + --vp-backdrop-bg-color: rgba(0, 0, 0, 0.6); +} + +/** + * Component: Home + * -------------------------------------------------------------------------- */ + +:root { + --vp-home-hero-name-color: var(--vp-c-brand-1); + --vp-home-hero-name-background: transparent; + + --vp-home-hero-image-background-image: none; + --vp-home-hero-image-filter: none; +} + +/** + * Component: Badge + * -------------------------------------------------------------------------- */ + +:root { + --vp-badge-info-border: transparent; + --vp-badge-info-text: var(--vp-c-text-2); + --vp-badge-info-bg: var(--vp-c-default-soft); + + --vp-badge-tip-border: transparent; + --vp-badge-tip-text: var(--vp-c-brand-1); + --vp-badge-tip-bg: var(--vp-c-brand-soft); + + --vp-badge-warning-border: transparent; + --vp-badge-warning-text: var(--vp-c-warning-1); + --vp-badge-warning-bg: var(--vp-c-warning-soft); + + --vp-badge-danger-border: transparent; + --vp-badge-danger-text: var(--vp-c-danger-1); + --vp-badge-danger-bg: var(--vp-c-danger-soft); +} + +/** + * Component: Carbon Ads + * -------------------------------------------------------------------------- */ + +:root { + --vp-carbon-ads-text-color: var(--vp-c-text-1); + --vp-carbon-ads-poweredby-color: var(--vp-c-text-2); + --vp-carbon-ads-bg-color: var(--vp-c-bg-soft); + --vp-carbon-ads-hover-text-color: var(--vp-c-brand-1); + --vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1); +} + +/** + * Component: Local Search + * -------------------------------------------------------------------------- */ + +:root { + --vp-local-search-bg: var(--vp-c-bg); + --vp-local-search-result-bg: var(--vp-c-bg); + --vp-local-search-result-border: var(--vp-c-divider); + --vp-local-search-result-selected-bg: var(--vp-c-bg); + --vp-local-search-result-selected-border: var(--vp-c-brand-1); + --vp-local-search-highlight-bg: var(--vp-c-brand-1); + --vp-local-search-highlight-text: var(--vp-c-neutral-inverse); +} + +::selection { + background: var(--vp-c-brand-soft); +} + + diff --git a/v3-docs/v3-migration-docs/.vitepress/theme/index.ts b/v3-docs/v3-migration-docs/.vitepress/theme/index.ts new file mode 100644 index 00000000000..508d8b4af1e --- /dev/null +++ b/v3-docs/v3-migration-docs/.vitepress/theme/index.ts @@ -0,0 +1,4 @@ +import DefaultTheme from 'vitepress/theme' +import './custom.css' + +export default DefaultTheme \ No newline at end of file diff --git a/v3-docs/v3-migration-docs/README.md b/v3-docs/v3-migration-docs/README.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/v3-docs/v3-migration-docs/api-examples.md b/v3-docs/v3-migration-docs/api-examples.md new file mode 100644 index 00000000000..6bd8bb5c170 --- /dev/null +++ b/v3-docs/v3-migration-docs/api-examples.md @@ -0,0 +1,49 @@ +--- +outline: deep +--- + +# Runtime API Examples + +This page demonstrates usage of some of the runtime APIs provided by VitePress. + +The main `useData()` API can be used to access site, theme, and page data for the current page. It works in both `.md` and `.vue` files: + +```md + + +## Results + +### Theme Data +
{{ theme }}
+ +### Page Data +
{{ page }}
+ +### Page Frontmatter +
{{ frontmatter }}
+``` + + + +## Results + +### Theme Data +
{{ theme }}
+ +### Page Data +
{{ page }}
+ +### Page Frontmatter +
{{ frontmatter }}
+ +## More + +Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata). diff --git a/v3-docs/v3-migration-docs/api/async-functions.md b/v3-docs/v3-migration-docs/api/async-functions.md new file mode 100644 index 00000000000..b09eeeb3a03 --- /dev/null +++ b/v3-docs/v3-migration-docs/api/async-functions.md @@ -0,0 +1,179 @@ + +# Using Async Functions + +Meteor now uses the `Promise` [API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) for all asynchronous operations. + +This means that for many functions, +for example the `Meteor.call` function, +you have the `Meteor.callAsync` counterpart, +that returns a promise of the result. + +You can promisify any function that takes a callback as its last argument, with the [`Meteor.promisify`](https://v3-docs.meteor.com/api/meteor.html#Meteor-promisify) function. + + +for example, you can make [`Meteor.loginWithPassword`](https://v3-docs.meteor.com/api/accounts.html#Meteor-loginWithPassword) return a promise like this: + +```javascript +import { Meteor } from 'meteor/meteor'; + +loginWithPasswordAsync = Meteor.promisify(Meteor.loginWithPassword); + +const login = async () => { + try { + await loginWithPasswordAsync('username', 'password'); + console.log('Logged in'); + } catch (error) { + console.error('Login failed', error); + } +}; +``` + +For promises in general, you can use the `await` keyword to wait for the promise to resolve. + +```javascript +const delay = async () => { + console.log('Waiting...'); + await new Promise(resolve => setTimeout(resolve, 1000)); + console.log('Done waiting'); +}; + +await delay(); // it will wait for 1 second before logging 'Done waiting' +``` + +Normally you should `await` the promise inside an `async` function, but you can also use the `then` method to handle the promise resolution. + +```javascript +const delay = () => { + console.log('Waiting...'); + return new Promise(resolve => setTimeout(resolve, 1000)); +}; + +delay().then(() => console.log('Done waiting')); +console.log('End of the function'); // this will be logged before 'Done waiting' +``` + +With the `await` keyword, the code will wait for the promise to resolve before continuing. + +This is essential for Meteor methods, as they are asynchronous by nature. + +```javascript +const callMethod = async () => { + try { + const result = await Meteor.callAsync('myMethod', 'arg1', 'arg2'); + console.log('Method result:', result); + } catch (error) { + console.error('Method error:', error); + } +}; + +await callMethod(); +``` +As mentioned in the [call x callAsync](../breaking-changes/call-x-callAsync.md) you _should_ +await for the `Meteor.callAsync` function to resolve. + + +## Handling errors + +When using `await`, you can use a `try`/`catch` block to handle errors. + +In the past you would have to pass a callback to handle errors, but now you can use the `catch` block to handle errors. + +```javascript +import { Meteor } from 'meteor/meteor'; + +Meteor.call('myMethod', 'arg1', 'arg2', (error, result) => { + if (error) { + console.error('Method error:', error); + } else { + console.log('Method result:', result); + } +}); + +``` + +Now, with `await` you can use a `try`/`catch` block to handle errors. + +```javascript +import { Meteor } from 'meteor/meteor'; + +try { + const result = await Meteor.callAsync('myMethod', 'arg1', 'arg2'); + console.log('Method result:', result); +} catch (error) { + console.error('Method error:', error); +} +``` + +You also can use the `then` method to handle the promise resolution. + +```javascript +import { Meteor } from 'meteor/meteor'; + +Meteor.callAsync('myMethod', 'arg1', 'arg2') + .then(result => console.log('Method result:', result)) + .catch(error => console.error('Method error:', error)); +``` + +## Async context + +To use await, you need to be inside an `async` function. + +```javascript + +const myFunction = async () => { // [!code highlight] + console.log('Waiting...'); + await new Promise(resolve => setTimeout(resolve, 1000)); + console.log('Done waiting'); +}; + +``` + +Without the `async` keyword, you will get a syntax error. + +```javascript + +const myFunction = () => { // [!code error] syntax error! + console.log('Waiting...'); + await new Promise(resolve => setTimeout(resolve, 1000)); + console.log('Done waiting'); +}; + +``` + +You context must be `async` to use the `await` keyword. + +for example in meteor 2 this code would work: + +```javascript +import { Meteor } from 'meteor/meteor'; + +const someFunction = () => { // [!code ++] + Meteor.call('myMethod', 'arg1', 'arg2', (error, result) => { // [!code ++] + if (error) { + console.error('Method error:', error); + } else { + console.log('Method result:', result); + // do something with the result + } + }); +}; + +``` + +Now you need to make it `async` to use the `await` keyword. + +```javascript +import { Meteor } from 'meteor/meteor'; + +const someFunction = async () => { // [!code ++] + try { + const result = await Meteor.callAsync('myMethod', 'arg1', 'arg2'); // [!code ++] + console.log('Method result:', result); + // do something with the result + } catch (error) { + console.error('Method error:', error); + } +}; + +``` + diff --git a/v3-docs/v3-migration-docs/api/global-variables.md b/v3-docs/v3-migration-docs/api/global-variables.md new file mode 100644 index 00000000000..ff798da48f9 --- /dev/null +++ b/v3-docs/v3-migration-docs/api/global-variables.md @@ -0,0 +1,37 @@ +# Global Variables + +In Meteor 3, there are important changes regarding the definition of global variables in applications. This document provides guidelines on how to properly define globals in Meteor 3 and explains the implications of strict mode enforcement. + +### Previous Approach + +In previous versions of Meteor, you might have defined a global variable in your application using the following syntax: + +```javascript +GlobalVar = { ... }; +``` + +### New Approach in Meteor 3 + +With the introduction of strict mode in Meteor 3, the recommended approach for defining global variables in your application has changed. You should now use the `global` object to define globals: + +```javascript +global.GlobalVar = { ... }; +``` + +This change is necessary because strict mode, which is automatically enforced in certain situations in Meteor 3, does not support defining globals in the traditional way. + +## Defining Global Variables in Packages + +For packages, the process of defining global variables remains unchanged from Meteor 2. You can continue to define globals as you have previously without any modifications. + +In Meteor packages, Meteor automatically adds a variable declaration within the package scope. This behavior prevents the need for using the `global` object and avoids the strict mode restrictions. + +However, in applications, there is no equivalent "app scope," so globals defined in applications must be true globals, requiring the use of the `global` object. + +Meteor 3 enforces strict mode for modules that use top-level await (TLA) or the `import` syntax. This enforcement aligns with JavaScript specifications and improves the overall consistency and compliance of your code. + +For more detailed information on strict mode and its implications, refer to the [Strict Mode](./strict-mode.md) document. + +## Conclusion + +By following these guidelines, you can ensure that your global variable definitions are compatible with Meteor 3 and its strict mode enforcement. This will help maintain the stability and compliance of your application as you transition to the latest version of Meteor. \ No newline at end of file diff --git a/v3-docs/v3-migration-docs/api/removed-functions.md b/v3-docs/v3-migration-docs/api/removed-functions.md new file mode 100644 index 00000000000..df246148ae5 --- /dev/null +++ b/v3-docs/v3-migration-docs/api/removed-functions.md @@ -0,0 +1,102 @@ +# Removed Functions + +In v3, we decided to remove some functions that do not make more sense in the current context. +Here is the list of removed functions: + + - `Promise.await` + - `Fibers` + - `Meteor.wrapAsync` + + +::: tip + +These functions were only available in the server-side. + +::: + +## Promise.await + +It is no longer necessary, you can use `await` directly in your code. + +```javascript + +// Before + +function someFunction() { + const result = Promise.await(someAsyncFunction()); + return result; +} + +// After + +async function someFunction() { + const result = await someAsyncFunction(); + return result; +} + +``` + + + +## Fibers + +Fibers are no longer necessary, you can use `async/await` directly in your code. + +```javascript + +// Before +const Future = Npm.require('fibers/future'); + +function someFunction() { + const future = new Future(); + someAsyncFunction((error, result) => { + if (error) { + future.throw(error); + } else { + future.return(result); + } + }); + return future.wait(); +} + +// After + +async function someFunction() { + return new Promise((resolve, reject) => { + someAsyncFunction((error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); + }); +} + +``` + +## Meteor.wrapAsync + +It is no longer necessary, you can use `async/await` directly in your code. + +```javascript + +// Before + +const wrappedFunction = Meteor.wrapAsync(someAsyncFunction); + +function someFunction() { + const result = wrappedFunction(); + return result; +} + +// After + +async function someFunction() { + const result = await someAsyncFunction(); + return result; +} + +``` + +For a full list of changes check the [changelog](https://v3-docs.meteor.com/history.html#changelog) for Meteor v3 diff --git a/v3-docs/v3-migration-docs/api/renamed-functions.md b/v3-docs/v3-migration-docs/api/renamed-functions.md new file mode 100644 index 00000000000..085093f824d --- /dev/null +++ b/v3-docs/v3-migration-docs/api/renamed-functions.md @@ -0,0 +1,75 @@ +# Renamed functions + +In v3, we decided to rename a few functions to make their API more consistent. + + - `Accounts.setPassword` + - `Assets.getText` + - `Assets.getBinary` + + +## Accounts.setPassword + +It is no longer available, you should use `Accounts.setPasswordAsync`. + +```javascript + +// Before + +function someFunction(userId, newPassword) { + Accounts.setPassword(userId, newPassword); +} + +// After + +async function someFunction(userId, newPassword) { + await Accounts.setPasswordAsync(userId, newPassword); +} + +``` + +## Assets.getText + +It is no longer available, you should use `Assets.getTextAsync`. + +```javascript + +// Before + +function someFunction() { + const text = Assets.getText('some-file.txt'); + return text; +} + +// After + +async function someFunction() { + const text = await Assets.getTextAsync('some-file.txt'); + return text; +} + +``` + +## Assets.getBinary + +It is no longer available, you should use `Assets.getBinaryAsync`. + +```javascript + +// Before + +function someFunction() { + const binary = Assets.getBinary('some-file.txt'); + return binary; +} + +// After + +async function someFunction() { + const binary = await Assets.getBinaryAsync('some-file.txt'); + return binary; +} + +``` + + +For a full list of changes check the [changelog](https://v3-docs.meteor.com/history.html#changelog) for Meteor v3 diff --git a/v3-docs/v3-migration-docs/api/strict-mode.md b/v3-docs/v3-migration-docs/api/strict-mode.md new file mode 100644 index 00000000000..9b237ed37f1 --- /dev/null +++ b/v3-docs/v3-migration-docs/api/strict-mode.md @@ -0,0 +1,23 @@ +# Strict Mode + +Meteor 3 introduces enhanced support for strict mode, aligning with modern JavaScript standards. This document outlines the changes related to module execution in strict mode, focusing on the use of top-level await (TLA) and module syntax (`import` and `export`). + +Strict mode is a restricted variant of JavaScript that eliminates some of the language's silent errors and fixes mistakes that make it difficult for JavaScript engines to perform optimizations. Modules are designed to run in strict mode by default. + +### Changes in Meteor 3 + +With the introduction of Meteor 3, modules will automatically run in strict mode under certain conditions: + +1. **Top-Level Await (TLA):** Modules using top-level await will be executed in strict mode. +2. **Import Syntax:** Modules using the `import` statement will be executed in strict mode. +3. **Export Syntax:** Modules using the `export` statement should also run in strict mode. + +### Background + +Initially, there was a bug in the TLA implementation of Reify, a module used by Meteor. By default, Reify does not enforce strict mode for modules. However, the TLA implementation in Meteor did not fully adhere to this behavior, leading to modules running in strict mode when using TLA. + +A decision was made to retain this behavior to ensure Meteor's compliance with the ECMAScript specification. Consequently, modules will continue to run in strict mode in specific situations, enhancing spec compliance and improving the overall consistency of the development experience. + +While this change aims to bring Meteor more in line with the JavaScript specification, developers might notice some inconsistencies or changes in the user experience. It is important to review your code to ensure compatibility with strict mode, especially if your modules rely on defining globals or other behaviors not permitted in strict mode. + +The enforcement of strict mode in certain scenarios in Meteor 3 represents a step towards greater specification compliance and modernization. Developers should adapt their code to accommodate these changes, ensuring a smooth transition to Meteor 3. diff --git a/v3-docs/v3-migration-docs/breaking-changes/call-x-callAsync.md b/v3-docs/v3-migration-docs/breaking-changes/call-x-callAsync.md new file mode 100644 index 00000000000..f5c6a8c5b65 --- /dev/null +++ b/v3-docs/v3-migration-docs/breaking-changes/call-x-callAsync.md @@ -0,0 +1,136 @@ +# Meteor.call x Meteor.callAsync + + + +::: tip + +It is recommened to use `Meteor.callAsync` instead of `Meteor.call` because of how our +async API works. `Meteor.call` is still available but it is not recommended to use it, it +can lead to unexpected behavior. + +Using `Meteor.callAsync` will make your code more predictable and easier to maintain. + +::: + +Example of how to migrate from `Meteor.call` to `Meteor.callAsync`: + + +::: code-group + + +```js [v2-client.jsx] +import { Meteor } from 'meteor/meteor' + +let data, error; + +Meteor.call('getAllData', (err, res) => { // [!code highlight] + if (err) { + error = err; + } else { + data = res; + } +}); + +// render data or error + + +``` + + +```js [v2-server.js] +import { Meteor } from 'meteor/meteor' +import { Mongo } from 'meteor/mongo' + +const MyCollection = new Mongo.Collection('myCollection'); + +Meteor.methods({ + getAllData() { + return MyCollection.find().fetch(); // [!code highlight] + } +}); +``` + +```js [v3-client.jsx] +import { Meteor } from 'meteor/meteor' + +try { + const data = await Meteor.callAsync('getAllData'); // [!code highlight] + // render data +} catch (error) { + // render error +} + +``` + +```js [v3-server.js] +import { Meteor } from 'meteor/meteor' +import { Mongo } from 'meteor/mongo' + +const MyCollection = new Mongo.Collection('myCollection'); + +Meteor.methods({ + async getAllData() { + return await MyCollection.find().fetchAsync(); // [!code highlight] + } +}); + +``` + +::: + +## Rules of using `Meteor.callAsync` & `Meteor.call` + +::: tip +It is not recommended to use concurrent calls. +Use `await` for your `Meteor.callAsync`. +::: + +here are a few examples of cases where you should use `Meteor.callAsync` instead of `Meteor.call`: + +```js +import { Meteor } from 'meteor/meteor' + +Meteor.call("someMethod", (err, res) => { // [!code error] This is not ok + if (err) { + console.log(err); + } else { + console.log(res); + } +}); + + +Meteor.callAsync('someMethod') // [!code error] This is not ok + .then(data => console.log(data)) + .catch(err => console.log(err)); + +// it is not recommended to use concurrent calls + +Promise.all([ // [!code error] This is not ok + Meteor.callAsync('someMethod'), + Meteor.callAsync('someMethod') +]).then(([data1, data2]) => { + console.log(data1, data2); +}); + +// Ok section + +Meteor.call("someMethod", (err, res) => { // [!code ++] + if (err) { + console.log(err); + } else { + console.log(res); + } +}); + +await Meteor.callAsync('someMethod') // this is ok // [!code ++] + +// this is also ok +Meteor.callAsync('someMethod').then(data => { // [!code ++] + console.log(data); + Meteor.callAsync('someMethod').then(data2 => { + console.log(data2); + }); +}); + + +``` diff --git a/v3-docs/v3-migration-docs/breaking-changes/index.md b/v3-docs/v3-migration-docs/breaking-changes/index.md new file mode 100644 index 00000000000..8141bac4123 --- /dev/null +++ b/v3-docs/v3-migration-docs/breaking-changes/index.md @@ -0,0 +1,275 @@ +# Breaking changes + +## MongoDB Methods in the server + +As mentioned in the [Frequently Asked Questions](../frequently-asked-questions/index.md#mongo-methods-server), `insert`, `update`, + `remove`, `find`, `findOne`, `upsert` methods no longer work in the server. + +You should migrate to use their `Async` counterparts. + + +```js +const docs = MyCollection.find({ _id: '123' }).fetch(); // [!code error] This will not work in the server +const doc = MyCollection.findOne({ _id: '123' }); // [!code error] This will not work in the server + + +// in Meteor 3.x you should use the Async methods + +const docs = await MyCollection.find({ _id: '123' }).fetchAsync(); // [!code highlight] This will work in the server +const doc = await MyCollection.findOneAsync({ _id: '123' }); // [!code highlight] This will work in the server + +``` + +## CLI + +The `--vue2` flag is no longer available. We droped support for vue2. +You can see more information in this [PR](https://github.com/meteor/meteor/pull/13065). + +#### Why? + +This was decided because vue2 reached its [end of life](https://v2.vuejs.org/lts/#:~:text=Vue%202%20will%20reach%20End%20of%20Life%20(EOL)%20on%20December%2031st%2C%202023.%20After%20that%20date%2C%20Vue%202%20will%20continue%20to%20be%20available%20in%20all%20existing%20distribution%20channels%20(CDNs%20and%20package%20managers)%2C%20but%20will%20no%20longer%20receive%20updates%2C%20including%20security%20and%20browser%20compatibility%20fixes.) +on 2023-12-31, the team decided to drop support for it. + + +## Node v20 + +Meteor 3.0 is now using Node v20. This means that if you have any dependencies or usages +of Node v14, you will need to update them to be compatible with Node v20. + + +## NPM Installer Update + +The npm installer for Meteor has been changed. For the official release, you can install Meteor with this command: + +```bash +npx meteor +``` + +While we’re in the Release Candidate phase, use: + +```bash +npx meteor@rc +``` + +or specify a version directly: + +```bash +npx meteor@ +``` + +Ensure you're using Node version 20.0.0 or higher, especially in your CI/CD workflows, to be compatible with the latest Meteor version. + + +## Call x CallAsync + +::: tip + +You can check [call x callAsync](./call-x-callAsync.md) page for a full overview. + +::: + +Due to how meteor now works with `async/await`, you should use `callAsync` instead of `call` in your methods. + +In Meteor 2.x this was a common pattern: + +```js +import { Meteor } from 'meteor/meteor' + +Meteor.methods({ + async getAllData() { + return await MyCollection.find().fetch(); // [!code error] + }, + async otherMethod() { + return await MyCollection.find().fetch(); // [!code error] + } +}); + + +Meteor.call('getAllData') // [!code error] +Meteor.call('otherMethod') // [!code error] + + +``` + +Now in Meteor 3.x it should become: + +```js +import { Meteor } from 'meteor/meteor' + +Meteor.methods({ + async getAllData() { + return await MyCollection.find().fetchAsync(); // [!code highlight] + }, + async otherMethod() { + return await MyCollection.find().fetchAsync(); // [!code highlight] + } +}); + +await Meteor.callAsync('getAllData') // [!code highlight] +await Meteor.callAsync('otherMethod') // [!code highlight] + +``` + +## WebApp Switches to Express + +::: tip + +WebApp has switched to Express from Connect. This upgrade lets you use all the Express features in your Meteor app. +If you've customized the WebApp package before, please verify if those customizations work with Express. + +::: + +The `webapp` package now exports these new properties: + +```ts +type ExpressModule = { + (): express.Application; + json: typeof express.json; + raw: typeof express.raw; + Router: typeof express.Router; + static: typeof express.static; + text: typeof express.text; + urlencoded: typeof express.urlencoded; +}; + +export declare module WebApp { + // ... + /** + * @deprecated use handlers instead + */ + var connectHandlers: express.Application; + var handlers: express.Application; // [!code highlight] + /** + * @deprecated use rawHandlers instead + */ + var rawConnectHandlers: express.Application; + var rawHandlers: express.Application; + var httpServer: http.Server; + var expressApp: express.Application; + var express: ExpressModule; // [!code highlight] + // ... +} + +// import { WebApp } from 'meteor/webapp'; +``` + +### Routes with WebApp and Express + +To add Express routes in your app, check out the [Express Guide](https://expressjs.com/en/guide/routing.html) and follow this example: + +```js +import { WebApp } from 'meteor/webapp'; + +const app = WebApp.express(); // [!code highlight] you can use as a normal express app + +app.get('/hello', (req, res) => { + res.send('Hello World'); +}); + +WebApp.handlers.use(express); + +``` + +The code below is an example of how you can use the `handlers` property to create a route in your app: + +```js +import { WebApp } from 'meteor/webapp'; + +WebApp.handlers.get('/hello', (req, res) => { + res.send('Hello World'); +}); +``` + +### Middlewares with WebApp and Express + +To include **Router-level** Express middleware in your app, check out the [Express Guide](https://expressjs.com/en/guide/using-middleware.html#middleware.router) and follow this example: + +```js +import { WebApp } from 'meteor/webapp'; + +const app = WebApp.express(); +const router = WebApp.express.Router(); + +// This middleware is executed every time the app receives a request +router.use((req, res, next) => { + console.log('Router-level - Time:', Date.now()); + next(); +}) + +// This middleware shows request info for any type of HTTP request to the /hello/:name path +router.use('/hello/:name', (req, res, next) => { + console.log('Router-level - Request URL:', req.originalUrl); + next(); +}, (req, res, next) => { + console.log('Router-level - Request Type:', req.method); + next(); +}) + +// mount the router on the app +app.use('/', router); + +WebApp.handlers.use(app); +``` + +To include **Application-level** Express middleware in your app, check out the [Express Guide](https://expressjs.com/en/guide/using-middleware.html#middleware.application) and follow this example: + +```js +import { WebApp } from 'meteor/webapp'; + +const app = WebApp.express(); +const router = WebApp.express.Router() + +// This middleware is executed every time the app receives a request +router.use((req, res, next) => { + console.log('Router-level - Time:', Date.now()); + next(); +}) + +// This middleware shows request info for any type of HTTP request to the /hello/:name path +router.use('/hello/:name', (req, res, next) => { + console.log('Router-level - Request URL:', req.originalUrl); + next(); +}, (req, res, next) => { + console.log('Router-level - Request Type:', req.method); + next(); +}) + +// mount the router on the app +app.use('/', router); + +WebApp.handlers.use(app); +``` + +### New API Names + +Having switched from Connect to Express, we updated API names to align with Express. See the details below: + - `WebApp.connectHandlers.use(middleware)` is now `WebApp.handlers.use(middleware)` + - `WebApp.rawConnectHandlers.use(middleware)` is now `WebApp.rawHandlers.use(middleware)` + - `WebApp.connectApp` is now `WebApp.expressApp` + + +A few methods from WebApp internals are now async: + + - `WebAppInternals.reloadClientPrograms()` + - `WebAppInternals.pauseClient()` + - `WebAppInternals.generateClientProgram()` + - `WebAppInternals.generateBoilerplate()` + - `WebAppInternals.setInlineScriptsAllowed()` + - `WebAppInternals.enableSubresourceIntegrity()` + - `WebAppInternals.setBundledJsCssUrlRewriteHook()` + - `WebAppInternals.setBundledJsCssPrefix()` + - `WebAppInternals.getBoilerplate` + +## Meteor.userAsync + +You should use `Meteor.userAsync` instead of `Meteor.user` in your code, especially if you +want isomorphism or want to get your user in the server. + +```js +// Before +const user = Meteor.user(); // [!code error] +// After +const user = await Meteor.userAsync(); // [!code highlight] + +``` + diff --git a/v3-docs/v3-migration-docs/breaking-changes/upgrading-packages.md b/v3-docs/v3-migration-docs/breaking-changes/upgrading-packages.md new file mode 100644 index 00000000000..feb240768ba --- /dev/null +++ b/v3-docs/v3-migration-docs/breaking-changes/upgrading-packages.md @@ -0,0 +1,86 @@ +# Upgrading packages + + +## Client + +For the packages that are client only +or that are do not using Meteor packages that will become async +or are already using `async` & `await` pattern. + +The migration will look like this: + +```js +// in you package.js +Package.onUse((api) => { + api.versionsFrom(['1.10', '2.3', '3.0-rc.2']); + // ^^^^^^^ for testing your package with meteor 3.0 + + api.versionsFrom(['1.10', '2.3', '3.0']); + // ^^^^^^^ for meteor 3.0 +}); +``` +Then you can publish your package and test it with Meteor 3.0, by running `meteor publish`. + + +## Changes for packages that do not use Meteor packages that had breaking change + +Similar to what happens with client-only packages, +if your package is not using Meteor packages that had breaking changes, +you can update your package to be compatible with Meteor 3.0 +by adding the following line to your `package.js`: + +```js +// in you package.js +Package.onUse((api) => { + api.versionsFrom(['1.10', '2.3', '3.0-rc.2']); + // ^^^^^^^ for testing your package with meteor 3.0 + + api.versionsFrom(['1.10', '2.3', '3.0']); + // ^^^^^^^ for meteor 3.0 +}); +``` + +For example, we have `mdg:seo` where we just needed to add the line above to make it +compatible with Meteor 3.0. +You can see the [commit](https://github.com/meteor/galaxy-seo-package/commit/8a30b32688df40e62ce434475dd3ee931dedf2b3). + + +## Testing packages in Meteor 3.0 + +It is known that some packages that are testing the beta changes are not being installed by correctly, +when using a tag in their version, like this one: `version: '2.0.0-beta300.6',` to be sure that you are getting the correct version +you can run `meteor add @` to install the package with the correct version, instead of the `meteor add `. + + +## Server + +If in your package you are using Meteor packages that will become async, +you will need to migrate your package to use `async` & `await` pattern. + +For concrete examples you can check a few examples of packages that have been in the works +of migrating to Meteor 3.0: + +- [`quave:migrations`](https://github.com/quavedev/meteor-migrations/pull/1) +- [`percolate:synced-cron`](https://github.com/percolatestudio/meteor-synced-cron/pull/149) +- [`react-meteor-accounts`](https://github.com/meteor/react-packages/commit/96313a1afcc41ef9a23c7496470b375e7d357793) +- [`mdg:seo`](https://github.com/meteor/galaxy-seo-package/commit/8a30b32688df40e62ce434475dd3ee931dedf2b3) + +You can follow a more in depth guide on how to migrate your package to be compatible with Meteor 3.0 [here](https://guide.meteor.com/prepare-meteor-3.0#Changes-for-packages). + +## Maintaining compatibility with Meteor 2.x + +You can use the [`Meteor.isFibersDisabled`](https://github.com/meteor/meteor/blob/6ac474627a4d2536090484eb95e7c021370aaefe/packages/meteor/asl-helpers-client.js#L1-L8) property to check if the current Meteor version +is using Fibers or not. In all releases before Meteor 3.0 this property will be `falsy`(`undefined`). +In Meteor 3.0 this property will be return `true`. + +Which means that you can have a code like this, in your package: + +```js + +if (Meteor.isFibersDisabled) { + // Meteor 3.0 +} else { + // Meteor 2.x +} + +``` diff --git a/v3-docs/v3-migration-docs/frequently-asked-questions/index.md b/v3-docs/v3-migration-docs/frequently-asked-questions/index.md new file mode 100644 index 00000000000..4dc8e753f6d --- /dev/null +++ b/v3-docs/v3-migration-docs/frequently-asked-questions/index.md @@ -0,0 +1,117 @@ +# Frequently Asked Questions + +## What is Fibers? + +Meteor was designed at a time when callback hell was a development issue, so the team decided it at the time +to use [fibers](https://en.wikipedia.org/wiki/Fiber_(computer_science)) (coroutines) to make building applications much more straightforward with synchronous-looking code. +The Meteor fibers implementation is based on [node-fibers](https://github.com/laverdet/node-fibers), which is no longer supported as of NodeJS v16.0.0. + +The main reason for this migration is to remove the dependency on fibers and make Meteor +compatible with the latest versions of Node.js. + +For more information about fibers, you can check this [talk](https://www.youtube.com/watch?v=bxaOGDqVPKw) +from Ben Newman and this Stack Overflow [answer](https://stackoverflow.com/a/40865153/6688795). + +## What is the Meteor v3 release schedule? + +Our current plan is to release Meteor v3 until Q2 2024. This is subject to change as we progress through the development of Meteor v3. + +## Will MongoDB Collection Methods be removed from the client? + +No, we will not remove any MongoDB collection method from the client. + +On the client side, all can remain the same. You can use both sync and async methods. +All should continue working as they are. + +For example: + +```js + +// 2.x in the client side + +const docs = MyCollection.find({ _id: '123' }).fetch(); + +// v3.0 in the client side + +const docs = MyCollection.find({ _id: '123' }).fetch(); + +``` +No changes are necessary. If you want to use the async methods to maintain isomorphic code, you can do it like this: + +```js + +// 2.x in the client side + +const docs = MyCollection.find({ _id: '123' }).fetch(); + +// v3.0 in the client side, this will work anywhere + +const docs = await MyCollection.find({ _id: '123' }).fetchAsync(); + +``` + +## Will MongoDB Collection Methods be removed from the server? {#mongo-methods-server} + +_Yes_, we will remove those MongoDB collection methods that do not end with `*Async`. + +You can only use the methods with the `*Async` suffix on the server side. + +For example: + +```js +// 2.x in the server side + +Meteor.methods({ + myMethod() { + const doc = MyCollection.findOne({ _id: '123' }); + } +}); + + +// v3.0 in the server side + +Meteor.methods({ + async myMethod() { + const doc = await MyCollection.findOneAsync({ _id: '123' }); + } +}); +``` + +Methods that will be _only_ available in the *client* are: +-`findOne`; +-`insert`; +-`remove`; +-`update`; +-`upsert`; + +If you leave any code using one of these methods in the server side, you will get an error, +like this one below: + +```bash +findOne is not available on the server. Please use findOneAsync instead. +``` + +## When will React packages for Meteor be ready for version 3.0? + +We consider React packages to be ready. +You can check more information on the [react page](../front-end/react.md). + +## When will Blaze be ready for version 3.0? + +The team considered Blaze adjustments to version 3.0 done, version 2.9 and upper are with all features regarding async APIs. + +You can check more information on the [Blaze page](../front-end/blaze.md). + +## When will XYZ package be ready for version 3.0? + +Meteor core packages are the responsibility of Meteor Software and are all being migrated. +If you encounter issues with any of them, let us know, please [open an issue](https://github.com/meteor/meteor/issues/new/choose) in our [repo](https://github.com/meteor/meteor). + +This is the [list of all core packages](https://docs.meteor.com/packages/packages-listing.html). + +For those packages that are not in the core but are maintained by the [community](https://github.com/Meteor-Community-Packages), +we hope that the community can work on them, but if for some reason that is not possible, +you can always ping us on [Slack](https://join.slack.com/t/meteor-community/shared_invite/zt-28aru814j-AwswQGt2D1xIXurvmtJvug) or in the [Forums](https://forums.meteor.com/). + +Following the official release of Meteor 3.0, we plan to add new packages to the core and migrating them to Meteor 3.0. + diff --git a/v3-docs/v3-migration-docs/front-end/blaze.md b/v3-docs/v3-migration-docs/front-end/blaze.md new file mode 100644 index 00000000000..6bfa9e1168a --- /dev/null +++ b/v3-docs/v3-migration-docs/front-end/blaze.md @@ -0,0 +1,163 @@ +# Blaze Changes + +:::tip + +It is important to note that migrating your front-end code to async is unnecessary. +You can still use the sync MongoDB methods on the client side, +for example: `Collection.fetch`/`Collection.findOne`. + +::: + +It is important to note that migrating your front-end code to async is unnecessary. +You can still use the sync methods on the client side. + +But to maintain isomorphic code, you can use the async methods on the client side. + +Since this [PR](https://github.com/meteor/blaze/pull/413) was released with Blaze 2.7. Blaze supports async in their views. + +You can check the [Blaze docs](https://www.blazejs.org/api/spacebars#Async-states) for +more information on how to handle async states. + +[@radekmie](https://github.com/radekmie) made two great posts about making Blaze async. Both are worth reading: + - [On Asynchronicity in Blaze](https://radekmie.dev/blog/on-asynchronicity-in-blaze/); + - [On Asynchronicity in Blaze (again)](https://radekmie.dev/blog/on-asynchronicity-in-blaze-again/); + + +Below you can check some examples of how to use async in Blaze, docs for this api are [here](https://www.blazejs.org/api/spacebars#Async-states) + +## Simple example with states + +::: code-group + +```handlebars [profile.html] +{{#let name=getNameAsynchronously}} + {{#if @pending 'name'}} + We are fetching your name... + {{/if}} + {{#if @rejected 'name'}} + Sorry, an error occured! + {{/if}} + {{#if @resolved 'name'}} + Hi, {{name}}! + {{/if}} +{{/let}} +``` + +```js [profile.js] +Template.profile.helpers({ + getNameAsynchronously() { + return Meteor.callAsync("getName"); + } +}); +``` + +::: + +## Example with async lists + +You can use let to handle async state while loading and iterating lists: + +::: code-group + +```handlebars [user_list.html] + +{{#let users=getUsersAsync}} + {{#if @pending 'users'}} + We are fetching your list... + {{/if}} + {{#if @rejected 'users'}} + Sorry, an error occured! + {{/if}} + {{if @resolved 'users'}} + {{#each user in users}} + Hi {{user.name}}! + {{/each}} + {{/if}} +{{/let}} + +``` + +```js [user_list.js] + +Template.user_list.helpers({ + getUsersAsync() { + return Meteor.callAsync("getUsers"); // returns a Promise + } +}); + + +``` +::: + +If you just want to iterate and if there is nothing to show, you can use `else`: + +::: code-group + +```handlebars [profile.html] +{{#each user in getUsersAsync}} + {{user}}. +{{else}} + Pending, rejected, or resolved and empty. +{{/if}} +``` + +```js [profile.js] + +Template.profile.helpers({ + getUsersAsync() { + return Meteor.callAsync("getUsers"); // returns a Promise + } +}); + +``` + +::: + +## Example with async `if` and `unless` + +For handling with falsy or truthy values, you can use `if` and `unless`, +note that it will not render anything until it resolves the promise: + +::: code-group + +```handlebars [profile.html] +{{#if isOkAsync}} + Resolved and truthy. +{{else}} + Resolved and falsy. +{{/if}} +``` + +```js [profile.js] + +Template.profile.helpers({ + isOkAsync() { + return Meteor.callAsync("condition"); // returns a Promise + } +}); + +``` +::: + +Same goes for `unless`: + +::: code-group + +```handlebars [profile.html] +{{#unless isOkAsync}} + Resolved and falsy. +{{else}} + Resolved and truthy. +{{/unless}} +``` + +```js [profile.js] + +Template.profile.helpers({ + isOkAsync() { + return Meteor.callAsync("condition"); // returns a Promise + } +}); + +``` +::: diff --git a/v3-docs/v3-migration-docs/front-end/react.md b/v3-docs/v3-migration-docs/front-end/react.md new file mode 100644 index 00000000000..72d1b74ed72 --- /dev/null +++ b/v3-docs/v3-migration-docs/front-end/react.md @@ -0,0 +1,61 @@ +# React Changes + +:::tip + +It is important to note that migrating your front-end code to async is unnecessary. +You can still use the sync MongoDB methods on the client side, +for example: `Collection.fetch`/`Collection.findOne`. + +::: + +But to maintain isomorphic code, you can use the async methods on the client side. + +In those cases, we have implemented `suspense` version of hooks so that you can use the async methods. + +For example: + +```jsx + +// you can write like this: + +import { useTracker, useSubscribe } from 'meteor/react-meteor-data' +function Tasks() { + const isLoading = useSubscribe("tasks"); + const { username } = useTracker(() => Meteor.user()) + const tasksByUser = useTracker(() => + TasksCollection.find({username}, { sort: { createdAt: -1 } }).fetch() + ); + + + if (isLoading()) { + return + } + + // render the tasks +} + +``` + +In Meteor 3.x you can write like this: + +```jsx + +import { useTracker, useSubscribe } from 'meteor/react-meteor-data/suspense' +function Tasks() { // this component will suspend + useSubscribe("tasks"); + const { username } = useTracker("user", () => Meteor.userAsync()) + const tasksByUser = useTracker("tasksByUser", () => + TasksCollection.find({username}, { sort: { createdAt: -1 } }).fetchAsync() + ); + + + // render the tasks +} + +``` + +`useFind` in the client will remain the same. + +You can check the [react-meteor-data docs](https://github.com/meteor/react-packages/tree/master/packages/react-meteor-data) for more information +and these blog posts [part 1](https://dev.to/grubba/making-promises-suspendable-452f) [part 2](https://dev.to/grubba/new-suspense-hooks-for-meteor-3ddg) for a in-depth look on how we made those changes. + diff --git a/v3-docs/v3-migration-docs/index.md b/v3-docs/v3-migration-docs/index.md new file mode 100644 index 00000000000..b558c4b6414 --- /dev/null +++ b/v3-docs/v3-migration-docs/index.md @@ -0,0 +1,84 @@ +# Meteor 3.0 Migration Guide + +:::info You are reading the migration guide for Meteor 3! + +This is a live document which will be updated as development progresses. +::: + +This guide is for users with Meteor 2.x projects understand the changes between Meteor 2.x and Meteor 3.0. It's not required to read this guide before starting with Meteor 3.0. To learn Meteor 3.0, we recommend reading the [new documentation](https://v3-docs.meteor.com). + +## What's the status of version 3.0? + +Meteor 3.0 is currently in its Release Candidate (RC) phase, a nearly final version ready for final testing ahead of the official launch. + +**Latest version:** `3.0-rc.2`
+**Node.js version:** `20.12.2 LTS`
+**NPM version:** `10.5.0` + +## How to try Meteor 3.0? + +You can create a new Meteor 3.0 project by running the command below: + +```bash +meteor create my-new-project --release 3.0-rc.2 +``` + +## How to upgrade from Meteor 2.x? + +You can upgrade your Meteor 2.x project by running the command below inside your project folder: + +```bash +meteor update --release 3.0-rc.2 +meteor reset #resets local DB and project to a fresh state +``` + +Also, it's a good idea to completely remove `node_modules` and the `package-lock.json` before running `meteor npm install`: + +```bash +rm -rf node_modules package-lock.json +meteor npm install +``` + +Which will install the necessary packages using the latest Node.js version from Meteor 3. + +## What this guide will cover? + +This guide covers the necessary topics for migrating your application from Meteor 2.x to Meteor 3.0, including: + +- [Frequently Asked Questions](./frequently-asked-questions/index.md), answers to common questions. +- [Breaking Changes](./breaking-changes/index.md), an overview of the changes that will affect your application. + - [Meteor.call x Meteor.callAsync](./breaking-changes/call-x-callAsync.md), why should you change your methods to use `Async` methods. + - [Upgrading packages](./breaking-changes/upgrading-packages.md), how to upgrade your packages to the be compatible with Meteor v3. + +- [How async functions work and how to use them](./api/async-functions.md), a how-to guide in how to use async functions and helpers for Meteor. +- [Renamed Functions](./api/renamed-functions.md), a list of functions that were renamed in Meteor v3. +- [Removed Functions](./api/removed-functions.md), a list of functions that were removed in Meteor v3. + +- [React in Meteor v3](./front-end/react.md), how to migrate your React code to Meteor v3. +- [Blaze in Meteor v3](./front-end/blaze.md), how to migrate your Blaze code to Meteor v3. + +- [Migrating to Async in Meteor 2.x](migrating-to-async-in-v2/index.md), how can you migrate your application to Meteor v3 while in 2.x. + +## External Resources + +We are aware of these articles and guides to assist with your migration: + + - [Prepare your Meteor.js project for the big 3.0 release](https://dev.to/jankapunkt/prepare-your-meteorjs-project-for-the-big-30-release-14bf) + - [Gradually upgrading a Meteor.js project to 3.0](https://dev.to/meteor/gradually-upgrading-a-meteorjs-project-to-30-5aj0) + - [Meteor 3.0 Migration Guide, from Daniel](https://docs.google.com/document/d/1XxHE5MQaS0-85HQ-bkiXxmGlYi41ggkX3F-9Rjb9HhE/edit#heading=h.65xi3waq9bb) + - [Illustreets Migration Guide, large SaaS migrated to 3.0](https://forums.meteor.com/t/large-saas-migrated-to-3-0/61113) & their how-to [post](https://forums.meteor.com/t/meteor-3-0-beta-6-is-out/61277/12) + +### Videos + +Migrating apps to Meteor 3.0: +- TicTacToe & others: [YouTube](https://www.youtube.com/watch?v=MtStd0aeyQA) +- Complex Svelte todo list & others: [YouTube](https://www.youtube.com/watch?v=-XW8xwSk-zU) +- Meteor University with v3 + - part 1: [YouTube](https://www.youtube.com/watch?v=WbwHv-aoGlU) + - part 2: [YouTube](https://www.youtube.com/watch?v=PB2M16fmloM) + - part 3: [YouTube](https://www.youtube.com/watch?v=79ytCgZQfSU) + - part 4: [YouTube](https://www.youtube.com/watch?v=InNCy0duKak) + +--- + +If you have a migration guide, either in video or text format, please share it with us to include here. diff --git a/v3-docs/v3-migration-docs/markdown-examples.md b/v3-docs/v3-migration-docs/markdown-examples.md new file mode 100644 index 00000000000..8e55eb8add1 --- /dev/null +++ b/v3-docs/v3-migration-docs/markdown-examples.md @@ -0,0 +1,85 @@ +# Markdown Extension Examples + +This page demonstrates some of the built-in markdown extensions provided by VitePress. + +## Syntax Highlighting + +VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting: + +**Input** + +```` +```js{4} +export default { + data () { + return { + msg: 'Highlighted!' + } + } +} +``` +```` + +**Output** + +```js{4} +export default { + data () { + return { + msg: 'Highlighted!' + } + } +} +``` + +## Custom Containers + +**Input** + +```md +::: info +This is an info box. +::: + +::: tip +This is a tip. +::: + +::: warning +This is a warning. +::: + +::: danger +This is a dangerous warning. +::: + +::: details +This is a details block. +::: +``` + +**Output** + +::: info +This is an info box. +::: + +::: tip +This is a tip. +::: + +::: warning +This is a warning. +::: + +::: danger +This is a dangerous warning. +::: + +::: details +This is a details block. +::: + +## More + +Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown). diff --git a/v3-docs/v3-migration-docs/migrating-to-async-in-v2/index.md b/v3-docs/v3-migration-docs/migrating-to-async-in-v2/index.md new file mode 100644 index 00000000000..8d01fd41cc2 --- /dev/null +++ b/v3-docs/v3-migration-docs/migrating-to-async-in-v2/index.md @@ -0,0 +1,112 @@ +# Migrating to Async in Meteor 2.x + +In Meteor 3.0, we're transitioning from using Fibers to asynchronous methods and operations, aligning with community standards. While Fibers, our promise solution, was used in version 2.x, it's not supported from Node 16 onwards. We are now adopting `async` and `await` for better compatibility. + +## Prerequisites + +### Use at least Meteor version 2.8 + +We recommend starting the async migration by updating your application to 2.8 or newer, +as you can do this progressively. Unlike 3.0, +you can simultaneously maintain the same codebase with the new asynchronous and +old synchronous behaviors. Ideally, you should update to the latest version of Meteor 2.x +and carefully follow each changelog. After you refactor all your code to async in version 2.x, +you can more easily update it to version 3.0. + +to check what version you are using, you can run: + +```bash +meteor --version +``` + +You should see something like this: + +```bash +meteor --version +Meteor +``` + +## API changes + +If in server-side you should focus on migrating and changing your APIs to use `async` and `await` pattern. + +Here is a list of the most common APIs that you should change: + +Mongo.Collection: +- `findOneAsync` +- `insertAsync` +- `removeAsync` +- `updateAsync` +- `upsertAsync` + +Collection.Cursor: +- `countAsync` +- `fetchAsync` +- `forEachAsync` +- `mapAsync` + +accounts-base: +- `Meteor.userAsync()` + +callback-hook:forEachAsync +- `forEachAsync` + +ddp-server +- `Meteor.callAsync()` + + +## Jscodeshift/codemod + +One of our community members [minhna](https://github.com/minhna) has created this awesome +[repo](https://github.com/minhna/meteor-async-migration) for you to migrate your codebase to async. +it uses [jscodeshift/codemod](https://www.sitepoint.com/getting-started-with-codemods/) to help you migrate your codebase to async. + +The project has documentation explaining how to run the script. +This codemod should only affect the server side of your application. +Starting the update from the front end or back end is a personal choice. +While starting from the server side is a valid approach, it is essential to evaluate whether migrating features one by one might be a better strategy. +This way, you can resolve errors incrementally and avoid the risk of encountering multiple client-side issues that could break the entire application. + + +A helpful feature of the script is that it will refactor some methods to async, +such as `findOne`, `count`, and other methods from the `accounts-base` package, such as `Meteor.user()`, +and also the function that calls these methods by adding an `async` before them. + +### Edge cases + +Depending on your codebase, the codemod may not work in some specific scenarios. We’ll list some edge case examples, and if this is the case for your codebase, +you’ll need to make the changes manually or refactor the codemod. + +### MongoDB Methods from outside packages + +A possible edge case is if you are defining your MongoDB collection using the `meteor/quave:collections` package, +the codemod will check if it is a MongoDB collection by checking the form of the imports - this +means that when the script reads the import coming from `quave`, it will not consider this to be a MongoDB collection. + +Having this issue might require you to manually refactor the code or adjust the codemod to consider this specific case. + +### How to identify edge cases + +Since it now only affects the server side, after refactoring, you can run your application, +observe the errors that will occur in your terminal, +and fix them progressively. After refactoring the server side to async, +your application will run without errors, and then you can move to the client side. + +It is recommended to run your tests after each refactoring to ensure that everything is working as expected. + +Also if possible migrate one module of your application at a time, this way you can test and ensure that everything is working as expected. + + +## Front-end + +For migrating the front-end, you can follow the guide based in your framework: + +- [React](../front-end/react.md) +- [Blaze](../front-end/blaze.md) + + +## Packages + +If you have packages that you are using in your application, you should check if they are compatible with Meteor 3.0. + +If you own packages, you can check our migration guide for packages [here](../breaking-changes/upgrading-packages.md). diff --git a/v3-docs/v3-migration-docs/package-lock.json b/v3-docs/v3-migration-docs/package-lock.json new file mode 100644 index 00000000000..e0cc9531e25 --- /dev/null +++ b/v3-docs/v3-migration-docs/package-lock.json @@ -0,0 +1,2043 @@ +{ + "name": "guide-3.0", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "guide-3.0", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "vitepress": "1.0.0-rc.31" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz", + "integrity": "sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.20.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz", + "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz", + "integrity": "sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.20.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.20.0.tgz", + "integrity": "sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.20.0.tgz", + "integrity": "sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.20.0.tgz", + "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.20.0.tgz", + "integrity": "sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz", + "integrity": "sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz", + "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.20.0.tgz", + "integrity": "sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.20.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz", + "integrity": "sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.20.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz", + "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz", + "integrity": "sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.20.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.20.0.tgz", + "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.20.0", + "@algolia/logger-common": "4.20.0", + "@algolia/requester-common": "4.20.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", + "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.2.tgz", + "integrity": "sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.5.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", + "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.2", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", + "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "dev": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "dev": true + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", + "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", + "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==", + "dev": true + }, + "node_modules/@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "dev": true, + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "dev": true, + "dependencies": { + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", + "dev": true, + "dependencies": { + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz", + "integrity": "sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.20.0", + "@algolia/cache-common": "4.20.0", + "@algolia/cache-in-memory": "4.20.0", + "@algolia/client-account": "4.20.0", + "@algolia/client-analytics": "4.20.0", + "@algolia/client-common": "4.20.0", + "@algolia/client-personalization": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/logger-common": "4.20.0", + "@algolia/logger-console": "4.20.0", + "@algolia/requester-browser-xhr": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/requester-node-http": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "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==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", + "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^9.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.19.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.2.tgz", + "integrity": "sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/property-information": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.11.0.tgz", + "integrity": "sha512-Uin2J8Bpm3xaZi9Y8QibSys6uJOFZ+REMrf42v20AA3FUDUrshKkMEP6liJbMAHCm71wO6ls4mwAf7a3gFVxLw==", + "dev": true, + "peer": true + }, + "node_modules/shikiji": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/shikiji/-/shikiji-0.7.6.tgz", + "integrity": "sha512-KzEtvSGQtBvfwVIB70kOmIfl/5rz1LC8j+tvlHXsJKAIdONNQvG1at7ivUUq3xUctqgO6fsO3AGomUSh0F+wsQ==", + "dev": true, + "dependencies": { + "hast-util-to-html": "^9.0.0" + } + }, + "node_modules/shikiji-transformers": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/shikiji-transformers/-/shikiji-transformers-0.7.6.tgz", + "integrity": "sha512-yTp+7JMD/aXbV9ndn14eo9IK/UNt8iDsLNyqlOmCtcldlkqWE9T2YKAlOHOTVaeDfYWUWZa2EgSXb/CBfepBrw==", + "dev": true, + "dependencies": { + "shikiji": "0.7.6" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.0.0-rc.31", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.31.tgz", + "integrity": "sha512-ikH9pIjOOAbyoYAGBVfTz8TzuXp+UoWaIRMU4bw/oiTg8R65SbAaGKY84xx6TuL+f4VqUJ8lhzW82YyxSLvstA==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.5.2", + "@docsearch/js": "^3.5.2", + "@types/markdown-it": "^13.0.7", + "@vitejs/plugin-vue": "^4.5.0", + "@vue/devtools-api": "^6.5.1", + "@vueuse/core": "^10.6.1", + "@vueuse/integrations": "^10.6.1", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "mrmime": "^1.0.1", + "shikiji": "^0.7.4", + "shikiji-transformers": "^0.7.4", + "vite": "^5.0.2", + "vue": "^3.3.8" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4.3.2", + "postcss": "^8.4.31" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/v3-docs/v3-migration-docs/package.json b/v3-docs/v3-migration-docs/package.json new file mode 100644 index 00000000000..5420db1d2c4 --- /dev/null +++ b/v3-docs/v3-migration-docs/package.json @@ -0,0 +1,25 @@ +{ + "name": "guide-3.0", + "version": "1.0.0", + "description": "Meteor 3.0 guide", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/meteor/meteor.git" + }, + "author": "Vitor S. Almeida", + "license": "ISC", + "bugs": { + "url": "https://github.com/meteor/meteor/issues" + }, + "homepage": "https://github.com/meteor/meteor#readme", + "devDependencies": { + "vitepress": "1.0.0-rc.31" + } +} diff --git a/v3-docs/v3-migration-docs/public/logo.png b/v3-docs/v3-migration-docs/public/logo.png new file mode 100644 index 00000000000..c3335379817 Binary files /dev/null and b/v3-docs/v3-migration-docs/public/logo.png differ diff --git a/v3-docs/v3-migration-docs/public/meteor-blue.png b/v3-docs/v3-migration-docs/public/meteor-blue.png new file mode 100644 index 00000000000..c91f7a97180 Binary files /dev/null and b/v3-docs/v3-migration-docs/public/meteor-blue.png differ diff --git a/v3-docs/v3-migration-docs/public/meteor-logo.png b/v3-docs/v3-migration-docs/public/meteor-logo.png new file mode 100644 index 00000000000..ca7bb89de55 Binary files /dev/null and b/v3-docs/v3-migration-docs/public/meteor-logo.png differ diff --git a/v3-docs/v3-migration-docs/public/meteor.png b/v3-docs/v3-migration-docs/public/meteor.png new file mode 100644 index 00000000000..5ccc82d1389 Binary files /dev/null and b/v3-docs/v3-migration-docs/public/meteor.png differ diff --git a/v3-docs/v3-migration-docs/public/openssl-suport-table.png b/v3-docs/v3-migration-docs/public/openssl-suport-table.png new file mode 100644 index 00000000000..97a6bb11dc7 Binary files /dev/null and b/v3-docs/v3-migration-docs/public/openssl-suport-table.png differ diff --git a/v3-docs/v3-migration-docs/typescript/meteor-types.md b/v3-docs/v3-migration-docs/typescript/meteor-types.md new file mode 100644 index 00000000000..97c80d50436 --- /dev/null +++ b/v3-docs/v3-migration-docs/typescript/meteor-types.md @@ -0,0 +1,24 @@ +# Types for Meteor 3 + +In order to get types working in your Meteor 3 project, you will need to add the following package: + +```bash +meteor add zodern:types +``` + +Also, to get types for Meteor core packages working in your IDE, you need to have a valid `tsconfig.json` file in your project root, including the following: + +```json +{ + "compilerOptions": { + "preserveSymlinks": true, + "paths": { + "meteor/*": [ + ".meteor/local/types/packages.d.ts" + ] + } + } +} +``` + +You can learn more about the `zodern:types` package [here](https://github.com/zodern/meteor-types). \ No newline at end of file