diff --git a/.circleci/config.yml b/.circleci/config.yml index a6f3115764..b16af59e01 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -111,8 +111,8 @@ jobs: command: (git submodule sync && git submodule update --init --recursive) || (rm -fr .git/config .git/modules && git submodule deinit -f . && git submodule update --init --recursive) - restore_cache: keys: - - v1-dev-bundle-cache-{{ checksum "meteor" }} - - v1-dev-bundle-cache- + - v3-dev-bundle-cache-{{ checksum "meteor" }} + - v3-dev-bundle-cache- - run: name: Combine NPM Shrinkwrap Files command: | @@ -120,21 +120,21 @@ jobs: for d in packages/*/.npm/plugin/*; do cat $d/npm-shrinkwrap.json >> shrinkwraps.txt; done - restore_cache: keys: - - package-npm-deps-cache-group1-v1-{{ checksum "shrinkwraps.txt" }} - - package-npm-deps-cache-group1-v1- + - package-npm-deps-cache-group1-v3-{{ checksum "shrinkwraps.txt" }} + - package-npm-deps-cache-group1-v3- - restore_cache: keys: - - package-npm-deps-cache-group2-v3-{{ checksum "shrinkwraps.txt" }} - - package-npm-deps-cache-group2-v3- + - package-npm-deps-cache-group2-v5-{{ checksum "shrinkwraps.txt" }} + - package-npm-deps-cache-group2-v5- - restore_cache: keys: - - v5-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-{{ .Revision }} - - v5-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}- - - v5-other-deps-cache-{{ .Branch }}- + - v7-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-{{ .Revision }} + - v7-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}- + - v7-other-deps-cache-{{ .Branch }}- - restore_cache: keys: - - v1-test-groups-{{ .Branch }} - - v1-test-groups- + - v4-test-groups-{{ .Branch }} + - v4-test-groups- - run: name: Create Test Results Directory command: | @@ -149,8 +149,9 @@ jobs: command: | eval $PRE_TEST_COMMANDS; pushd tools + npm install @types/node --save-dev # Ensure that meteor/tools has no TypeScript errors. - ../meteor npx tsc --noEmit + ../meteor npx tsc --noEmit --skipLibCheck popd ./meteor --get-ready # shouldn't take longer than 60 minutes @@ -706,14 +707,14 @@ jobs: - ./tmp/test-groups when: on_success - save_cache: - key: v1-dev-bundle-cache-{{ checksum "meteor" }} + key: v3-dev-bundle-cache-{{ checksum "meteor" }} paths: - "dev_bundle" # The package npm dependencies are split into two caches to avoid an AWS # `MetadataTooLarge` error that consistently appears if we put all of # these folders in the same cache - save_cache: - key: package-npm-deps-cache-group1-v1-{{ checksum "shrinkwraps.txt" }} + key: package-npm-deps-cache-group1-v3-{{ checksum "shrinkwraps.txt" }} paths: - packages/meteor/.npm/package/node_modules - packages/modules-runtime/.npm/package/node_modules @@ -729,7 +730,7 @@ jobs: - packages/package-version-parser/.npm/package/node_modules - packages/boilerplate-generator/.npm/package/node_modules - save_cache: - key: package-npm-deps-cache-group2-v3-{{ checksum "shrinkwraps.txt" }} + key: package-npm-deps-cache-group2-v5-{{ checksum "shrinkwraps.txt" }} paths: - packages/xmlbuilder/.npm/package/node_modules - packages/logging/.npm/package/node_modules @@ -756,7 +757,7 @@ jobs: - packages/fetch/.npm/package/node_modules - packages/non-core/mongo-decimal/.npm/package/node_modules - save_cache: - key: v5-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-{{ .Revision }} + key: v7-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-{{ .Revision }} paths: - ".babel-cache" - ".meteor" diff --git a/.gitignore b/.gitignore index f34843314b..4485482276 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ TAGS npm-debug.log universe .babel-cache +.reify-cache mongo-test-output # core packages shouldn't have .versions files diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 7a888d74df..1131e40009 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -24,7 +24,7 @@ can run Meteor directly from a Git checkout using these steps: > > $ git submodule update --init --recursive -0. **Run a Meteor command to install dependencies** +2. **Run a Meteor command to install dependencies** > If you did not compile dependencies above, this will also download the binaries. @@ -33,7 +33,7 @@ can run Meteor directly from a Git checkout using these steps: $ ./meteor --help ``` -0. **Ready to Go!** +3. **Ready to Go!** Your local Meteor checkout is now ready to use! You can use this `./meteor` anywhere you would normally call the system `meteor`. For example,: diff --git a/History.md b/History.md index 289110b39e..e694f3c5d7 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,50 @@ -## v2.3.0, UNRELEASED +## v2.3, UNRELEASED + +#### Highlights + +* Node.js update to 14.17.0 from 12.22.1 :tada: + +* Typescript update to 4.2.4 + +* New env variable `METEOR_TOOL_ENABLE_REIFY_RUNTIME_CACHE` to improve runtime performance on restarts. + +* New flag `--platforms` has been added to the `build` command to specify the platform you want to build for. `meteor build . --platforms=android`. + +* Skeletons dependencies updated to latest version + +### 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. + +### Migration steps + +- As Node.js version was upgraded we recommend that you remove your `node_modules` folder (`rm -rf node_modules`) and run `meteor reset` 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. + +#### Meteor Version Release + +* `meteor-tool@2.3` + - Node.js update to 14.17.0 from 12.22.1 :tada: + - 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. + - New env variable `METEOR_TOOL_ENABLE_REIFY_RUNTIME_CACHE` that improves restarts by caching reify data. This new cache should help with runtime performance when restarting server, but it is not yet ready for general use. By default it is disabled but you can enable it setting `true` in this env var. Learn 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`). + +* `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 assingment 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. ### Breaking changes * Removed deprecated `mobile-port` flag @@ -33,17 +79,32 @@ #### Independent Releases -* Updated `ddp-server@2.3.3` and `socket-stream-client@0.3.2` dependencies which removes Node's HTTP deprecation warning. +* `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. -* Released `ddp-client@2.4.1` re-ordering fields in DDP message for better client readability. +* `ddp-client@2.4.1` + - Re-ordering fields in DDP message for better client readability. -* Released `mongo@1.11.1` fixing a `Timestamp.ONE is undefined` bug. +* `mongo@1.11.1` + - Fixes a `Timestamp.ONE is undefined` bug. -* Released `mongo-id@1.0.8` removing unused dependency `id-map`. +* `mongo-id@1.0.8` + - Removes unused dependency `id-map`. -* Released `dev-error-overlay@0.1.1` fixing sometimes page content being on top of error overlay +* `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`. -* Released `id-map@1.1.1` removing unused dependencies and modernizing the code +* `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. @@ -143,7 +204,7 @@ * `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 @@ -159,10 +220,10 @@ #### 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) @@ -181,12 +242,12 @@ * `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` - + - 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) @@ -194,7 +255,7 @@ * `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) @@ -203,7 +264,7 @@ * `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) @@ -239,10 +300,10 @@ N/A * `dynamic-import@0.5.5` - Fixes problem on IE because of modern syntax (arrow function). - + * `meteor-babel@7.10.6` - Allows to disable sourceMap generation [#36](https://github.com/meteor/babel/pull/36) - + * `babel-compiler@7.5.5` - Allows to disable sourceMap generation [#36](https://github.com/meteor/babel/pull/36) @@ -278,7 +339,7 @@ N/A - adds new options for `meteor list` command (TODO pending link to updated doc). [#11165](https://github.com/meteor/meteor/pull/11165) - supports Cordova add plugin command working again with plugin id or plugin name in the git URL as it was before Meteor 1.11. [#11202](https://github.com/meteor/meteor/pull/11202) - avoids MiTM by downloading through https. [#11188](https://github.com/meteor/meteor/pull/11188) - + * `meteor-babel@7.10.5` - updates TypeScript to 4.1.2 and enables decorators and metadata reflection. [#11225](https://github.com/meteor/meteor/pull/11225) and [#11255](https://github.com/meteor/meteor/pull/11255) diff --git a/meteor b/meteor index 0ae0c66be8..856b8c95e7 100755 --- a/meteor +++ b/meteor @@ -1,6 +1,6 @@ #!/usr/bin/env bash -BUNDLE_VERSION=12.22.1.2 +BUNDLE_VERSION=14.17.0.0 # OS Check. Put here because here is where we download the precompiled # bundles that are arch specific. diff --git a/packages/accounts-base/accounts_server.js b/packages/accounts-base/accounts_server.js index 29dcfc5b29..042b99b097 100644 --- a/packages/accounts-base/accounts_server.js +++ b/packages/accounts-base/accounts_server.js @@ -1087,6 +1087,7 @@ export class AccountsServer extends AccountsCommon { } catch (e) { // XXX string parsing sucks, maybe // https://jira.mongodb.org/browse/SERVER-3069 will get fixed one day + // https://jira.mongodb.org/browse/SERVER-4637 if (!e.errmsg) throw e; if (e.errmsg.includes('emails.address')) throw new Meteor.Error(403, "Email already exists."); diff --git a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json index b496659435..8eb0913707 100644 --- a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json +++ b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json @@ -7,14 +7,14 @@ "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==" }, "@babel/compat-data": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", - "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==" }, "@babel/core": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.14.tgz", - "integrity": "sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA==", + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", + "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", "dependencies": { "json5": { "version": "2.2.0", @@ -24,9 +24,9 @@ } }, "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==" + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", + "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==" }, "@babel/helper-annotate-as-pure": { "version": "7.12.13", @@ -39,24 +39,24 @@ "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==" }, "@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==" + "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==" }, "@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==" + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz", + "integrity": "sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ==" }, "@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==" + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz", + "integrity": "sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA==" }, "@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==" }, "@babel/helper-explode-assignable-expression": { "version": "7.13.0", @@ -64,9 +64,9 @@ "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==" }, "@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==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==" }, "@babel/helper-get-function-arity": { "version": "7.12.13", @@ -84,9 +84,9 @@ "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==" }, "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", + "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==" }, "@babel/helper-optimise-call-expression": { "version": "7.12.13", @@ -104,9 +104,9 @@ "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==" }, "@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==" + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz", + "integrity": "sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==" }, "@babel/helper-simple-access": { "version": "7.13.12", @@ -124,9 +124,9 @@ "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==" }, "@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==" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==" }, "@babel/helper-validator-option": { "version": "7.12.17", @@ -139,49 +139,54 @@ "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==" }, "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==" }, "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==" }, "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==" + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz", + "integrity": "sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", - "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz", + "integrity": "sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==" }, "@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==" }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz", + "integrity": "sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==" + }, "@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==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz", + "integrity": "sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==" }, "@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==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz", + "integrity": "sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw==" }, "@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==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz", + "integrity": "sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==" }, "@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==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz", + "integrity": "sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -203,6 +208,11 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==" }, + "@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==" + }, "@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", @@ -239,14 +249,14 @@ "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==" }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz", + "integrity": "sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg==" }, "@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==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz", + "integrity": "sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg==" }, "@babel/plugin-transform-computed-properties": { "version": "7.13.0", @@ -254,9 +264,9 @@ "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==" }, "@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==" + "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==" }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.12.13", @@ -274,9 +284,9 @@ "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==" }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==" }, "@babel/plugin-transform-object-super": { "version": "7.12.13", @@ -284,9 +294,9 @@ "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==" }, "@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==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", + "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==" }, "@babel/plugin-transform-property-literals": { "version": "7.12.13", @@ -294,14 +304,14 @@ "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==" }, "@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.2.tgz", + "integrity": "sha512-zCubvP+jjahpnFJvPaHPiGVfuVUjXHhFvJKQdNnsmSsiU9kR/rCZ41jHc++tERD2zV+p7Hr6is+t5b6iWTCqSw==" }, "@babel/plugin-transform-react-jsx": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", - "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==" + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.3.tgz", + "integrity": "sha512-uuxuoUNVhdgYzERiHHFkE4dWoJx+UFVyuAl0aqN8P2/AKFHwqgUC5w2+4/PjpKXJsFgBlYAFXlUmDQ3k3DUkXw==" }, "@babel/plugin-transform-react-jsx-development": { "version": "7.12.17", @@ -314,14 +324,14 @@ "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==" }, "@babel/plugin-transform-regenerator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", - "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==" + "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==" }, "@babel/plugin-transform-runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.10.tgz", - "integrity": "sha512-Y5k8ipgfvz5d/76tx7JYbKQTcgFSU6VgJ3kKQv4zGTKr+a9T/KBvfRvGtSFgKDQGt/DBykQixV0vNWKIdzWErA==" + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz", + "integrity": "sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg==" }, "@babel/plugin-transform-shorthand-properties": { "version": "7.12.13", @@ -359,9 +369,9 @@ "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==" }, "@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==" }, "@babel/template": { "version": "7.12.13", @@ -369,14 +379,19 @@ "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==" }, "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==" }, "@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==" + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==" + }, + "@meteorjs/babel": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@meteorjs/babel/-/babel-7.11.0.tgz", + "integrity": "sha512-/6qog7HOFSCs42/5Svw4VbchZ4B83E7hRwjP1mDPahHqDYer3rFAipYpI6ViM/RwZSeo4MHspHUJYkENYz+JLw==" }, "acorn": { "version": "6.4.2", @@ -489,19 +504,19 @@ "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=" }, "babel-plugin-polyfill-corejs2": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", - "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==" }, "babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==" }, "babel-plugin-polyfill-regenerator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", - "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==" }, "babel-plugin-transform-inline-consecutive-adds": { "version": "0.4.3", @@ -559,9 +574,9 @@ "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=" }, "babel-preset-meteor": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-meteor/-/babel-preset-meteor-7.9.0.tgz", - "integrity": "sha512-SB2hGHZ2wKFiqaovO5DlgoYEUjNGP9FytZlLXppDKKP+TGpoGSQUyNhQ/ACSPFbTEBhKSuyV1LCEmHS+yK7FyQ==" + "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==" }, "babel-preset-minify": { "version": "0.5.1", @@ -569,9 +584,9 @@ "integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==" }, "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==" + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==" }, "call-bind": { "version": "1.0.2", @@ -579,9 +594,9 @@ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" }, "caniuse-lite": { - "version": "1.0.30001205", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001205.tgz", - "integrity": "sha512-TL1GrS5V6LElbitPazidkBMD9sa448bQDDLrumDqaggmKFcuU2JW1wTOHJPukAcOMtEmLcmDJEzfRrf+GjM0Og==" + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==" }, "chalk": { "version": "2.4.2", @@ -609,9 +624,9 @@ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==" }, "core-js-compat": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.0.tgz", - "integrity": "sha512-9yVewub2MXNYyGvuLnMHcN1k9RkvB7/ofktpeKTIaASyB88YYqGzUnu0ywMMhJrDHOMiTjSHWGzR+i7Wb9Z1kQ==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.12.1.tgz", + "integrity": "sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ==", "dependencies": { "semver": { "version": "7.0.0", @@ -631,9 +646,9 @@ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==" }, "electron-to-chromium": { - "version": "1.3.703", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.703.tgz", - "integrity": "sha512-SVBVhNB+4zPL+rvtWLw7PZQkw/Eqj1HQZs22xtcqW36+xoifzEOEEDEpkxSMfB6RFeSIOcG00w6z5mSqLr1Y6w==" + "version": "1.3.734", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.734.tgz", + "integrity": "sha512-iQF2mjPZ6zNNq45kbJ6MYZYCBNdv2JpGiJC/lVx4tGJWi9MNg73KkL9sWGN4X4I/CP2SBLWsT8nPADZZpAHIyw==" }, "escalade": { "version": "3.1.1", @@ -686,9 +701,9 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==" }, "js-tokens": { "version": "4.0.0", @@ -720,11 +735,6 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==" }, - "meteor-babel": { - "version": "7.10.7", - "resolved": "https://registry.npmjs.org/meteor-babel/-/meteor-babel-7.10.7.tgz", - "integrity": "sha512-Ed9ckTjKjItwWA15AANvGpLKP1LwW8xiyt1kAEOGVVRjtBraLbt7U0dm1meT5jSRF53A5bk+aQtlReninIDf8A==" - }, "meteor-babel-helpers": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/meteor-babel-helpers/-/meteor-babel-helpers-0.0.3.tgz", @@ -741,9 +751,9 @@ "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==" + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==" }, "object-keys": { "version": "1.1.1", @@ -850,9 +860,9 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==" }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", diff --git a/packages/babel-compiler/README.md b/packages/babel-compiler/README.md index 38ae94d12b..369977d182 100644 --- a/packages/babel-compiler/README.md +++ b/packages/babel-compiler/README.md @@ -20,8 +20,8 @@ Meteor's Babel support consists of the following core packages: The `babel-compiler` package exports the `Babel` symbol, which exposes functionality provided by the -[`meteor-babel`](https://www.npmjs.com/package/meteor-babel) NPM package, -which is in turn implemented using the +[`@meteorjs/babel`](https://www.npmjs.com/package/@meteorjs/babel) NPM package, +which is in turn implmented using the [`babel-core`](https://www.npmjs.com/package/babel-core) NPM package. Note that you can only use the `babel-compiler` package on the server. diff --git a/packages/babel-compiler/babel.js b/packages/babel-compiler/babel.js index 2adbbae925..fc8cd6668c 100644 --- a/packages/babel-compiler/babel.js +++ b/packages/babel-compiler/babel.js @@ -1,6 +1,6 @@ var meteorBabel = null; function getMeteorBabel() { - return meteorBabel || (meteorBabel = Npm.require("meteor-babel")); + return meteorBabel || (meteorBabel = Npm.require("@meteorjs/babel")); } /** @@ -46,6 +46,6 @@ Babel = { }, getMinimumModernBrowserVersions: function () { - return Npm.require("meteor-babel/modern-versions.js").get(); + return Npm.require("@meteorjs/babel/modern-versions.js").get(); } }; diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 65017c5f7b..3436b92bff 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,11 +6,11 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '7.6.1' + version: '7.6.2-beta230.0' }); Npm.depends({ - 'meteor-babel': '7.10.7', + '@meteorjs/babel': '7.11.0', 'json5': '2.1.1' }); diff --git a/packages/ddp-server/livedata_server.js b/packages/ddp-server/livedata_server.js index 7de0f1517d..6ca24210d1 100644 --- a/packages/ddp-server/livedata_server.js +++ b/packages/ddp-server/livedata_server.js @@ -241,6 +241,8 @@ var Session = function (server, version, socket, options) { self.blocked = false; self.workerRunning = false; + self.cachedUnblock = null; + // Sub objects for active subscriptions self._namedSubs = new Map(); self._universalSubs = []; @@ -567,9 +569,13 @@ _.extend(Session.prototype, { }, protocol_handlers: { - sub: function (msg) { + sub: function (msg, unblock) { var self = this; + // cacheUnblock temporarly, so we can capture it later + // we will use unblock in current eventLoop, so this is safe + self.cachedUnblock = unblock; + // reject malformed messages if (typeof (msg.id) !== "string" || typeof (msg.name) !== "string" || @@ -624,6 +630,8 @@ _.extend(Session.prototype, { self._startSubscription(handler, msg.id, msg.params, msg.name); + // cleaning cached unblock + self.cachedUnblock = null; }, unsub: function (msg) { @@ -852,6 +860,13 @@ _.extend(Session.prototype, { var sub = new Subscription( self, handler, subId, params, name); + + let unblockHander = self.cachedUnblock; + // _startSubscription may call from a lot places + // so cachedUnblock might be null in somecases + // assign the cachedUnblock + sub.unblock = unblockHander || (() => {}); + if (subId) self._namedSubs.set(subId, sub); else @@ -1039,6 +1054,10 @@ _.extend(Subscription.prototype, { // methods waiting on data from Mongo (or whatever else the function // blocks on). This probably slows page load in common cases. + if (!this.unblock) { + this.unblock = () => {}; + } + var self = this; try { var res = DDP._CurrentPublicationInvocation.withValue( diff --git a/packages/dynamic-import/package.js b/packages/dynamic-import/package.js index d0b29622c3..bf41cb50e1 100644 --- a/packages/dynamic-import/package.js +++ b/packages/dynamic-import/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "dynamic-import", - version: "0.6.0", + version: "0.7.0-beta230.0", summary: "Runtime support for Meteor 1.5 dynamic import(...) syntax", documentation: "README.md" }); diff --git a/packages/dynamic-import/server.js b/packages/dynamic-import/server.js index 8854b205f5..cb7561b109 100644 --- a/packages/dynamic-import/server.js +++ b/packages/dynamic-import/server.js @@ -67,6 +67,8 @@ function middleware(request, response) { if (request.method === "OPTIONS") { const acrh = request.headers["access-control-request-headers"]; + response.setHeader('Allow', 'OPTIONS, POST'); + response.setHeader('Content-Length', '0'); response.setHeader( "Access-Control-Allow-Headers", typeof acrh === "string" ? acrh : "*" @@ -102,11 +104,13 @@ function middleware(request, response) { }); } else { + const body = `method ${request.method} not allowed`; response.writeHead(405, { + Allow: "OPTIONS, POST", + 'Content-Length': Buffer.byteLength(body), "Cache-Control": "no-cache" }); - - response.end(`method ${request.method} not allowed`); + response.end(body); } } diff --git a/packages/email/.npm/package/npm-shrinkwrap.json b/packages/email/.npm/package/npm-shrinkwrap.json index e4ffb8f728..cdbc53f991 100644 --- a/packages/email/.npm/package/npm-shrinkwrap.json +++ b/packages/email/.npm/package/npm-shrinkwrap.json @@ -2,9 +2,9 @@ "lockfileVersion": 1, "dependencies": { "nodemailer": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.6.tgz", - "integrity": "sha512-/kJ+FYVEm2HuUlw87hjSqTss+GU35D4giOpdSfGp7DO+5h6RlJj7R94YaYHOkoxu1CSaM0d3WRBtCzwXrY6MKA==" + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.0.tgz", + "integrity": "sha512-ikSMDU1nZqpo2WUPE0wTTw/NGGImTkwpJKDIFPZT+YvvR9Sj+ze5wzu95JHkBMglQLoG2ITxU21WukCC/XsFkg==" }, "stream-buffers": { "version": "3.0.2", diff --git a/packages/email/email_tests.js b/packages/email/email_tests.js index 97c0977660..62284aa603 100644 --- a/packages/email/email_tests.js +++ b/packages/email/email_tests.js @@ -42,7 +42,7 @@ Tinytest.add("email - fully customizable", function (test) { test.equal(canonicalize(stream.getContentsAsString("utf8")), "====== BEGIN MAIL #0 ======\n" + devWarningBanner + - "Content-Type: text/plain\r\n" + + "Content-Type: text/plain; charset=utf-8\r\n" + "X-Meteor-Test: a custom header\r\n" + "Date: dummy\r\n" + "From: foo@example.com\r\n" + @@ -116,7 +116,7 @@ Tinytest.add("email - using mail composer", function (test) { test.equal(canonicalize(stream.getContentsAsString("utf8")), "====== BEGIN MAIL #0 ======\n" + devWarningBanner + - "Content-Type: text/plain\r\n" + + "Content-Type: text/plain; charset=utf-8\r\n" + "From: a@b.com\r\n" + "Message-ID: <...>\r\n" + "Content-Transfer-Encoding: 7bit\r\n" + @@ -160,7 +160,7 @@ Tinytest.add("email - long lines", function (test) { test.equal(canonicalize(stream.getContentsAsString("utf8")), "====== BEGIN MAIL #0 ======\n" + devWarningBanner + - "Content-Type: text/plain\r\n" + + "Content-Type: text/plain; charset=utf-8\r\n" + "From: foo@example.com\r\n" + "To: bar@example.com\r\n" + "Subject: This is a very very very very very very very very " + @@ -225,12 +225,12 @@ Tinytest.add("email - text and html", function (test) { "MIME-Version: 1.0\r\n" + "\r\n" + "----...-Part_1\r\n" + - "Content-Type: text/plain\r\n" + + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Transfer-Encoding: 7bit\r\n" + "\r\n" + "*Cool*, man\r\n" + "----...-Part_1\r\n" + - "Content-Type: text/html\r\n" + + "Content-Type: text/html; charset=utf-8\r\n" + "Content-Transfer-Encoding: 7bit\r\n" + "\r\n" + "Cool, man\r\n" + diff --git a/packages/email/package.js b/packages/email/package.js index 45054f813f..7e8d480a4f 100644 --- a/packages/email/package.js +++ b/packages/email/package.js @@ -1,10 +1,10 @@ Package.describe({ summary: "Send email messages", - version: "2.0.0" + version: "2.1.0-beta230.0" }); Npm.depends({ - nodemailer: "6.4.6", + nodemailer: "6.6.0", "stream-buffers": "3.0.2" }); diff --git a/packages/hot-module-replacement/client.js b/packages/hot-module-replacement/client.js index 393a3bf00e..b31f45f0c7 100644 --- a/packages/hot-module-replacement/client.js +++ b/packages/hot-module-replacement/client.js @@ -11,12 +11,17 @@ let appliedChangeSets = []; let removeErrorMessage = null; let arch = __meteor_runtime_config__.isModern ? 'web.browser' : 'web.browser.legacy'; -let enabled = arch === 'web.browser'; +const hmrSecret = __meteor_runtime_config__._hmrSecret; +let supportedArch = arch === 'web.browser'; +const enabled = hmrSecret && supportedArch; -if (!enabled) { +if (!supportedArch) { console.log(`HMR is not supported in ${arch}`); } +if (!hmrSecret) { + console.log('Restart Meteor to enable HMR'); +} const imported = Object.create(null); const importedBy = Object.create(null); @@ -41,6 +46,10 @@ if (module._onRequire) { let pendingReload = () => Reload._reload({ immediateMigration: true }); let mustReload = false; +// Once an eager update fails, we stop processing future updates since they +// might depend on the failed update. This gets reset when we re-try applying +// the changes as non-eager updates. +let applyEagerUpdates = true; function handleMessage(message) { if (message.type === 'register-failed') { @@ -48,13 +57,9 @@ function handleMessage(message) { console.log('HMR: A different app is running on', Meteor.absoluteUrl()); console.log('HMR: Once you start this app again reload the page to re-enable HMR'); } else if (message.reason === 'wrong-secret') { - // TODO: we could wait until the first update to use hot code push - // instead of reloading the page immediately in case the user has any - // client state they want to keep for now. - console.log('HMR: Have the wrong secret, possibly because Meteor was restarted'); - console.log('HMR: Reloading page to get new secret'); + console.log('HMR: Have the wrong secret, probably because Meteor was restarted'); + console.log('HMR: Will enable HMR the next time the page is loaded'); mustReload = true; - pendingReload(); } else { console.log(`HMR: Register failed for unknown reason`, message); } @@ -77,6 +82,16 @@ function handleMessage(message) { throw new Error(`Unknown HMR message type ${message.type}`); } + if (message.eager && !applyEagerUpdates) { + return; + } else if (!message.eager) { + // Now that the build has finished, we will finish handling any updates + // that failed while being eagerly applied. Afterwards, we will either + // fall back to hot code push, or be in a state where we can start handling + // eager updates again + applyEagerUpdates = true; + } + const hasUnreloadable = message.changeSets.find(changeSet => { return !changeSet.reloadable; }); @@ -89,6 +104,9 @@ function handleMessage(message) { if (message.eager) { // This was an attempt to reload before the build finishes // If we can't, we will wait until the build finishes to properly handle it + // For now, we will disable eager updates in case future updates depended + // on these + applyEagerUpdates = false; return; } @@ -117,8 +135,9 @@ function handleMessage(message) { }); if (message.eager) { - // We will ignore any failures at this time - // and wait to handle them until the build finishes + // If there were any failures, we will stop applying eager updates for now + // and wait until after the build finishes to handle the failures + applyEagerUpdates = succeeded; return; } @@ -138,6 +157,7 @@ function handleMessage(message) { } let socket; +let disconnected = false; let pendingMessages = []; function send(message) { @@ -155,23 +175,34 @@ function connect() { return; } - let wsUrl = Meteor.absoluteUrl('/__meteor__hmr__/websocket'); + // If we've successfully connected and then was disconnected, we avoid showing + // any more connection errors in the console until we've connected again + let logDisconnect = !disconnected; + let wsUrl = Meteor.absoluteUrl('__meteor__hmr__/websocket'); const protocol = wsUrl.startsWith('https://') ? 'wss://' : 'ws://'; wsUrl = wsUrl.replace(/^.+\/\//, protocol); socket = new WebSocket(wsUrl); socket.addEventListener('close', function () { socket = null; - console.log('HMR: websocket closed'); + + if (logDisconnect) { + console.log('HMR: websocket closed'); + } + + disconnected = true; setTimeout(connect, 2000); }); socket.addEventListener('open', function () { + logDisconnect = true; + disconnected = false; + console.log('HMR: connected'); socket.send(JSON.stringify({ type: 'register', arch, - secret: __meteor_runtime_config__._hmrSecret, + secret: hmrSecret, appId: __meteor_runtime_config__.appId, })); @@ -186,11 +217,14 @@ function connect() { socket.addEventListener('message', function (event) { handleMessage(JSON.parse(event.data)); }); - - socket.addEventListener('error', console.error); } -connect(); +if (enabled) { + connect(); +} else { + // Always fall back to hot code push if HMR is disabled + mustReload = true; +} function requestChanges() { send({ @@ -441,7 +475,7 @@ let nonRefreshableVersion = initialVersions.versionNonRefreshable; let replaceableVersion = initialVersions.versionReplaceable; Meteor.startup(() => { - if (!enabled) { + if (!supportedArch) { return; } @@ -457,7 +491,12 @@ Meteor.startup(() => { pendingReload(); } else if (doc.versionReplaceable !== replaceableVersion) { replaceableVersion = doc.versionReplaceable; - requestChanges(); + if (enabled && !mustReload) { + requestChanges(); + } else { + mustReload = true; + pendingReload(); + } } }); diff --git a/packages/hot-module-replacement/package.js b/packages/hot-module-replacement/package.js index 69327361f7..cd858058bf 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.2.0', + version: '0.3.0-beta230.0', summary: 'Update code in development without reloading the page', documentation: 'README.md', debugOnly: true diff --git a/packages/launch-screen/package.js b/packages/launch-screen/package.js index 78b34858f9..1085cdfca3 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.2.1' + version: '1.3.0-beta230.0' }); Cordova.depends({ @@ -14,9 +14,9 @@ Cordova.depends({ }); Package.onUse(function(api) { - api.addFiles('mobile-launch-screen.js', 'web'); - api.addFiles('default-behavior.js', 'web'); - api.use(['blaze', 'templating'], 'web', { weak: true }); + api.addFiles('mobile-launch-screen.js', 'web.cordova'); + api.addFiles('default-behavior.js', 'web.cordova'); + api.use(['blaze', 'templating'], 'web.cordova', { weak: true }); api.export('LaunchScreen'); }); diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index 81d856243c..2c2472e4e2 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '2.2.0' + version: '2.3.0-beta.0' }); Package.includeTool(); diff --git a/packages/promise/.npm/package/npm-shrinkwrap.json b/packages/promise/.npm/package/npm-shrinkwrap.json index ddaaf50771..92a3f5920c 100644 --- a/packages/promise/.npm/package/npm-shrinkwrap.json +++ b/packages/promise/.npm/package/npm-shrinkwrap.json @@ -7,14 +7,14 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "meteor-promise": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/meteor-promise/-/meteor-promise-0.8.7.tgz", - "integrity": "sha512-wAu9XI3+35H1YyhTnnk5QXCfdrho5n/0Ltj65DhsUwtFCuktV7hre92FjtJgBbs+RHj5/iZ8Zcbml40EGLcFTQ==" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/meteor-promise/-/meteor-promise-0.9.0.tgz", + "integrity": "sha512-O1Fj1Oa5FfyIkAkDtZVnoYYEIC3miy7lvEeIQZVYunGSbOuivSbfAiPPsD+P45WNlcBALhUo94UzlHeIKBYNuQ==" }, "promise": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", - "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==" + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==" } } } diff --git a/packages/promise/package.js b/packages/promise/package.js index 1af67abed0..576aca3cf4 100644 --- a/packages/promise/package.js +++ b/packages/promise/package.js @@ -1,14 +1,14 @@ Package.describe({ name: "promise", - version: "0.11.2", + version: "0.12.0-beta230.0", summary: "ECMAScript 2015 Promise polyfill with Fiber support", git: "https://github.com/meteor/promise", documentation: "README.md" }); Npm.depends({ - "meteor-promise": "0.8.7", - "promise": "8.0.2" + "meteor-promise": "0.9.0", + "promise": "8.1.0" }); Package.onUse(function(api) { diff --git a/packages/typescript/package.js b/packages/typescript/package.js index 09c5c9d427..18101effb0 100644 --- a/packages/typescript/package.js +++ b/packages/typescript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "typescript", - version: "4.2.2", + version: "4.2.4-beta230.0", summary: "Compiler plugin that compiles TypeScript and ECMAScript in .ts and .tsx files", documentation: "README.md" }); diff --git a/packages/webapp/package.js b/packages/webapp/package.js index 25a34976d8..b1db73daf4 100644 --- a/packages/webapp/package.js +++ b/packages/webapp/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Serves a Meteor app over HTTP", - version: '1.10.1' + version: '1.11.0-beta230.0' }); Npm.depends({"basic-auth-connect": "1.0.0", diff --git a/packages/webapp/socket_file_tests.js b/packages/webapp/socket_file_tests.js index b263e6c695..90c86147a3 100644 --- a/packages/webapp/socket_file_tests.js +++ b/packages/webapp/socket_file_tests.js @@ -18,7 +18,7 @@ const removeTestSocketFile = () => { } Tinytest.add("socket file - don't remove a non-socket file", test => { - writeFileSync(testSocketFile); + writeFileSync(testSocketFile, ""); test.throws( () => { removeExistingSocketFile(testSocketFile); }, /An existing file was found/ @@ -58,7 +58,7 @@ Tinytest.add('socket file - remove socket file on exit', test => { const testEventEmitter = new EventEmitter(); registerSocketFileCleanup(testSocketFile, testEventEmitter); ['exit', 'SIGINT', 'SIGHUP', 'SIGTERM'].forEach(signal => { - writeFileSync(testSocketFile); + writeFileSync(testSocketFile, ""); test.isNotUndefined(statSync(testSocketFile)); testEventEmitter.emit(signal); test.throws( diff --git a/packages/webapp/webapp_server.js b/packages/webapp/webapp_server.js index 805c795e26..64097a9d12 100644 --- a/packages/webapp/webapp_server.js +++ b/packages/webapp/webapp_server.js @@ -428,10 +428,6 @@ WebAppInternals.staticFilesMiddleware = async function ( res, next, ) { - if ('GET' != req.method && 'HEAD' != req.method && 'OPTIONS' != req.method) { - next(); - return; - } var pathname = parseRequest(req).pathname; try { pathname = decodeURIComponent(pathname); @@ -441,11 +437,21 @@ WebAppInternals.staticFilesMiddleware = async function ( } var serveStaticJs = function (s) { - res.writeHead(200, { - 'Content-type': 'application/javascript; charset=UTF-8' - }); - res.write(s); - res.end(); + if (req.method === 'GET' || req.method === 'HEAD') { + res.writeHead(200, { + 'Content-type': 'application/javascript; charset=UTF-8', + 'Content-Length': Buffer.byteLength(s), + }); + res.write(s); + res.end(); + } else { + const status = req.method === 'OPTIONS' ? 200 : 405; + res.writeHead(status, { + 'Allow': 'OPTIONS, GET, HEAD', + 'Content-Length': '0', + }); + res.end(); + } }; if (_.has(additionalStaticJs, pathname) && @@ -478,6 +484,16 @@ WebAppInternals.staticFilesMiddleware = async function ( next(); return; } + // "send" will handle HEAD & GET requests + if (req.method !== 'HEAD' && req.method !== 'GET') { + const status = req.method === 'OPTIONS' ? 200 : 405; + res.writeHead(status, { + 'Allow': 'OPTIONS, GET, HEAD', + 'Content-Length': '0', + }) + res.end(); + return; + } // We don't need to call pause because, unlike 'static', once we call into // 'send' and yield to the event loop, we never call another handler with @@ -524,6 +540,7 @@ WebAppInternals.staticFilesMiddleware = async function ( } if (info.content) { + res.setHeader('Content-Length', Buffer.byteLength(info.content)); res.write(info.content); res.end(); } else { @@ -973,6 +990,13 @@ function runWebAppServer() { if (! appUrl(req.url)) { return next(); + } else if (req.method !== 'HEAD' && req.method !== 'GET') { + const status = req.method === 'OPTIONS' ? 200 : 405; + res.writeHead(status, { + 'Allow': 'OPTIONS, GET, HEAD', + 'Content-Length': '0', + }) + res.end(); } else { var headers = { 'Content-Type': 'text/html; charset=utf-8' diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index eb8577cf68..a27e3e5c4a 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "2.2", + "version": "2.3-beta.0", "recommended": false, "official": false, "description": "Meteor" diff --git a/scripts/build-dev-bundle-common.sh b/scripts/build-dev-bundle-common.sh index 6d51ed7d90..b3ce3759c3 100644 --- a/scripts/build-dev-bundle-common.sh +++ b/scripts/build-dev-bundle-common.sh @@ -5,10 +5,10 @@ set -u UNAME=$(uname) ARCH=$(uname -m) -NODE_VERSION=12.22.1 +NODE_VERSION=14.17.0 MONGO_VERSION_64BIT=4.4.4 MONGO_VERSION_32BIT=3.2.22 -NPM_VERSION=6.14.12 +NPM_VERSION=6.14.13 # If we built Node from source on Jenkins, this is the build number. NODE_BUILD_NUMBER= diff --git a/scripts/ci/run-selftest-ci.sh b/scripts/ci/run-selftest-ci.sh new file mode 100644 index 0000000000..649d86b3b2 --- /dev/null +++ b/scripts/ci/run-selftest-ci.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +set -e +set -u + +ulimit -c unlimited; # Set core dump size as Ubuntu 14.04 lacks prlimit. +ulimit -a # Display all ulimit settings for transparency. + +METEOR_SELF_TEST_RETRIES=0 + +pushd tools +# Ensure that meteor/tools has no TypeScript errors. +echo "install @types/node" +npm install @types/node --save-dev +echo "typescript compiler starting" +../meteor npx tsc --noEmit +echo "typescript compiler finished" +popd +echo "meteor get-ready starting" +./meteor --get-ready +echo "meteor get-ready finished" + +# selftest +echo "meteor self-test first 0-50 starting" +./meteor self-test \ + --headless \ + --without-tag "custom-warehouse" \ + --retries ${METEOR_SELF_TEST_RETRIES} \ + --exclude "add debugOnly and prodOnly packages" \ + --limit 50 \ + --skip 0 +echo "meteor self-test first 0-50 finished" +echo "meteor self-test first 51-100 starting" +./meteor self-test \ + --headless \ + --without-tag "custom-warehouse" \ + --retries ${METEOR_SELF_TEST_RETRIES} \ + --exclude "add debugOnly and prodOnly packages" \ + --limit 100 \ + --skip 50 +echo "meteor self-test first 51-100 finished" +echo "meteor self-test first 101- starting" +./meteor self-test \ + --headless \ + --without-tag "custom-warehouse" \ + --retries ${METEOR_SELF_TEST_RETRIES} \ + --exclude "add debugOnly and prodOnly packages" \ + --skip 100 +echo "meteor self-test first 101- finished" +echo "meteor self-test isolated starting" +./meteor self-test \ + 'add debugOnly and prodOnly packages' \ + --retries ${METEOR_SELF_TEST_RETRIES} \ + --headless +echo "meteor self-test isolated finished" diff --git a/scripts/dev-bundle-server-package.js b/scripts/dev-bundle-server-package.js index 8f400155d7..b86a704bd3 100644 --- a/scripts/dev-bundle-server-package.js +++ b/scripts/dev-bundle-server-package.js @@ -10,13 +10,13 @@ var packageJson = { dependencies: { // Keep the versions of these packages consistent with the versions // found in dev-bundle-tool-package.js. - fibers: "4.0.3", - "meteor-promise": "0.8.7", - promise: "8.0.2", + fibers: "5.0.0", + "meteor-promise": "0.9.0", + promise: "8.1.0", reify: "0.20.12", - "@babel/parser": "7.9.4", - "@types/underscore": "1.9.2", - underscore: "1.9.1", + "@babel/parser": "7.11.5", + "@types/underscore": "1.10.24", + underscore: "1.11.0", "source-map-support": "https://github.com/meteor/node-source-map-support/tarball/1912478769d76e5df4c365e147f25896aee6375e", "@types/semver": "5.4.0", semver: "5.4.1" @@ -24,7 +24,7 @@ var packageJson = { // 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: "2.1.1", + split2: "2.2.0", multipipe: "1.0.2", chalk: "0.5.1" } diff --git a/scripts/dev-bundle-tool-package.js b/scripts/dev-bundle-tool-package.js index 45c1d4fc82..ae955aad1f 100644 --- a/scripts/dev-bundle-tool-package.js +++ b/scripts/dev-bundle-tool-package.js @@ -10,61 +10,62 @@ 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: "6.14.12", + npm: "6.14.13", pacote: "https://github.com/meteor/pacote/tarball/a81b0324686e85d22c7688c47629d4009000e8b8", - "node-gyp": "6.0.1", - "node-pre-gyp": "0.14.0", - typescript: "4.2.2", - "meteor-babel": "7.10.7", + "node-gyp": "8.0.0", + "node-pre-gyp": "0.15.0", + typescript: "4.2.4", + "@meteorjs/babel": "7.11.0", // Keep the versions of these packages consistent with the versions // found in dev-bundle-server-package.js. - "meteor-promise": "0.8.7", - fibers: "4.0.3", + "meteor-promise": "0.9.0", + fibers: "5.0.0", reify: "0.20.12", // So that Babel can emit require("@babel/runtime/helpers/...") calls. - "@babel/runtime": "7.9.2", + "@babel/runtime": "7.13.17", // 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.9.2", - underscore: "1.9.1", + "@types/underscore": "1.11.1", + underscore: "1.13.1", "source-map-support": "https://github.com/meteor/node-source-map-support/tarball/1912478769d76e5df4c365e147f25896aee6375e", "@types/semver": "5.4.0", semver: "5.4.1", - request: "2.88.0", - uuid: "3.3.2", - "graceful-fs": "4.2.2", + request: "2.88.2", + uuid: "3.4.0", + "graceful-fs": "4.2.6", fstream: "https://github.com/meteor/fstream/tarball/cf4ea6c175355cec7bee38311e170d08c4078a5d", - tar: "2.2.1", + tar: "2.2.2", // Fork of kexec@3.0.0 with my Node.js 12 compatibility PR // https://github.com/jprichardson/node-kexec/pull/37 applied. + // 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: "0.5.1", - sqlite3: "4.1.0", - "http-proxy": "1.16.2", + sqlite3: "5.0.2", + "http-proxy": "1.18.1", "is-reachable": "3.1.0", - "wordwrap": "0.0.2", - "moment": "2.20.1", + "wordwrap": "1.0.0", + "moment": "2.29.1", "rimraf": "2.6.2", - "glob": "7.1.2", + "glob": "7.1.6", ignore: "3.3.7", // XXX: When we update this, see if it fixes this Github issue: // https://github.com/jgm/CommonMark/issues/276 . If it does, remove the // workaround from the tool. "commonmark": "0.15.0", escope: "3.6.0", - split2: "2.2.0", + split2: "3.2.2", multipipe: "2.0.1", pathwatcher: "8.1.0", // The @wry/context package version must be compatible with the // version constraint imposed by optimism/package.json. - optimism: "0.11.3", - "@wry/context": "0.4.4", - 'lru-cache': '4.1.3', - "anser": "1.4.8", - 'xmlbuilder2': '1.3.0', - "ws": "7.2.5" + optimism: "0.12.2", + "@wry/context": "0.5.2", + 'lru-cache': '4.1.5', + "anser": "2.0.1", + 'xmlbuilder2': '1.8.1', + "ws": "7.4.5" } }; diff --git a/scripts/generate-dev-bundle.ps1 b/scripts/generate-dev-bundle.ps1 index b337eb20cf..13863f0b9d 100644 --- a/scripts/generate-dev-bundle.ps1 +++ b/scripts/generate-dev-bundle.ps1 @@ -4,7 +4,8 @@ $DebugPreference = "Continue" Import-Module -Force "$PSScriptRoot\windows\dev-bundle-lib.psm1" $PLATFORM = Get-MeteorPlatform -$PYTHON_VERSION = "2.7.14" # For node-gyp +$PYTHON_VERSION = "3.9.5" # For node-gyp +& cmd /c 'du 2>&1' $dirCheckout = (Get-Item $PSScriptRoot).parent.FullName $shCommon = Join-Path $PSScriptRoot 'build-dev-bundle-common.sh' @@ -19,7 +20,6 @@ $BUNDLE_VERSION = Read-VariableFromShellScript "${dirCheckout}\meteor" 'BUNDLE_V # extract the major package versions from the build-dev-bundle-common script. $MONGO_VERSION_64BIT = Read-VariableFromShellScript $shCommon 'MONGO_VERSION_64BIT' -$MONGO_VERSION_32BIT = Read-VariableFromShellScript $shCommon 'MONGO_VERSION_32BIT' $NPM_VERSION = Read-VariableFromShellScript $shCommon 'NPM_VERSION' diff --git a/scripts/generate-dev-bundle.sh b/scripts/generate-dev-bundle.sh index 50a9dfc053..4d75328eae 100755 --- a/scripts/generate-dev-bundle.sh +++ b/scripts/generate-dev-bundle.sh @@ -88,7 +88,7 @@ export PATH="$DIR/bin:$PATH" cd "$DIR/lib" # Overwrite the bundled version with the latest version of npm. npm install "npm@$NPM_VERSION" - +npm config set python `which python3` which node which npm npm version @@ -176,7 +176,7 @@ find . -path '*/esprima-fb/test' | xargs rm -rf INSTALLED_NPM_VERSION=$(cat "$DIR/lib/node_modules/npm/package.json" | xargs -0 node -e "console.log(JSON.parse(process.argv[1]).version)") if [ "$INSTALLED_NPM_VERSION" != "$NPM_VERSION" ]; then - echo "Unexpected NPM version in lib/node_modules: $INSTALLED_NPM_VERSION" + echo "Error: Unexpected NPM version in lib/node_modules: $INSTALLED_NPM_VERSION" echo "Update this check if you know what you're doing." exit 1 fi diff --git a/tools/cli/commands-packages.js b/tools/cli/commands-packages.js index a83a142dd8..10bf7c8ced 100644 --- a/tools/cli/commands-packages.js +++ b/tools/cli/commands-packages.js @@ -219,7 +219,7 @@ var updatePackageMetadata = function (packageSource, conn) { // Refresh, so that we actually learn about the thing we just published. refreshOfficialCatalogOrDie(); return 0; -} +}; main.registerCommand({ name: 'publish', @@ -2302,9 +2302,18 @@ main.registerCommand({ var version = projectContext.packageMap.getInfo(constraint.package).version; var versionRecord = projectContext.projectCatalog.getVersion( constraint.package, version); + var deprecatedMessage = "" + if (versionRecord.deprecated) { + if (versionRecord.deprecatedMessage) { + deprecatedMessage = ` - DEPRECATED: ${versionRecord.deprecatedMessage}` + } else { + deprecatedMessage = ' - DEPRECATED' + } + } Console.info( constraint.package + - (versionRecord.description ? (": " + versionRecord.description) : "")); + (versionRecord.description ? (": " + versionRecord.description) : "") + deprecatedMessage + ); }); return exitCode; diff --git a/tools/cli/commands.js b/tools/cli/commands.js index 65cadfb623..40e0cd3f88 100644 --- a/tools/cli/commands.js +++ b/tools/cli/commands.js @@ -929,7 +929,8 @@ var buildCommands = { // like progress bars and spinners are unimportant. headless: { type: Boolean }, verbose: { type: Boolean, short: "v" }, - 'allow-incompatible-update': { type: Boolean } + 'allow-incompatible-update': { type: Boolean }, + platforms: { type: String } }, catalogRefresh: new catalog.Refresh.Never() }; @@ -1017,13 +1018,29 @@ var buildCommand = function (options) { } const appName = files.pathBasename(options.appDir); + let parsedCordovaServerPort; + let selectedPlatforms = null; + if (options.platforms) { + const platformsArray = options.platforms.split(","); + + platformsArray.forEach(plat => { + if (![...excludableWebArchs, 'android', 'ios'].includes(plat)) { + throw new Error(`Not allowed platform on '--platforms' flag: ${plat}`) + } + }) + + selectedPlatforms = platformsArray; + } let cordovaPlatforms; let parsedMobileServerUrl; - let parsedCordovaServerPort; if (!serverOnly) { cordovaPlatforms = projectContext.platformList.getCordovaPlatforms(); + if (selectedPlatforms) { + cordovaPlatforms = _.intersection(selectedPlatforms, cordovaPlatforms) + } + if (process.platform !== 'darwin' && _.contains(cordovaPlatforms, 'ios')) { cordovaPlatforms = _.without(cordovaPlatforms, 'ios'); Console.warn("Currently, it is only possible to build iOS apps \ @@ -1048,6 +1065,25 @@ on an OS X system."); cordovaPlatforms = []; } + // If we specified some platforms, we need to build what was specified. + // For example, if we want to build only android, there is no need to build + // web.browser. + let webArchs; + if (selectedPlatforms) { + const filteredArchs = projectContext.platformList + .getWebArchs() + .filter(arch => selectedPlatforms.includes(arch)); + + if ( + !_.isEmpty(cordovaPlatforms) && + !filteredArchs.includes('web.cordova') + ) { + filteredArchs.push('web.cordova'); + } + + webArchs = filteredArchs.length ? filteredArchs : undefined; + } + var buildDir = projectContext.getProjectLocalDirectory('build_tar'); var outputPath = files.pathResolve(options.args[0]); // get absolute path @@ -1088,6 +1124,7 @@ ${Console.command("meteor build ../output")}`, // packages with binary npm dependencies serverArch: bundleArch, buildMode: options.debug ? 'development' : 'production', + webArchs, }, }); if (bundleResult.errors) { diff --git a/tools/cli/help.txt b/tools/cli/help.txt index 0bc633c589..4e40a45883 100644 --- a/tools/cli/help.txt +++ b/tools/cli/help.txt @@ -425,6 +425,8 @@ Options: downgraded to versions that are potentially incompatible with the current versions, if required to satisfy all package version constraints. + --platforms Builds only the specified platforms (when available). + >>> lint diff --git a/tools/cli/main.js b/tools/cli/main.js index 16934fc0e7..be9c527cd0 100644 --- a/tools/cli/main.js +++ b/tools/cli/main.js @@ -604,7 +604,7 @@ Fiber(function () { // Check required Node version. // This code is duplicated in tools/server/boot.js. - var MIN_NODE_VERSION = 'v12.0.0'; + var MIN_NODE_VERSION = 'v14.0.0'; if (require('semver').lt(process.version, MIN_NODE_VERSION)) { Console.error( 'Meteor requires Node ' + MIN_NODE_VERSION + ' or later.'); diff --git a/tools/console/console.js b/tools/console/console.js index 7907c7ef40..feb35afd9b 100644 --- a/tools/console/console.js +++ b/tools/console/console.js @@ -78,10 +78,6 @@ const CARRIAGE_RETURN = process.platform === 'win32' && const FORCE_PRETTY = process.env.METEOR_PRETTY_OUTPUT && process.env.METEOR_PRETTY_OUTPUT != '0'; -if (! process.env.METEOR_COLOR) { - chalk.enabled = false; -} - const STATUS_MAX_LENGTH = 40; const PROGRESS_MAX_WIDTH = 40; diff --git a/tools/cordova/builder.js b/tools/cordova/builder.js index 2a9f36074a..043fe23241 100644 --- a/tools/cordova/builder.js +++ b/tools/cordova/builder.js @@ -496,7 +496,7 @@ export class CordovaBuilder { ROOT_URL: mobileServerUrl, // XXX propagate it from this.options? ROOT_URL_PATH_PREFIX: parsedUrl.pathname.replace(/\/$/,"") || '', - DDP_DEFAULT_CONNECTION_URL: mobileServerUrl, + DDP_DEFAULT_CONNECTION_URL: process.env.DDP_DEFAULT_CONNECTION_URL || mobileServerUrl, autoupdate: { versions: { "web.cordova": { diff --git a/tools/cordova/project.js b/tools/cordova/project.js index 8ff4890818..8b99bf3e2f 100644 --- a/tools/cordova/project.js +++ b/tools/cordova/project.js @@ -266,9 +266,9 @@ outdated platforms`); builder.writeConfigXmlAndCopyResources(); builder.copyWWW(bundlePath); - this.ensurePlatformsAreSynchronized(); this.ensurePluginsAreSynchronized(pluginVersions, - builder.pluginsConfiguration); + builder.pluginsConfiguration); + this.ensurePlatformsAreSynchronized(); // Temporary workaround for Cordova iOS bug until // https://issues.apache.org/jira/browse/CB-10885 is fixed diff --git a/tools/fs/files.ts b/tools/fs/files.ts index d37f922d5b..d84f2e8906 100644 --- a/tools/fs/files.ts +++ b/tools/fs/files.ts @@ -390,25 +390,25 @@ export function treeHash(root: string, optionsParams: { var absPath = pathJoin(root, relativePath); var stat = lstat(absPath); - if (stat.isDirectory()) { + if (stat?.isDirectory()) { if (relativePath) { hash.update('dir ' + JSON.stringify(relativePath) + '\n'); } readdir(absPath).forEach(entry => { traverse(pathJoin(relativePath, entry)); }); - } else if (stat.isFile()) { + } else if (stat?.isFile()) { if (!relativePath) { throw Error("must call files.treeHash on a directory"); } hash.update('file ' + JSON.stringify(relativePath) + ' ' + - stat.size + ' ' + fileHash(absPath) + '\n'); + stat?.size + ' ' + fileHash(absPath) + '\n'); // @ts-ignore if (stat.mode & 0o100) { hash.update('exec\n'); } - } else if (stat.isSymbolicLink()) { + } else if (stat?.isSymbolicLink()) { if (!relativePath) { throw Error("must call files.treeHash on a directory"); } @@ -416,7 +416,7 @@ export function treeHash(root: string, optionsParams: { JSON.stringify(readlink(absPath)) + '\n'); } // ignore anything weirder - }; + } traverse(''); @@ -574,7 +574,7 @@ Profile("files.symlinkWithOverwrite", function symlinkWithOverwrite( return convertToOSPath(path).replace(/[\/\\]$/, "") } - if (lstat(target).isSymbolicLink() && + if (lstat(target)?.isSymbolicLink() && normalizePath(readlink(target)) === normalizePath(source)) { // If the target already points to the desired source, we don't // need to do anything. @@ -622,7 +622,7 @@ export function getPathsInDir(dir: string, options: { function pathIsDirectory(path: string) { var stat = lstat(path); - return stat.isDirectory(); + return stat?.isDirectory() || false; } readdir(absoluteDir).forEach(entry => { @@ -1235,7 +1235,7 @@ export function runJavaScript(code: string, { // node to run the code and parse its output. We instead run an // entirely different JS parser, from the Babel project, but // which at least has a nice API for reporting errors. - const { parse } = require('meteor-babel'); + const { parse } = require('@meteorjs/babel'); try { parse(wrapped, { strictMode: false }); } catch (parseError) { diff --git a/tools/fs/optimistic.ts b/tools/fs/optimistic.ts index 47e64228c7..7e4cb45989 100644 --- a/tools/fs/optimistic.ts +++ b/tools/fs/optimistic.ts @@ -398,7 +398,7 @@ wrap((absRootDir: string, relDir: string) => { const optimisticIsSymbolicLink = wrap((path: string) => { try { - return lstat(path).isSymbolicLink(); + return lstat(path)?.isSymbolicLink(); } catch (e) { if (e.code !== "ENOENT") throw e; dependOnParentDirectory(path); diff --git a/tools/fs/safe-watcher.ts b/tools/fs/safe-watcher.ts index 909dfa6b26..12c658a363 100644 --- a/tools/fs/safe-watcher.ts +++ b/tools/fs/safe-watcher.ts @@ -89,7 +89,7 @@ function acquireWatcher(absPath: string, callback: EntryCallback) { } function startNewWatcher(absPath: string): Entry { - let stat: Stats | BigIntStats | null = null; + let stat: Stats | BigIntStats | null | undefined = null; if (DEDUPLICATE_BY_INO) { stat = statOrNull(absPath); diff --git a/tools/fs/watch.ts b/tools/fs/watch.ts index 970d38be09..719789fb52 100644 --- a/tools/fs/watch.ts +++ b/tools/fs/watch.ts @@ -351,7 +351,7 @@ function readAndStatDirectory(absPath: string) { // Add slashes to the end of directories. const contentsWithSlashes: string[] = []; contents.forEach(entry => { - let stat: Dirent | Stats | BigIntStats | null = entry; + let stat: Dirent | Stats | BigIntStats | null | undefined = entry; let name = entry.name; if (entry.isSymbolicLink()) { diff --git a/tools/isobuild/builder.js b/tools/isobuild/builder.js index a02d004bdb..5e4e736915 100644 --- a/tools/isobuild/builder.js +++ b/tools/isobuild/builder.js @@ -363,7 +363,7 @@ Previous builder: ${previousBuilder.outputPath}, this builder: ${outputPath}` return; } - const babel = require("meteor-babel"); + const babel = require("@meteorjs/babel"); const commonBabelOptions = babel.getDefaultOptions({ nodeMajorVersion: parseInt(process.versions.node), typescript: true diff --git a/tools/isobuild/bundler.js b/tools/isobuild/bundler.js index 88ae89475d..c1b9c770aa 100644 --- a/tools/isobuild/bundler.js +++ b/tools/isobuild/bundler.js @@ -212,7 +212,7 @@ exports._mainJsContents = [ "", "process.argv.splice(2, 0, 'program.json');", "process.chdir(require('path').join(__dirname, 'programs', 'server'));", - 'require("./programs/server/runtime.js");', + 'require("./programs/server/runtime.js")({ cachePath: process.env.METEOR_REIFY_CACHE_DIR });', "require('./programs/server/boot.js');", ].join("\n"); @@ -223,7 +223,7 @@ exports._mainJsContents = [ // Represents a node_modules directory that we need to copy into the // bundle or otherwise make available at runtime. -export class NodeModulesDirectory { +class NodeModulesDirectory { constructor({ packageName, sourceRoot, @@ -874,7 +874,7 @@ class Target { hmrAvailable: sourceBatch.hmrAvailable, cacheKey }, - getFileOutput + getFileOutput ); }); @@ -1420,7 +1420,7 @@ class Target { if (typeof file.data === 'string') { file.data = Buffer.from(file.data, "utf8"); } - const replaceable = possiblyReplaceable && + const replaceable = possiblyReplaceable && file.data.equals(source._source.contents()); const newFile = new File({ @@ -2868,7 +2868,7 @@ function addSourceMappingURL(data, url, targetPath) { parts.push( newLineBuffer, - Buffer.from("//# sourceMappingURL=" + url, "utf8"), + Buffer.from("//# sourceMappingURL=" + (process.env.ROOT_URL || "") + url, "utf8"), newLineBuffer // trailing newline ); @@ -3130,7 +3130,7 @@ Find out more about Meteor at meteor.com. * - onJsOutputFiles Called for each unibuild in a client arch with a list of js files * that will be linked, and a function to get their prelink output with their closure * and banner. - * + * * Returns an object with keys: * - errors: A buildmessage.MessageSet, or falsy if bundling succeeded. * - serverWatchSet: Information about server files and paths that were @@ -3567,3 +3567,5 @@ exports.readJsImage = Profile( "bundler.readJsImage", function (controlFilePath) { return JsImage.readFromDisk(controlFilePath); }); + +exports.NodeModulesDirectory = NodeModulesDirectory; diff --git a/tools/isobuild/compiler.js b/tools/isobuild/compiler.js index 3ecdb82d61..189c3fc1ff 100644 --- a/tools/isobuild/compiler.js +++ b/tools/isobuild/compiler.js @@ -2,7 +2,6 @@ var _ = require('underscore'); var archinfo = require('../utils/archinfo'); var buildmessage = require('../utils/buildmessage.js'); -var bundler = require('./bundler.js'); var isopack = require('./isopack.js'); var meteorNpm = require('./meteor-npm.js'); var watch = require('../fs/watch'); @@ -13,6 +12,7 @@ var linterPluginModule = require('./linter-plugin.js'); var compileStepModule = require('./compiler-deprecated-compile-step.js'); var Profile = require('../tool-env/profile').Profile; import { SourceProcessorSet } from './build-plugin.js'; +import { NodeModulesDirectory, buildJsImage } from './bundler.js'; import { optimisticReadFile, @@ -66,7 +66,7 @@ compiler.compile = Profile(function (packageSource, options) { "` in package `" + packageSource.name + "`", rootPath: packageSource.sourceRoot }, function () { - var buildResult = bundler.buildJsImage({ + var buildResult = buildJsImage({ name: info.name, packageMap: packageMap, isopackCache: isopackCache, @@ -410,7 +410,7 @@ var compileUnibuild = Profile(function (options) { const nodeModulesDirectories = Object.create(null); function addNodeModulesDirectory(options) { - const nmd = new bundler.NodeModulesDirectory(options); + const nmd = new NodeModulesDirectory(options); nodeModulesDirectories[nmd.sourcePath] = nmd; } @@ -998,65 +998,3 @@ compiler.eachUsedUnibuild = function ( export function isIsobuildFeaturePackage(packageName) { return packageName.startsWith('isobuild:'); } - -// If you update this data structure to add more feature packages, you should -// update the wiki page here: -// https://docs.meteor.com/api/packagejs.html#isobuild-features -export const KNOWN_ISOBUILD_FEATURE_PACKAGES = { - // This package directly calls Plugin.registerCompiler. Package authors - // must explicitly depend on this feature package to use the API. - 'isobuild:compiler-plugin': ['1.0.0'], - - // This package directly calls Plugin.registerMinifier. Package authors - // must explicitly depend on this feature package to use the API. - 'isobuild:minifier-plugin': ['1.0.0'], - - // This package directly calls Plugin.registerLinter. Package authors - // must explicitly depend on this feature package to use the API. - 'isobuild:linter-plugin': ['1.0.0'], - - // This package is only published in the isopack-2 format, not isopack-1 or - // older. ie, it contains "source" files for compiler plugins, not just - // JS/CSS/static assets/head/body. - // This is implicitly added at publish time to any such package; package - // authors don't have to add it explicitly. It isn't relevant for local - // packages, which can be rebuilt if possible by the older tool. - // - // Specifically, this is to avoid the case where a package is published with a - // dependency like `api.use('less@1.0.0 || 2.0.0')` and the publication - // selects the newer compiler plugin version to generate the isopack. The - // published package (if this feature package wasn't implicitly included) - // could still be selected by the Version Solver to be used with an old - // Isobuild... just because less@2.0.0 depends on isobuild:compiler-plugin - // doesn't mean it couldn't choose less@1.0.0, which is not actually - // compatible with this published package. (Constraints of the form described - // above are not very helpful, but at least we can prevent old Isobuilds from - // choking on confusing packages.) - // - // (Why not isobuild:isopack@2.0.0? Well, that would imply that Version Solver - // would have to choose only one isobuild:isopack feature version, which - // doesn't make sense here.) - 'isobuild:isopack-2': ['1.0.0'], - - // This package uses the `prodOnly` metadata flag, which causes it to - // automatically depend on the `isobuild:prod-only` feature package. - 'isobuild:prod-only': ['1.0.0'], - - // This package depends on a specific version of Cordova. Package authors must - // explicitly depend on this feature package to indicate that they are not - // compatible with earlier Cordova versions, which is most likely a result of - // the Cordova plugins they depend on. - // One scenario is a package depending on a Cordova plugin or version - // that is only available on npm, which means downloading the plugin is not - // supported on versions of Cordova below 5.0.0. - 'isobuild:cordova': ['5.4.0'], - - // This package requires functionality introduced in meteor-tool@1.5.0 - // to enable dynamic module fetching via import(...). - 'isobuild:dynamic-import': ['1.5.0'], - - // This package ensures that processFilesFor{Bundle,Target,Package} are - // allowed to return a Promise instead of having to await async - // compilation using fibers and/or futures. - 'isobuild:async-plugins': ['1.6.1'], -}; diff --git a/tools/isobuild/js-analyze.js b/tools/isobuild/js-analyze.js index 04cac3fd5a..e56c26ae9c 100644 --- a/tools/isobuild/js-analyze.js +++ b/tools/isobuild/js-analyze.js @@ -1,4 +1,4 @@ -import { parse } from 'meteor-babel'; +import { parse } from '@meteorjs/babel'; import { analyze as analyzeScope } from 'escope'; import LRU from "lru-cache"; diff --git a/tools/isobuild/npm-discards.ts b/tools/isobuild/npm-discards.ts index 3ace0e83f2..8e7e9b9e14 100644 --- a/tools/isobuild/npm-discards.ts +++ b/tools/isobuild/npm-discards.ts @@ -21,7 +21,7 @@ class NpmDiscards { shouldDiscard(candidatePath: string, isDirectory?: boolean): boolean { if (isDirectory === void 0) { - isDirectory = files.lstat(candidatePath).isDirectory(); + isDirectory = files.lstat(candidatePath)?.isDirectory(); } for (let currentPath = candidatePath, parentPath; diff --git a/tools/isobuild/resolver.ts b/tools/isobuild/resolver.ts index c84c56f29e..52b229060c 100644 --- a/tools/isobuild/resolver.ts +++ b/tools/isobuild/resolver.ts @@ -63,7 +63,7 @@ export default class Resolver { private nodeModulesPaths: string[]; private mainFields: string[]; - public statOrNull = optimisticStatOrNull as (path: string) => Stats | BigIntStats | null; + public statOrNull = optimisticStatOrNull as (path: string) => Stats | BigIntStats | null | undefined; constructor({ sourceRoot, diff --git a/tools/packaging/catalog/catalog-local.js b/tools/packaging/catalog/catalog-local.js index 1b22227283..0d952a4860 100644 --- a/tools/packaging/catalog/catalog-local.js +++ b/tools/packaging/catalog/catalog-local.js @@ -1,15 +1,78 @@ + var _ = require('underscore'); var buildmessage = require('../../utils/buildmessage.js'); var files = require('../../fs/files'); var watch = require('../../fs/watch'); + var PackageSource = require('../../isobuild/package-source.js'); -import { KNOWN_ISOBUILD_FEATURE_PACKAGES } from '../../isobuild/compiler.js'; import { sync as glob } from "glob"; import { Profile } from "../../tool-env/profile"; import { optimisticHashOrNull, } from "../../fs/optimistic"; +// This variable was duplicated due to an issue on importing it. +// The issue only happens on node 14, and is most surely related to this: https://nodejs.org/en/blog/release/v14.0.0/ +// !!! When changing this, also change on tools/project-context.js !!! +const KNOWN_ISOBUILD_FEATURE_PACKAGES = { + // This package directly calls Plugin.registerCompiler. Package authors + // must explicitly depend on this feature package to use the API. + 'isobuild:compiler-plugin': ['1.0.0'], + + // This package directly calls Plugin.registerMinifier. Package authors + // must explicitly depend on this feature package to use the API. + 'isobuild:minifier-plugin': ['1.0.0'], + + // This package directly calls Plugin.registerLinter. Package authors + // must explicitly depend on this feature package to use the API. + 'isobuild:linter-plugin': ['1.0.0'], + + // This package is only published in the isopack-2 format, not isopack-1 or + // older. ie, it contains "source" files for compiler plugins, not just + // JS/CSS/static assets/head/body. + // This is implicitly added at publish time to any such package; package + // authors don't have to add it explicitly. It isn't relevant for local + // packages, which can be rebuilt if possible by the older tool. + // + // Specifically, this is to avoid the case where a package is published with a + // dependency like `api.use('less@1.0.0 || 2.0.0')` and the publication + // selects the newer compiler plugin version to generate the isopack. The + // published package (if this feature package wasn't implicitly included) + // could still be selected by the Version Solver to be used with an old + // Isobuild... just because less@2.0.0 depends on isobuild:compiler-plugin + // doesn't mean it couldn't choose less@1.0.0, which is not actually + // compatible with this published package. (Constraints of the form described + // above are not very helpful, but at least we can prevent old Isobuilds from + // choking on confusing packages.) + // + // (Why not isobuild:isopack@2.0.0? Well, that would imply that Version Solver + // would have to choose only one isobuild:isopack feature version, which + // doesn't make sense here.) + 'isobuild:isopack-2': ['1.0.0'], + + // This package uses the `prodOnly` metadata flag, which causes it to + // automatically depend on the `isobuild:prod-only` feature package. + 'isobuild:prod-only': ['1.0.0'], + + // This package depends on a specific version of Cordova. Package authors must + // explicitly depend on this feature package to indicate that they are not + // compatible with earlier Cordova versions, which is most likely a result of + // the Cordova plugins they depend on. + // One scenario is a package depending on a Cordova plugin or version + // that is only available on npm, which means downloading the plugin is not + // supported on versions of Cordova below 5.0.0. + 'isobuild:cordova': ['5.4.0'], + + // This package requires functionality introduced in meteor-tool@1.5.0 + // to enable dynamic module fetching via import(...). + 'isobuild:dynamic-import': ['1.5.0'], + + // This package ensures that processFilesFor{Bundle,Target,Package} are + // allowed to return a Promise instead of having to await async + // compilation using fibers and/or futures. + 'isobuild:async-plugins': ['1.6.1'], +} + // LocalCatalog represents packages located in the application's // package directory, other package directories specified via an // environment variable, and core packages in the repo if meteor is diff --git a/tools/project-context.js b/tools/project-context.js index 467c1e48bb..1711f1c094 100644 --- a/tools/project-context.js +++ b/tools/project-context.js @@ -1,3 +1,4 @@ + var assert = require("assert"); var _ = require('underscore'); @@ -15,7 +16,68 @@ var tropohouse = require('./packaging/tropohouse.js'); var utils = require('./utils/utils.js'); var watch = require('./fs/watch'); var Profile = require('./tool-env/profile').Profile; -import { KNOWN_ISOBUILD_FEATURE_PACKAGES } from './isobuild/compiler.js'; + +// This variable was duplicated due to an issue on importing it. +// The issue only happens on node 14, and is most surely related to this: https://nodejs.org/en/blog/release/v14.0.0/ +// !!! When changing this, also change on tools/packaging/catalog/catalog-local.js !!! +const KNOWN_ISOBUILD_FEATURE_PACKAGES = { + // This package directly calls Plugin.registerCompiler. Package authors + // must explicitly depend on this feature package to use the API. + 'isobuild:compiler-plugin': ['1.0.0'], + + // This package directly calls Plugin.registerMinifier. Package authors + // must explicitly depend on this feature package to use the API. + 'isobuild:minifier-plugin': ['1.0.0'], + + // This package directly calls Plugin.registerLinter. Package authors + // must explicitly depend on this feature package to use the API. + 'isobuild:linter-plugin': ['1.0.0'], + + // This package is only published in the isopack-2 format, not isopack-1 or + // older. ie, it contains "source" files for compiler plugins, not just + // JS/CSS/static assets/head/body. + // This is implicitly added at publish time to any such package; package + // authors don't have to add it explicitly. It isn't relevant for local + // packages, which can be rebuilt if possible by the older tool. + // + // Specifically, this is to avoid the case where a package is published with a + // dependency like `api.use('less@1.0.0 || 2.0.0')` and the publication + // selects the newer compiler plugin version to generate the isopack. The + // published package (if this feature package wasn't implicitly included) + // could still be selected by the Version Solver to be used with an old + // Isobuild... just because less@2.0.0 depends on isobuild:compiler-plugin + // doesn't mean it couldn't choose less@1.0.0, which is not actually + // compatible with this published package. (Constraints of the form described + // above are not very helpful, but at least we can prevent old Isobuilds from + // choking on confusing packages.) + // + // (Why not isobuild:isopack@2.0.0? Well, that would imply that Version Solver + // would have to choose only one isobuild:isopack feature version, which + // doesn't make sense here.) + 'isobuild:isopack-2': ['1.0.0'], + + // This package uses the `prodOnly` metadata flag, which causes it to + // automatically depend on the `isobuild:prod-only` feature package. + 'isobuild:prod-only': ['1.0.0'], + + // This package depends on a specific version of Cordova. Package authors must + // explicitly depend on this feature package to indicate that they are not + // compatible with earlier Cordova versions, which is most likely a result of + // the Cordova plugins they depend on. + // One scenario is a package depending on a Cordova plugin or version + // that is only available on npm, which means downloading the plugin is not + // supported on versions of Cordova below 5.0.0. + 'isobuild:cordova': ['5.4.0'], + + // This package requires functionality introduced in meteor-tool@1.5.0 + // to enable dynamic module fetching via import(...). + 'isobuild:dynamic-import': ['1.5.0'], + + // This package ensures that processFilesFor{Bundle,Target,Package} are + // allowed to return a Promise instead of having to await async + // compilation using fibers and/or futures. + 'isobuild:async-plugins': ['1.6.1'], +} import { optimisticReadJsonOrNull, diff --git a/tools/runners/run-all.js b/tools/runners/run-all.js index b9ea107fc1..59e4ca8ad1 100644 --- a/tools/runners/run-all.js +++ b/tools/runners/run-all.js @@ -65,7 +65,8 @@ class Runner { }); } - const HMRPath = '/__meteor__hmr__/websocket'; + const basePath = utils.parseUrl(self.rootUrl).pathname || ''; + const HMRPath = basePath + '/__meteor__hmr__/websocket'; self.proxy = new Proxy({ listenPort, diff --git a/tools/runners/run-app.js b/tools/runners/run-app.js index a702f12279..f33586fedd 100644 --- a/tools/runners/run-app.js +++ b/tools/runners/run-app.js @@ -217,9 +217,18 @@ _.extend(AppProcess.prototype, { var shellDir = self.projectContext.getMeteorShellDirectory(); files.mkdir_p(shellDir); + var reifyCacheVersion = watch.sha1( + self.projectContext.releaseFile.fullReleaseName, + ); + var reifyCacheDir = self.projectContext.getProjectLocalDirectory( + `server-cache/reify/${reifyCacheVersion}` + ); + files.mkdir_p(reifyCacheDir); + // We need to convert to OS path here because the running app doesn't // have access to path translation functions env.METEOR_SHELL_DIR = files.convertToOSPath(shellDir); + env.METEOR_REIFY_CACHE_DIR = files.convertToOSPath(reifyCacheDir); env.METEOR_PARENT_PID = process.env.METEOR_BAD_PARENT_PID_FOR_TEST ? "foobar" : process.pid; diff --git a/tools/runners/run-hmr.js b/tools/runners/run-hmr.js index c821ecd43f..5cb351a20a 100644 --- a/tools/runners/run-hmr.js +++ b/tools/runners/run-hmr.js @@ -177,18 +177,37 @@ export class HMRServer { return; } + // Try to do HMR without waiting for the build to finish + // If it fails, the client will retry after the build finishes so + // it can fall back to hot code push + const sendEagerUpdate = (changeset) => { + if (!this.connByArch[arch]) { + return; + } + + this.connByArch[arch].forEach(conn => { + conn.send(JSON.stringify({ + type: 'changes', + changeSets: [changeset], + eager: true + })); + }); + } + this.cacheKeys[`${arch}-${name}`] = cacheKey; const previous = this.findLastChangeset(name, arch) || {}; if (!hmrAvailable) { - this.changeSetsByArch[arch].push({ + let changeset = { name, reloadable: false, cacheKey, // TODO: use more accurate name linkedAt: Date.now() - }); + }; + this.changeSetsByArch[arch].push(changeset); this._trimChangeSets(arch); + sendEagerUpdate(changeset); return; } @@ -235,19 +254,7 @@ export class HMRServer { this.changeSetsByArch[arch].push(result); this._trimChangeSets(arch); - // Try to do HMR without waiting for the build to finish - // If it fails, it will retry after the build finishes so - // it can fall back to hot code push - if (this.connByArch[arch]) { - this.connByArch[arch].forEach(conn => { - conn.send(JSON.stringify({ - type: 'changes', - changeSets: [result], - eager: true - })); - }); - } - return; + sendEagerUpdate(result); } _trimChangeSets(arch) { diff --git a/tools/static-assets/server/boot.js b/tools/static-assets/server/boot.js index 994c6dcb28..d3eae3d893 100644 --- a/tools/static-assets/server/boot.js +++ b/tools/static-assets/server/boot.js @@ -10,7 +10,7 @@ var npmRequire = require('./npm-require.js').require; var Profile = require('./profile').Profile; // This code is duplicated in tools/main.js. -var MIN_NODE_VERSION = 'v12.0.0'; +var MIN_NODE_VERSION = 'v14.0.0'; var hasOwn = Object.prototype.hasOwnProperty; diff --git a/tools/static-assets/server/runtime.js b/tools/static-assets/server/runtime.js index 7ef324ae65..d0b4943b6d 100644 --- a/tools/static-assets/server/runtime.js +++ b/tools/static-assets/server/runtime.js @@ -1,43 +1,139 @@ +const fs = require('fs'); +const path = require('path'); +const { createHash } = require("crypto"); const Module = module.constructor; -const Mp = Module.prototype; -Mp.resolve = function (id) { - return Module._resolveFilename(id, this); -}; +module.exports = function enable ({ cachePath, createLoader = true } = {}) { + let cacheEnabled = !!cachePath; + let cacheEntries = Object.create(null); -// Enable the module.{watch,export,...} runtime API needed by Reify. -require("reify/lib/runtime").enable(Mp); - -const moduleLoad = Mp.load; -Mp.load = function (filename) { - const result = moduleLoad.apply(this, arguments); - if (typeof this.runSetters === "function") { - // Make sure we call module.runSetters (or module.runModuleSetters, a - // legacy synonym) whenever a module finishes loading. - this.runSetters(); - } - return result; -}; - -const resolved = Promise.resolve(); -Mp.dynamicImport = function (id) { - return resolved.then(() => require(id)); -}; - -const reifyBabelParse = require("reify/lib/parsers/babel").parse; -const reifyCompile = require("reify/lib/compiler").compile; -const _compile = Mp._compile; -Mp._compile = function (content, filename) { - try { - const result = reifyCompile(content, { - parse: reifyBabelParse, - generateLetDeclarations: false, - ast: false, - }); - if (!result.identical) { - content = result.code; + if (cachePath) { + try { + fs.readdirSync(cachePath).forEach(name => { + cacheEntries[name] = true; + }); + } catch (e) { + if (e.code === 'ENOENT') { + fs.mkdirSync(cachePath); + } else { + cacheEnabled = false; + } } - } finally { - return _compile.call(this, content, filename); } -}; + + const Mp = Module.prototype; + + Mp.resolve = function (id) { + return Module._resolveFilename(id, this); + }; + + // Enable the module.{watch,export,...} runtime API needed by Reify. + require("reify/lib/runtime").enable(Mp); + + const moduleLoad = Mp.load; + Mp.load = function (filename) { + const result = moduleLoad.apply(this, arguments); + if (typeof this.runSetters === "function") { + // Make sure we call module.runSetters (or module.runModuleSetters, a + // legacy synonym) whenever a module finishes loading. + this.runSetters(); + } + return result; + }; + + const resolved = Promise.resolve(); + Mp.dynamicImport = function (id) { + return resolved.then(() => require(id)); + }; + + const reifyVersion = require("reify/package.json").version; + const reifyBabelParse = require("reify/lib/parsers/babel").parse; + const reifyCompile = require("reify/lib/compiler").compile; + + function compileContent (content) { + let identical = true; + + try { + const result = reifyCompile(content, { + parse: reifyBabelParse, + generateLetDeclarations: false, + ast: false, + }); + if (!result.identical) { + identical = false; + content = result.code; + } + } finally { + return { content, identical }; + } + } + + const _compile = Mp._compile; + Mp._compile = function (content, filename, options) { + // When cache is enabled, the file has already been compiled + if (!options || !options.compiledWithReify) { + content = compileContent(content).content; + } + + return _compile.call(this, content, filename); + }; + + if (cacheEnabled) { + const jsExt = Module._extensions.js; + Module._extensions['.js'] = function (module, filename) { + let stat = fs.statSync(filename); + let baseKey = createHash("sha1") + .update(`${reifyVersion}\0${filename}\0${stat.mtimeMs}\0${stat.ino}\0${stat.size}\0`) + .digest('hex'); + + // When files don't use import/export, there is no reason to store + // an identical copy of the file in the cache. Instead, it stores an empty + // file with a different suffix to indicate the original file should be used + let identicalKey = baseKey + '-identical.json'; + let key = baseKey + '.json'; + + let content; + if (cacheEntries[key]) { + content = fs.readFileSync(path.join(cachePath, key), 'utf8'); + } else if (cacheEntries[identicalKey]) { + content = fs.readFileSync(filename, 'utf8'); + } else { + let origContent = fs.readFileSync(filename, 'utf8'); + let result = compileContent(origContent); + content = result.content; + + if (result.identical) { + writeFileLater(identicalKey, ''); + } else { + writeFileLater(key, content); + } + } + + return module._compile(content, filename, { compiledWithReify: true }); + } + } + + let immediateTimer = null; + let pendingWrites = Object.create(null); + function writeFileLater(key, content) { + pendingWrites[key] = content; + if (immediateTimer !== null) { + return; + } + + immediateTimer = setImmediate(() => { + immediateTimer = null; + Object.keys(pendingWrites).forEach(key => { + try { + let targetPath = path.resolve(cachePath, key); + let tempPath = targetPath + '.tmp'; + fs.writeFileSync(tempPath, pendingWrites[key]); + fs.renameSync(tempPath, targetPath); + } catch (err) { + } + }); + + pendingWrites = Object.create(null); + }); + } +} diff --git a/tools/static-assets/skel-apollo/package.json b/tools/static-assets/skel-apollo/package.json index 7570e30d88..75f8095a54 100644 --- a/tools/static-assets/skel-apollo/package.json +++ b/tools/static-assets/skel-apollo/package.json @@ -9,11 +9,11 @@ }, "dependencies": { "@apollo/client": "^3.1.5", - "@babel/runtime": "^7.11.2", + "@babel/runtime": "^7.13.17", "apollo-boost": "^0.4.9", "apollo-server-express": "^2.17.0", "graphql": "^15.3.0", - "meteor-node-stubs": "^1.0.1", + "meteor-node-stubs": "^1.0.3", "react": "^16.13.1", "react-dom": "^16.13.1" }, diff --git a/tools/static-assets/skel-bare/package.json b/tools/static-assets/skel-bare/package.json index 2b970219fd..944d5f1424 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.11.2", - "meteor-node-stubs": "^1.0.1" + "@babel/runtime": "^7.13.17", + "meteor-node-stubs": "^1.0.3" } } diff --git a/tools/static-assets/skel-blaze/package.json b/tools/static-assets/skel-blaze/package.json index 61bcd56b35..93f77e7814 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.11.2", - "jquery": "^3.5.1", - "meteor-node-stubs": "^1.0.1" + "@babel/runtime": "^7.13.17", + "jquery": "^3.6.0", + "meteor-node-stubs": "^1.0.3" }, "meteor": { "mainModule": { diff --git a/tools/static-assets/skel-full/package.json b/tools/static-assets/skel-full/package.json index 6a7d7a5c0a..1e28d346d7 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.11.2", - "jquery": "^3.5.1", - "meteor-node-stubs": "^1.0.1" + "@babel/runtime": "^7.13.17", + "jquery": "^3.6.0", + "meteor-node-stubs": "^1.0.3" }, "devDependencies": { "chai": "^4.2.0" diff --git a/tools/static-assets/skel-minimal/package.json b/tools/static-assets/skel-minimal/package.json index ab8fbad718..75fab72a3b 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.11.2", - "meteor-node-stubs": "^1.0.1" + "@babel/runtime": "^7.13.17", + "meteor-node-stubs": "^1.0.3" }, "meteor": { "mainModule": { diff --git a/tools/static-assets/skel-react/package.json b/tools/static-assets/skel-react/package.json index e3b8f06f69..b55f02f728 100644 --- a/tools/static-assets/skel-react/package.json +++ b/tools/static-assets/skel-react/package.json @@ -8,10 +8,10 @@ "visualize": "meteor --production --extra-packages bundle-visualizer" }, "dependencies": { - "@babel/runtime": "^7.11.2", - "meteor-node-stubs": "^1.0.1", - "react": "^16.13.1", - "react-dom": "^16.13.1" + "@babel/runtime": "^7.13.17", + "meteor-node-stubs": "^1.0.3", + "react": "^17.0.2", + "react-dom": "^17.0.2" }, "meteor": { "mainModule": { diff --git a/tools/static-assets/skel-svelte/.meteor/packages b/tools/static-assets/skel-svelte/.meteor/packages index 8931fa7b4c..0e3c38c047 100644 --- a/tools/static-assets/skel-svelte/.meteor/packages +++ b/tools/static-assets/skel-svelte/.meteor/packages @@ -19,5 +19,6 @@ shell-server # Server-side component of the `meteor shell` command autopublish # Publish all data to the clients (for prototyping) insecure # Allow all DB writes from clients (for prototyping) static-html # Define static page content in .html files -svelte:compiler # Meteor package to allow us to create files with the .svelte extension -rdb:svelte-meteor-data # Meteor package which allows us to consume Meteor's reactive data sources inside of our Svelte components \ No newline at end of file +zodern:melte # Meteor package to allow us to create files with the .svelte extension +rdb:svelte-meteor-data # Meteor package which allows us to consume Meteor's reactive data sources inside of our Svelte components +hot-module-replacement # Update client in development without reloading the page diff --git a/tools/static-assets/skel-svelte/imports/ui/App.svelte b/tools/static-assets/skel-svelte/imports/ui/App.svelte index 7efa602339..4bbdfecdc4 100644 --- a/tools/static-assets/skel-svelte/imports/ui/App.svelte +++ b/tools/static-assets/skel-svelte/imports/ui/App.svelte @@ -14,7 +14,7 @@