From 6d7caa7e264c31b72a1c3d7732e901cd8207806a Mon Sep 17 00:00:00 2001 From: afrokick Date: Thu, 7 Jul 2022 23:03:22 +0300 Subject: [PATCH 001/114] modernize run-updater.js fix a little bug in stop --- .eslintignore | 1 - .../eslint-plugin-meteor/.eslintignore | 1 - tools/runners/run-all.js | 4 +- tools/runners/run-updater.js | 56 ++++++++----------- 4 files changed, 26 insertions(+), 36 deletions(-) diff --git a/.eslintignore b/.eslintignore index 5228e27ede..3653ab7c32 100644 --- a/.eslintignore +++ b/.eslintignore @@ -67,7 +67,6 @@ tools/runners/run-app.js tools/runners/run-mongo.js tools/runners/run-proxy.js tools/runners/run-selenium.js -tools/runners/run-updater.js tools/packaging/package-client.js tools/packaging/package-map.js diff --git a/npm-packages/eslint-plugin-meteor/.eslintignore b/npm-packages/eslint-plugin-meteor/.eslintignore index 5228e27ede..3653ab7c32 100644 --- a/npm-packages/eslint-plugin-meteor/.eslintignore +++ b/npm-packages/eslint-plugin-meteor/.eslintignore @@ -67,7 +67,6 @@ tools/runners/run-app.js tools/runners/run-mongo.js tools/runners/run-proxy.js tools/runners/run-selenium.js -tools/runners/run-updater.js tools/packaging/package-client.js tools/packaging/package-map.js diff --git a/tools/runners/run-all.js b/tools/runners/run-all.js index 805b81365c..04fa462eff 100644 --- a/tools/runners/run-all.js +++ b/tools/runners/run-all.js @@ -14,7 +14,7 @@ const Selenium = require('./run-selenium.js').Selenium; const AppRunner = require('./run-app.js').AppRunner; const MongoRunner = require('./run-mongo.js').MongoRunner; const HMRServer = require('./run-hmr').HMRServer; -const Updater = require('./run-updater.js').Updater; +const Updater = require('./run-updater').Updater; class Runner { constructor({ @@ -123,7 +123,7 @@ class Runner { hmrPath: HMRPath, secret: hmrSecret, projectContext: self.projectContext, - cordovaServerPort + cordovaServerPort }); } diff --git a/tools/runners/run-updater.js b/tools/runners/run-updater.js index dac475e9d0..c4a51be525 100644 --- a/tools/runners/run-updater.js +++ b/tools/runners/run-updater.js @@ -1,60 +1,52 @@ -var Console = require('../console/console.js').Console; +import { Console } from '../console/console'; -var Updater = function () { - var self = this; - self.timer = null; -}; +const CHECK_UPDATE_INTERVAL = 3 * 60 * 60 * 1000; // every 3 hours // XXX make it take a runLog? // XXX need to deal with updater writing messages (bypassing old // stdout interception.. maybe it should be global after all..) -Object.assign(Updater.prototype, { - start: function () { - var self = this; +export class Updater { + constructor() { + this.timer = null; + } - if (self.timer) { - throw new Error("already running?"); + start() { + if (this.timer) { + throw new Error('already running?'); } + const self = this; // Check every 3 hours. (Should not share buildmessage state with // the main fiber.) async function check() { self._check(); } - self.timer = setInterval(check, 3 * 60 * 60 * 1000); + this.timer = setInterval(check, CHECK_UPDATE_INTERVAL); // Also start a check now, but don't block on it. (This should // not share buildmessage state with the main fiber.) check(); - }, + } - _check: function () { - var self = this; - var updater = require('../packaging/updater.js'); + _check() { + const updater = require('../packaging/updater'); try { - updater.tryToDownloadUpdate({showBanner: true}); + updater.tryToDownloadUpdate({ showBanner: true }); } catch (e) { // oh well, this was the background. Only show errors if we are in debug // mode. - Console.debug("Error inside updater."); + Console.debug('Error inside updater.'); Console.debug(e.stack); - return; } - }, - - // Returns immediately. However if an update check is currently - // running it will complete in the background. Idempotent. - stop: function () { - var self = this; - - if (self.timer) { - return; - } - clearInterval(self.timer); - self.timer = null; } -}); + // Returns immediately. However, if an update check is currently + // running it will complete in the background. Idempotent. + stop() { + if (!this.timer) return; -exports.Updater = Updater; + clearInterval(this.timer); + this.timer = null; + } +} From b1ec9419bf43029c4c4a22e6e135730271207e66 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Fri, 5 Aug 2022 14:59:13 -0300 Subject: [PATCH 002/114] feat(error message): Especified error messages --- packages/modules-runtime-hot/installer.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/modules-runtime-hot/installer.js b/packages/modules-runtime-hot/installer.js index 3c7c7df494..b2197fb8ea 100644 --- a/packages/modules-runtime-hot/installer.js +++ b/packages/modules-runtime-hot/installer.js @@ -204,6 +204,17 @@ makeInstaller = function (options) { } function makeMissingError(id) { + var path = String(id) + .split('/'); + var importsFromServer = path.some(function (id) { + return id.indexOf('server') !== -1; + }); + var importsFromClient = path.some(function (id) { + return id.indexOf('client') !== -1; + }); + if (importsFromServer || importsFromClient) { + return new Error('Cannot import module ' + id + ' \n (cross-boundary import) \n see: https://guide.meteor.com/structure.html#special-directories'); + } return new Error("Cannot find module '" + id + "'"); } From 3e22eb0a1c5d2725460ec85f72aca452007fafbb Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Fri, 5 Aug 2022 16:49:23 -0300 Subject: [PATCH 003/114] Fix(installer): moved to ES6 syntax --- packages/modules-runtime-hot/installer.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/modules-runtime-hot/installer.js b/packages/modules-runtime-hot/installer.js index b2197fb8ea..93745f749d 100644 --- a/packages/modules-runtime-hot/installer.js +++ b/packages/modules-runtime-hot/installer.js @@ -204,17 +204,16 @@ makeInstaller = function (options) { } function makeMissingError(id) { - var path = String(id) + const path = String(id) .split('/'); - var importsFromServer = path.some(function (id) { - return id.indexOf('server') !== -1; - }); - var importsFromClient = path.some(function (id) { - return id.indexOf('client') !== -1; - }); - if (importsFromServer || importsFromClient) { + + const importsFrom = (location) => + path.some((id) => id.indexOf(location) !== -1); + + if (importsFrom('server') || importsFrom('client')) { return new Error('Cannot import module ' + id + ' \n (cross-boundary import) \n see: https://guide.meteor.com/structure.html#special-directories'); } + return new Error("Cannot find module '" + id + "'"); } From 1927d2bffdeb1308c05286d1172935e6b2047fb8 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Fri, 5 Aug 2022 16:59:08 -0300 Subject: [PATCH 004/114] Fix(installer): renamed variables for better understanding --- packages/modules-runtime-hot/installer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules-runtime-hot/installer.js b/packages/modules-runtime-hot/installer.js index 93745f749d..3ef9f9157c 100644 --- a/packages/modules-runtime-hot/installer.js +++ b/packages/modules-runtime-hot/installer.js @@ -208,7 +208,7 @@ makeInstaller = function (options) { .split('/'); const importsFrom = (location) => - path.some((id) => id.indexOf(location) !== -1); + path.some((subPath) => subPath === location); if (importsFrom('server') || importsFrom('client')) { return new Error('Cannot import module ' + id + ' \n (cross-boundary import) \n see: https://guide.meteor.com/structure.html#special-directories'); From 932ab0b40adecb0a5ba2b694b3d72c56f74f6f8f Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Mon, 15 Aug 2022 09:22:30 -0300 Subject: [PATCH 005/114] fix(err-messages): especified more the err message --- packages/modules-runtime-hot/installer.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/modules-runtime-hot/installer.js b/packages/modules-runtime-hot/installer.js index 3ef9f9157c..fff539fec5 100644 --- a/packages/modules-runtime-hot/installer.js +++ b/packages/modules-runtime-hot/installer.js @@ -210,8 +210,18 @@ makeInstaller = function (options) { const importsFrom = (location) => path.some((subPath) => subPath === location); - if (importsFrom('server') || importsFrom('client')) { - return new Error('Cannot import module ' + id + ' \n (cross-boundary import) \n see: https://guide.meteor.com/structure.html#special-directories'); + if (importsFrom('client')) { + return new Error( + `Unable to import on the client a module from a server directory: ${id} + (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories` + ); + } + + if (importsFrom('server')) { + return new Error( + `Unable to import on the server a module from a client directory: ${id} + (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories` + ); } return new Error("Cannot find module '" + id + "'"); From 995ef9677e4aa4dc1ec6883a2e664f21bcaf2402 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Mon, 15 Aug 2022 09:22:51 -0300 Subject: [PATCH 006/114] wip(tests): started adding tests --- packages/modules-runtime/modules-runtime-tests.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/modules-runtime/modules-runtime-tests.js b/packages/modules-runtime/modules-runtime-tests.js index cebc27a5c7..a46f51b9d7 100644 --- a/packages/modules-runtime/modules-runtime-tests.js +++ b/packages/modules-runtime/modules-runtime-tests.js @@ -3,3 +3,9 @@ Tinytest.add('modules', function (test) { var require = meteorInstall(); test.equal(typeof require, "function"); }); + +Tinytest.add('modules - error', function (test) { + + const require = meteorInstall('non_existent_module'); + test.throws(require(), /Cannot find package "meteor". Try "meteor add meteor"./); +}); From 6c72eea4066f31656214ccc45515e0ce0a97dd8a Mon Sep 17 00:00:00 2001 From: Christopher Heschong Date: Wed, 17 Aug 2022 16:41:17 -0400 Subject: [PATCH 007/114] Add https proxy support --- npm-packages/meteor-installer/README.md | 5 +++++ npm-packages/meteor-installer/install.js | 13 +++++++++++++ npm-packages/meteor-installer/package.json | 1 + 3 files changed, 19 insertions(+) diff --git a/npm-packages/meteor-installer/README.md b/npm-packages/meteor-installer/README.md index 9ab8a2de6a..2d74de733a 100644 --- a/npm-packages/meteor-installer/README.md +++ b/npm-packages/meteor-installer/README.md @@ -52,3 +52,8 @@ npm install -g meteor --ignore-meteor-setup-exec-path ``` (or by setting the environment variable `npm_config_ignore_meteor_setup_exec_path=true`) + +### Proxy configuration + +Setting the `https_proxy` or `HTTPS_PROXY` environment variable to a valid proxy URL will cause the +downloader to use the configured proxy to retrieve the Meteor files. \ No newline at end of file diff --git a/npm-packages/meteor-installer/install.js b/npm-packages/meteor-installer/install.js index 25b252a525..f52fd003f2 100644 --- a/npm-packages/meteor-installer/install.js +++ b/npm-packages/meteor-installer/install.js @@ -1,4 +1,5 @@ const { DownloaderHelper } = require('node-downloader-helper'); +const HttpsProxyAgent = require('https-proxy-agent'); const cliProgress = require('cli-progress'); const Seven = require('node-7z'); const path = require('path'); @@ -133,6 +134,15 @@ try { download(); +function generateProxyAgent() { + const proxyUrl = process.env.https_proxy || process.env.HTTPS_PROXY; + if (!proxyUrl) { + return undefined; + } + + return new HttpsProxyAgent(proxyUrl); +} + function download() { const start = Date.now(); const downloadProgress = new cliProgress.SingleBar( @@ -148,6 +158,9 @@ function download() { retry: { maxRetries: 5, delay: 5000 }, override: true, fileName: tarGzName, + httpsRequestOptions: { + agent: generateProxyAgent() + } }); dl.on('progress', ({ progress }) => { diff --git a/npm-packages/meteor-installer/package.json b/npm-packages/meteor-installer/package.json index 9ca969a6c6..4e716a5acf 100644 --- a/npm-packages/meteor-installer/package.json +++ b/npm-packages/meteor-installer/package.json @@ -11,6 +11,7 @@ "dependencies": { "7zip-bin": "^5.0.3", "cli-progress": "^3.5.0", + "https-proxy-agent": "^5.0.1", "node-7z": "^2.0.5", "node-downloader-helper": "^1.0.11", "rimraf": "^3.0.2", From 55d593437707115397b3656e881c715548997bf6 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:36:52 -0300 Subject: [PATCH 008/114] chore(installer): removed from runtime-hot errors --- packages/modules-runtime-hot/installer.js | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/packages/modules-runtime-hot/installer.js b/packages/modules-runtime-hot/installer.js index fff539fec5..3c7c7df494 100644 --- a/packages/modules-runtime-hot/installer.js +++ b/packages/modules-runtime-hot/installer.js @@ -204,26 +204,6 @@ makeInstaller = function (options) { } function makeMissingError(id) { - const path = String(id) - .split('/'); - - const importsFrom = (location) => - path.some((subPath) => subPath === location); - - if (importsFrom('client')) { - return new Error( - `Unable to import on the client a module from a server directory: ${id} - (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories` - ); - } - - if (importsFrom('server')) { - return new Error( - `Unable to import on the server a module from a client directory: ${id} - (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories` - ); - } - return new Error("Cannot find module '" + id + "'"); } From 2c2038978d4252b894c0d87144d9f19d597383d2 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:37:37 -0300 Subject: [PATCH 009/114] feat(module-errors): created custom errors for modules --- .../errors/cannotFindMeteorPackage.js | 12 ++++++ .../errors/cannotImportFrom.js | 40 +++++++++++++++++++ packages/modules-runtime/errors/index.ts | 7 ++++ packages/modules-runtime/legacy.js | 15 +++---- packages/modules-runtime/modern.js | 15 +++---- packages/modules-runtime/verifyErrors.js | 21 ++++++++++ 6 files changed, 90 insertions(+), 20 deletions(-) create mode 100644 packages/modules-runtime/errors/cannotFindMeteorPackage.js create mode 100644 packages/modules-runtime/errors/cannotImportFrom.js create mode 100644 packages/modules-runtime/errors/index.ts create mode 100644 packages/modules-runtime/verifyErrors.js diff --git a/packages/modules-runtime/errors/cannotFindMeteorPackage.js b/packages/modules-runtime/errors/cannotFindMeteorPackage.js new file mode 100644 index 0000000000..c6575a4167 --- /dev/null +++ b/packages/modules-runtime/errors/cannotFindMeteorPackage.js @@ -0,0 +1,12 @@ +/** + * @description Default error message for when a package is not found + * @param id{string} + * @return {Error} + */ +export const cannotFindMeteorPackage = (id) => { + const packageName = id.split('/', 2)[1]; + return new Error( + 'Cannot find package "' + packageName + '". ' + + 'Try "meteor add ' + packageName + '".' + ); +}; diff --git a/packages/modules-runtime/errors/cannotImportFrom.js b/packages/modules-runtime/errors/cannotImportFrom.js new file mode 100644 index 0000000000..5700481139 --- /dev/null +++ b/packages/modules-runtime/errors/cannotImportFrom.js @@ -0,0 +1,40 @@ +/** + * + * @param id{string} + * @return {{fromServer: (function(): Error), from: (function(location: string): boolean), fromClient: (function(): Error)}} + */ +export const cannotImport = (id) => { + /** + * + * @param location{string} + * @return {boolean} + */ + const from = + (location) => { + if (!id) { + return false; + } + return String(id) + .split('/') + .some((subPath) => subPath === location); + }; + + const fromClient = + () => new Error( + `Unable to import on the client a module from a server directory: ${id} + (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories` + ); + + + const fromServer = + () => new Error( + `Unable to import on the server a module from a client directory: ${id} + (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories` + ); + + return { + from, + fromClient, + fromServer + }; +}; diff --git a/packages/modules-runtime/errors/index.ts b/packages/modules-runtime/errors/index.ts new file mode 100644 index 0000000000..dedb37c38a --- /dev/null +++ b/packages/modules-runtime/errors/index.ts @@ -0,0 +1,7 @@ +import {cannotFindMeteorPackage} from './cannotFindMeteorPackage.js'; +import {cannotImport} from './cannotImportFrom.js'; + +export { + cannotFindMeteorPackage, + cannotImport +} diff --git a/packages/modules-runtime/legacy.js b/packages/modules-runtime/legacy.js index b76f1d36b3..1c226f6458 100644 --- a/packages/modules-runtime/legacy.js +++ b/packages/modules-runtime/legacy.js @@ -1,3 +1,5 @@ +import { verifyErrors } from './verifyErrors'; + meteorInstall = makeInstaller({ // On the client, make package resolution prefer the "browser" field of // package.json over the "module" field over the "main" field. @@ -5,17 +7,10 @@ meteorInstall = makeInstaller({ // The difference between legacy.js and modern.js is that this module // prefers "main" over "module" (see issue #10658). - mainFields: ["browser", "main", "module"], - - fallback: function(id, parentId, error) { - if (id && id.startsWith('meteor/')) { - var packageName = id.split('/', 2)[1]; - throw new Error( - 'Cannot find package "' + packageName + '". ' + - 'Try "meteor add ' + packageName + '".' - ); - } + mainFields: ['browser', 'main', 'module'], + fallback: function (id, parentId, error) { + verifyErrors(id); throw error; } }); diff --git a/packages/modules-runtime/modern.js b/packages/modules-runtime/modern.js index c26a129da0..5461dbf5c3 100644 --- a/packages/modules-runtime/modern.js +++ b/packages/modules-runtime/modern.js @@ -1,18 +1,13 @@ +import { verifyErrors } from './verifyErrors'; + meteorInstall = makeInstaller({ // On the client, make package resolution prefer the "browser" field of // package.json over the "module" field over the "main" field. browser: true, - mainFields: ["browser", "module", "main"], - - fallback: function(id, parentId, error) { - if (id && id.startsWith('meteor/')) { - var packageName = id.split('/', 2)[1]; - throw new Error( - 'Cannot find package "' + packageName + '". ' + - 'Try "meteor add ' + packageName + '".' - ); - } + mainFields: ['browser', 'module', 'main'], + fallback: function (id, parentId, error) { + verifyErrors(id); throw error; } }); diff --git a/packages/modules-runtime/verifyErrors.js b/packages/modules-runtime/verifyErrors.js new file mode 100644 index 0000000000..03df701a7c --- /dev/null +++ b/packages/modules-runtime/verifyErrors.js @@ -0,0 +1,21 @@ +import * as E from './errors'; + +/** + * + * @param id{string} + */ +export const verifyErrors = (id) => { + if (id && id.startsWith('meteor/')) { + throw E.cannotFindMeteorPackage(id); + } + if (E.cannotImport(id) + .from('client')) { + throw E.cannotImport(id) + .fromClient(); + } + if (E.cannotImport(id) + .from('server')) { + throw E.cannotImport(id) + .fromServer(); + } +}; From 968eb71800ee0830f54cf315d166e9fceb15ce9b Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:37:54 -0300 Subject: [PATCH 010/114] tests(module-erros): added tests --- .../modules-runtime/modules-runtime-tests.js | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/modules-runtime/modules-runtime-tests.js b/packages/modules-runtime/modules-runtime-tests.js index a46f51b9d7..665c540a38 100644 --- a/packages/modules-runtime/modules-runtime-tests.js +++ b/packages/modules-runtime/modules-runtime-tests.js @@ -1,11 +1,22 @@ Tinytest.add('modules', function (test) { - test.equal(typeof meteorInstall, "function"); + test.equal(typeof meteorInstall, 'function'); var require = meteorInstall(); - test.equal(typeof require, "function"); + test.equal(typeof require, 'function'); }); -Tinytest.add('modules - error', function (test) { - - const require = meteorInstall('non_existent_module'); - test.throws(require(), /Cannot find package "meteor". Try "meteor add meteor"./); +Tinytest.add('modules - meteor/ - error', function (test) { + const require = meteorInstall(); + test.throws(require('meteor/foo'), /Cannot find package "meteor". Try "meteor add meteor"./); +}); + +Tinytest.add('modules - client calling server', function (test) { + const require = meteorInstall(); + test.throws(require('./../server/main.js'), `Unable to import on the client a module from a server directory: './../server/main.js' + (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`); +}); + +Tinytest.add('modules - server - error', function (test) { + const require = meteorInstall(); + test.throws(require('./../client/main.js'), `Unable to import on the server a module from a client directory: './../client/main.js' + (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`); }); From 438b8f5eeaaa811c867576f4369699477f51f8b0 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 22:09:02 -0300 Subject: [PATCH 011/114] chore(module-runtime): added files in package.js --- packages/modules-runtime-hot/installer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules-runtime-hot/installer.js b/packages/modules-runtime-hot/installer.js index 3c7c7df494..6ad56981a4 100644 --- a/packages/modules-runtime-hot/installer.js +++ b/packages/modules-runtime-hot/installer.js @@ -220,8 +220,8 @@ makeInstaller = function (options) { var file = fileResolve(filesByModuleId[this.id], id); if (file) return file.module.id; var error = makeMissingError(id); - if (fallback && isFunction(fallback.resolve)) { - return fallback.resolve(id, this.id, error); + if (fallback && isFunction(fallback)) { + return fallback(id, this.id, error); } throw error; }; From bfd81cc616f8fc79259e1ba03dfccddc96dadceb Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 22:09:45 -0300 Subject: [PATCH 012/114] chore: removed index.js from module-runtime --- packages/modules-runtime/errors/index.ts | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 packages/modules-runtime/errors/index.ts diff --git a/packages/modules-runtime/errors/index.ts b/packages/modules-runtime/errors/index.ts deleted file mode 100644 index dedb37c38a..0000000000 --- a/packages/modules-runtime/errors/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import {cannotFindMeteorPackage} from './cannotFindMeteorPackage.js'; -import {cannotImport} from './cannotImportFrom.js'; - -export { - cannotFindMeteorPackage, - cannotImport -} From 1fe48b607fe683b5f2574cd7e8af2d24343c202a Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 22:10:13 -0300 Subject: [PATCH 013/114] Revert "chore(module-runtime): added files in package.js" This reverts commit 438b8f5eeaaa811c867576f4369699477f51f8b0. --- packages/modules-runtime-hot/installer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules-runtime-hot/installer.js b/packages/modules-runtime-hot/installer.js index 6ad56981a4..3c7c7df494 100644 --- a/packages/modules-runtime-hot/installer.js +++ b/packages/modules-runtime-hot/installer.js @@ -220,8 +220,8 @@ makeInstaller = function (options) { var file = fileResolve(filesByModuleId[this.id], id); if (file) return file.module.id; var error = makeMissingError(id); - if (fallback && isFunction(fallback)) { - return fallback(id, this.id, error); + if (fallback && isFunction(fallback.resolve)) { + return fallback.resolve(id, this.id, error); } throw error; }; From 4888a5dbb3b304fe416eb8fba32f4d23e0a36ef3 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 22:10:40 -0300 Subject: [PATCH 014/114] chore(modules-runtime): added files in package.js --- packages/modules-runtime/package.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 7afb76434b..8361e5073f 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -18,12 +18,16 @@ Package.onUse(function(api) { bare: true }); - api.addFiles("modern.js", "modern"); - api.addFiles("legacy.js", "legacy"); - api.addFiles("server.js", "server"); - api.addFiles("profile.js"); + api.addFiles(['./errors/cannotImportFrom.js', + './errors/cannotFindMeteorPackage.js']); + api.addFiles('modern.js', 'modern'); + api.addFiles('legacy.js', 'legacy'); + api.addFiles('server.js', 'server'); + api.addFiles('profile.js'); + api.addFiles('verifyErrors.js'); - api.export("meteorInstall"); + api.export('meteorInstall'); + api.export('verifyErrors'); }); Package.onTest(function(api) { From 49c5f9283dbc528a3952832012b13475eb3ab762 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 22:11:12 -0300 Subject: [PATCH 015/114] Revert "Revert "chore(module-runtime): added files in package.js"" This reverts commit 1fe48b607fe683b5f2574cd7e8af2d24343c202a. --- packages/modules-runtime-hot/installer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules-runtime-hot/installer.js b/packages/modules-runtime-hot/installer.js index 3c7c7df494..6ad56981a4 100644 --- a/packages/modules-runtime-hot/installer.js +++ b/packages/modules-runtime-hot/installer.js @@ -220,8 +220,8 @@ makeInstaller = function (options) { var file = fileResolve(filesByModuleId[this.id], id); if (file) return file.module.id; var error = makeMissingError(id); - if (fallback && isFunction(fallback.resolve)) { - return fallback.resolve(id, this.id, error); + if (fallback && isFunction(fallback)) { + return fallback(id, this.id, error); } throw error; }; From 156e86815c2b141411ca074109833955f796fc37 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 22:12:07 -0300 Subject: [PATCH 016/114] chore(verifyErrors): esnext -> es5 --- .../errors/cannotFindMeteorPackage.js | 4 +- .../errors/cannotImportFrom.js | 40 +++++++++++-------- packages/modules-runtime/verifyErrors.js | 22 +++++----- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/packages/modules-runtime/errors/cannotFindMeteorPackage.js b/packages/modules-runtime/errors/cannotFindMeteorPackage.js index c6575a4167..fd94ab813a 100644 --- a/packages/modules-runtime/errors/cannotFindMeteorPackage.js +++ b/packages/modules-runtime/errors/cannotFindMeteorPackage.js @@ -3,8 +3,8 @@ * @param id{string} * @return {Error} */ -export const cannotFindMeteorPackage = (id) => { - const packageName = id.split('/', 2)[1]; +cannotFindMeteorPackage = function(id) { + var packageName = id.split('/', 2)[1]; return new Error( 'Cannot find package "' + packageName + '". ' + 'Try "meteor add ' + packageName + '".' diff --git a/packages/modules-runtime/errors/cannotImportFrom.js b/packages/modules-runtime/errors/cannotImportFrom.js index 5700481139..967517282b 100644 --- a/packages/modules-runtime/errors/cannotImportFrom.js +++ b/packages/modules-runtime/errors/cannotImportFrom.js @@ -3,38 +3,44 @@ * @param id{string} * @return {{fromServer: (function(): Error), from: (function(location: string): boolean), fromClient: (function(): Error)}} */ -export const cannotImport = (id) => { +cannotImport = function (id) { /** * * @param location{string} * @return {boolean} */ - const from = - (location) => { + var from = + function (location) { if (!id) { return false; } return String(id) .split('/') - .some((subPath) => subPath === location); + .some(function (subPath) { + return subPath === location; + }); }; - const fromClient = - () => new Error( - `Unable to import on the client a module from a server directory: ${id} - (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories` - ); + var fromClient = + function () { + return new Error( + 'Unable to import on the client a module from a server directory: ' + + id + ' \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + ); + }; - const fromServer = - () => new Error( - `Unable to import on the server a module from a client directory: ${id} - (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories` - ); + var fromServer = + function () { + return new Error( + 'Unable to import on the server a module from a client directory: ' + + id + ' \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + ); + }; return { - from, - fromClient, - fromServer + from: from, + fromClient: fromClient, + fromServer: fromServer }; }; diff --git a/packages/modules-runtime/verifyErrors.js b/packages/modules-runtime/verifyErrors.js index 03df701a7c..3bcf983830 100644 --- a/packages/modules-runtime/verifyErrors.js +++ b/packages/modules-runtime/verifyErrors.js @@ -1,21 +1,21 @@ -import * as E from './errors'; /** * * @param id{string} + * @param parentId{string} + * @param err {Error} */ -export const verifyErrors = (id) => { +verifyErrors = function (id, parentId,err) { if (id && id.startsWith('meteor/')) { - throw E.cannotFindMeteorPackage(id); + throw cannotFindMeteorPackage(id); } - if (E.cannotImport(id) - .from('client')) { - throw E.cannotImport(id) - .fromClient(); + if (cannotImport(id).from('client')) { + throw cannotImport(id).fromClient(); } - if (E.cannotImport(id) - .from('server')) { - throw E.cannotImport(id) - .fromServer(); + if (cannotImport(id).from('server')) { + throw cannotImport(id).fromServer(); + } + if (err) { + throw err; } }; From ce179fa55ceb814578a1212d568169e7638c98d5 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 22:13:55 -0300 Subject: [PATCH 017/114] chore(modules.fallback): all goes to varifyErrors --- packages/modules-runtime-hot/legacy.js | 12 +++--------- packages/modules-runtime-hot/modern.js | 12 +++--------- packages/modules-runtime/legacy.js | 5 +---- packages/modules-runtime/modern.js | 5 +---- 4 files changed, 8 insertions(+), 26 deletions(-) diff --git a/packages/modules-runtime-hot/legacy.js b/packages/modules-runtime-hot/legacy.js index 77ef37d5c6..c4b1263ec4 100644 --- a/packages/modules-runtime-hot/legacy.js +++ b/packages/modules-runtime-hot/legacy.js @@ -1,3 +1,5 @@ +let verifyErrors = Package['modules-runtime'].verifyErrors; + meteorInstall = makeInstaller({ // On the client, make package resolution prefer the "browser" field of // package.json over the "module" field over the "main" field. @@ -8,15 +10,7 @@ meteorInstall = makeInstaller({ mainFields: ["browser", "main", "module"], fallback: function (id, parentId, error) { - if (id && id.startsWith('meteor/')) { - var packageName = id.split('/', 2)[1]; - throw new Error( - 'Cannot find package "' + packageName + '". ' + - 'Try "meteor add ' + packageName + '".' - ); - } - - throw error; + verifyErrors(id, parentId, error); } }); diff --git a/packages/modules-runtime-hot/modern.js b/packages/modules-runtime-hot/modern.js index 2445856d2d..48282a28f3 100644 --- a/packages/modules-runtime-hot/modern.js +++ b/packages/modules-runtime-hot/modern.js @@ -1,3 +1,5 @@ +let verifyErrors = Package['modules-runtime'].verifyErrors; + meteorInstall = makeInstaller({ // On the client, make package resolution prefer the "browser" field of // package.json over the "module" field over the "main" field. @@ -5,15 +7,7 @@ meteorInstall = makeInstaller({ mainFields: ["browser", "module", "main"], fallback: function (id, parentId, error) { - if (id && id.startsWith('meteor/')) { - var packageName = id.split('/', 2)[1]; - throw new Error( - 'Cannot find package "' + packageName + '". ' + - 'Try "meteor add ' + packageName + '".' - ); - } - - throw error; + verifyErrors(id, parentId, error); } }); diff --git a/packages/modules-runtime/legacy.js b/packages/modules-runtime/legacy.js index 1c226f6458..b75822a116 100644 --- a/packages/modules-runtime/legacy.js +++ b/packages/modules-runtime/legacy.js @@ -1,5 +1,3 @@ -import { verifyErrors } from './verifyErrors'; - meteorInstall = makeInstaller({ // On the client, make package resolution prefer the "browser" field of // package.json over the "module" field over the "main" field. @@ -10,7 +8,6 @@ meteorInstall = makeInstaller({ mainFields: ['browser', 'main', 'module'], fallback: function (id, parentId, error) { - verifyErrors(id); - throw error; + verifyErrors(id, parentId, error); } }); diff --git a/packages/modules-runtime/modern.js b/packages/modules-runtime/modern.js index 5461dbf5c3..06b6390a6f 100644 --- a/packages/modules-runtime/modern.js +++ b/packages/modules-runtime/modern.js @@ -1,5 +1,3 @@ -import { verifyErrors } from './verifyErrors'; - meteorInstall = makeInstaller({ // On the client, make package resolution prefer the "browser" field of // package.json over the "module" field over the "main" field. @@ -7,7 +5,6 @@ meteorInstall = makeInstaller({ mainFields: ['browser', 'module', 'main'], fallback: function (id, parentId, error) { - verifyErrors(id); - throw error; + verifyErrors(id, parentId, error); } }); From d4e9f85ee73420876df2a653bc9ccc7d996069ce Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 18 Aug 2022 22:14:18 -0300 Subject: [PATCH 018/114] tests(module-runtime): added verifyErrors tests --- packages/modules-runtime/modules-runtime-tests.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/modules-runtime/modules-runtime-tests.js b/packages/modules-runtime/modules-runtime-tests.js index 665c540a38..44da8b9a34 100644 --- a/packages/modules-runtime/modules-runtime-tests.js +++ b/packages/modules-runtime/modules-runtime-tests.js @@ -11,12 +11,12 @@ Tinytest.add('modules - meteor/ - error', function (test) { Tinytest.add('modules - client calling server', function (test) { const require = meteorInstall(); - test.throws(require('./../server/main.js'), `Unable to import on the client a module from a server directory: './../server/main.js' - (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`); + test.throws(require('./../server/main.js'), 'Unable to import on the client a module from a server directory: ' + id + ' \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`' + ); }); -Tinytest.add('modules - server - error', function (test) { +Tinytest.add('modules - server calling client', function (test) { const require = meteorInstall(); - test.throws(require('./../client/main.js'), `Unable to import on the server a module from a client directory: './../client/main.js' - (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`); + test.throws(require('./../client/main.js'), 'Unable to import on the server a module from a client directory: ' + id + ' \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`' + ); }); From b55ccd7cb9552205410d4182c671795644491bba Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 25 Aug 2022 13:48:27 -0300 Subject: [PATCH 019/114] test(adjusted test naming) --- .../modules-runtime/modules-runtime-tests.js | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/modules-runtime/modules-runtime-tests.js b/packages/modules-runtime/modules-runtime-tests.js index 44da8b9a34..4a569e5253 100644 --- a/packages/modules-runtime/modules-runtime-tests.js +++ b/packages/modules-runtime/modules-runtime-tests.js @@ -4,19 +4,23 @@ Tinytest.add('modules', function (test) { test.equal(typeof require, 'function'); }); -Tinytest.add('modules - meteor/ - error', function (test) { +Tinytest.add('modules.throwStandardError', function (test) { const require = meteorInstall(); test.throws(require('meteor/foo'), /Cannot find package "meteor". Try "meteor add meteor"./); }); -Tinytest.add('modules - client calling server', function (test) { - const require = meteorInstall(); - test.throws(require('./../server/main.js'), 'Unable to import on the client a module from a server directory: ' + id + ' \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`' - ); -}); +if (Meteor.isClient) { + Tinytest.add('modules.throwClientError', function (test) { + const require = meteorInstall(); + test.throws(require('./../server/main.js'), 'Unable to import on the client a module from a server directory: ../server/main.js \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`' + ); + }); +} -Tinytest.add('modules - server calling client', function (test) { - const require = meteorInstall(); - test.throws(require('./../client/main.js'), 'Unable to import on the server a module from a client directory: ' + id + ' \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`' - ); -}); +if (Meteor.isServer) { + Tinytest.add('modules.throwServerError', function (test) { + const require = meteorInstall(); + test.throws(require('./../client/main.js'), 'Unable to import on the server a module from a client directory: ../client/main.js \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`' + ); + }); +} From 550e752cb3b4032c27ff97fb1f9c76b50dfe0b2e Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 25 Aug 2022 15:37:42 -0300 Subject: [PATCH 020/114] tests(runtime-errors): adjusted the ci --- .../modules-runtime/modules-runtime-tests.js | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/modules-runtime/modules-runtime-tests.js b/packages/modules-runtime/modules-runtime-tests.js index 4a569e5253..d87150d995 100644 --- a/packages/modules-runtime/modules-runtime-tests.js +++ b/packages/modules-runtime/modules-runtime-tests.js @@ -5,22 +5,30 @@ Tinytest.add('modules', function (test) { }); Tinytest.add('modules.throwStandardError', function (test) { - const require = meteorInstall(); - test.throws(require('meteor/foo'), /Cannot find package "meteor". Try "meteor add meteor"./); + var require = meteorInstall(); + test.throws(() => { + require('meteor/foo') + }, 'Cannot find package "foo". Try "meteor add foo".'); }); if (Meteor.isClient) { Tinytest.add('modules.throwClientError', function (test) { - const require = meteorInstall(); - test.throws(require('./../server/main.js'), 'Unable to import on the client a module from a server directory: ../server/main.js \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`' + var require = meteorInstall(); + test.throws(() => { + require('./../server/main.js') + }, + 'Unable to import on the server a module from a client directory: "./../server/main.js" \n' + + ' (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' ); }); } if (Meteor.isServer) { Tinytest.add('modules.throwServerError', function (test) { - const require = meteorInstall(); - test.throws(require('./../client/main.js'), 'Unable to import on the server a module from a client directory: ../client/main.js \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories`' + var require = meteorInstall(); + test.throws(() => { + require('./../client/main.js') + }, "Cannot find module './../client/main.js'" ); }); } From 51d4d3dbc172afaa7ea3d83cfdfe0a46f6b46a94 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Thu, 25 Aug 2022 15:38:35 -0300 Subject: [PATCH 021/114] chore(runtime-errors): adjusted error text --- packages/modules-runtime/errors/cannotImportFrom.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/modules-runtime/errors/cannotImportFrom.js b/packages/modules-runtime/errors/cannotImportFrom.js index 967517282b..313cf3f222 100644 --- a/packages/modules-runtime/errors/cannotImportFrom.js +++ b/packages/modules-runtime/errors/cannotImportFrom.js @@ -24,8 +24,7 @@ cannotImport = function (id) { var fromClient = function () { return new Error( - 'Unable to import on the client a module from a server directory: ' + - id + ' \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + 'Unable to import on the client a module from a server directory: "' + id + '" \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' ); }; @@ -33,8 +32,7 @@ cannotImport = function (id) { var fromServer = function () { return new Error( - 'Unable to import on the server a module from a client directory: ' + - id + ' \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + 'Unable to import on the server a module from a client directory: "' + id + '" \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' ); }; From 1712c4c5aeb9dfdd1c01a7cbc087f9f3b9a459a0 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Sat, 27 Aug 2022 14:52:35 -0300 Subject: [PATCH 022/114] fix(errors): cross-boud. message --- packages/modules-runtime/errors/cannotImportFrom.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules-runtime/errors/cannotImportFrom.js b/packages/modules-runtime/errors/cannotImportFrom.js index 313cf3f222..82e68e84df 100644 --- a/packages/modules-runtime/errors/cannotImportFrom.js +++ b/packages/modules-runtime/errors/cannotImportFrom.js @@ -24,7 +24,7 @@ cannotImport = function (id) { var fromClient = function () { return new Error( - 'Unable to import on the client a module from a server directory: "' + id + '" \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + 'Unable to import on the server a module from a client directory: "' + id + '" \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' ); }; @@ -32,7 +32,7 @@ cannotImport = function (id) { var fromServer = function () { return new Error( - 'Unable to import on the server a module from a client directory: "' + id + '" \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + 'Unable to import on the client a module from a server directory: "' + id + '" \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' ); }; From 21e26678317827ba82d4107be780fc37ab5c2189 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Sat, 27 Aug 2022 14:53:08 -0300 Subject: [PATCH 023/114] tests(errors): created tests for client and server --- .../modules-runtime/modules-runtime-tests.js | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/modules-runtime/modules-runtime-tests.js b/packages/modules-runtime/modules-runtime-tests.js index d87150d995..b050747ab1 100644 --- a/packages/modules-runtime/modules-runtime-tests.js +++ b/packages/modules-runtime/modules-runtime-tests.js @@ -7,7 +7,7 @@ Tinytest.add('modules', function (test) { Tinytest.add('modules.throwStandardError', function (test) { var require = meteorInstall(); test.throws(() => { - require('meteor/foo') + require('meteor/foo'); }, 'Cannot find package "foo". Try "meteor add foo".'); }); @@ -15,20 +15,37 @@ if (Meteor.isClient) { Tinytest.add('modules.throwClientError', function (test) { var require = meteorInstall(); test.throws(() => { - require('./../server/main.js') + require('./../server/main.js'); }, - 'Unable to import on the server a module from a client directory: "./../server/main.js" \n' + + 'Unable to import on the client a module from a server directory: "./../server/main.js" \n' + + ' (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + ); + }); + Tinytest.add('modules.throwServerError', function (test) { + var require = meteorInstall(); + test.throws(() => { + require('./../client/main.js'); + }, + 'Unable to import on the server a module from a client directory: "./../client/main.js" \n' + ' (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' ); }); } if (Meteor.isServer) { + Tinytest.add('modules.throwClientError', function (test) { + var require = meteorInstall(); + test.throws(() => { + require('./../server/main.js'); + }, "Cannot find module './../server/main.js'" + ); + }); Tinytest.add('modules.throwServerError', function (test) { var require = meteorInstall(); test.throws(() => { - require('./../client/main.js') - }, "Cannot find module './../client/main.js'" + require('./../client/main.js'); + },"Cannot find module './../client/main.js'" ); }); } + From ebff7901e00116b64dd7a5a729157e447428f7e5 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:09:35 -0300 Subject: [PATCH 024/114] feat(importErrors): adjusted file name --- .../errors/{cannotImportFrom.js => importsErrors.js} | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename packages/modules-runtime/errors/{cannotImportFrom.js => importsErrors.js} (86%) diff --git a/packages/modules-runtime/errors/cannotImportFrom.js b/packages/modules-runtime/errors/importsErrors.js similarity index 86% rename from packages/modules-runtime/errors/cannotImportFrom.js rename to packages/modules-runtime/errors/importsErrors.js index 82e68e84df..09a34e2e21 100644 --- a/packages/modules-runtime/errors/cannotImportFrom.js +++ b/packages/modules-runtime/errors/importsErrors.js @@ -3,7 +3,7 @@ * @param id{string} * @return {{fromServer: (function(): Error), from: (function(location: string): boolean), fromClient: (function(): Error)}} */ -cannotImport = function (id) { +imports = function (id) { /** * * @param location{string} @@ -21,7 +21,7 @@ cannotImport = function (id) { }); }; - var fromClient = + var fromClientError = function () { return new Error( 'Unable to import on the server a module from a client directory: "' + id + '" \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' @@ -29,7 +29,7 @@ cannotImport = function (id) { }; - var fromServer = + var fromServerError = function () { return new Error( 'Unable to import on the client a module from a server directory: "' + id + '" \n (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' @@ -38,7 +38,7 @@ cannotImport = function (id) { return { from: from, - fromClient: fromClient, - fromServer: fromServer + fromClientError: fromClientError, + fromServerError: fromServerError }; }; From 7a73da98c862e54b407782aed26101e03242a04f Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:10:05 -0300 Subject: [PATCH 025/114] fix(module-runtime): adjusted file declaration --- packages/modules-runtime/package.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js index 8361e5073f..f7ba69f134 100644 --- a/packages/modules-runtime/package.js +++ b/packages/modules-runtime/package.js @@ -18,7 +18,7 @@ Package.onUse(function(api) { bare: true }); - api.addFiles(['./errors/cannotImportFrom.js', + api.addFiles(['./errors/importsErrors.js', './errors/cannotFindMeteorPackage.js']); api.addFiles('modern.js', 'modern'); api.addFiles('legacy.js', 'legacy'); From 8bfe20990bca668ef14c1721296e5e817505b05f Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:11:11 -0300 Subject: [PATCH 026/114] feat(module-runtime): added error validation to server.js --- packages/modules-runtime/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules-runtime/server.js b/packages/modules-runtime/server.js index 018a61e49b..b2d66af281 100644 --- a/packages/modules-runtime/server.js +++ b/packages/modules-runtime/server.js @@ -28,7 +28,7 @@ makeInstallerOptions.fallback = function (id, parentId, error) { return Npm.require(id, error); } } - + verifyErrors(id, parentId, error); throw error; }; From a385903a9f9890498d01e5bd9436af6bfa8c0e8b Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:17:01 -0300 Subject: [PATCH 027/114] chore: added extra validations --- packages/modules-runtime/verifyErrors.js | 26 ++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/modules-runtime/verifyErrors.js b/packages/modules-runtime/verifyErrors.js index 3bcf983830..0dfaaadcac 100644 --- a/packages/modules-runtime/verifyErrors.js +++ b/packages/modules-runtime/verifyErrors.js @@ -6,15 +6,33 @@ * @param err {Error} */ verifyErrors = function (id, parentId,err) { + if (id && id.startsWith('meteor/')) { throw cannotFindMeteorPackage(id); } - if (cannotImport(id).from('client')) { - throw cannotImport(id).fromClient(); + + if(!(id.startsWith('.') || id.startsWith('/'))) { + throw err; } - if (cannotImport(id).from('server')) { - throw cannotImport(id).fromServer(); + + if (id.endsWith('client') || id.endsWith('server')) { + // We don't know for sure what client wants to do so throw standard error + throw err; } + + if (imports(id).from('node_modules')) { + // Problem with node modules + throw err; + } + + // custom errors + if (Meteor.isServer && imports(id).from('client')) { + throw imports(id).fromClientError(); + } + if (Meteor.isClient && imports(id).from('server')) { + throw imports(id).fromServerError(); + } + if (err) { throw err; } From 0255d06728474352fe1105dd2a186d47cf7d466b Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:17:40 -0300 Subject: [PATCH 028/114] tests(module-runtime): adjusted test organization --- .../modules-runtime/modules-runtime-tests.js | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/modules-runtime/modules-runtime-tests.js b/packages/modules-runtime/modules-runtime-tests.js index b050747ab1..2d771efcc6 100644 --- a/packages/modules-runtime/modules-runtime-tests.js +++ b/packages/modules-runtime/modules-runtime-tests.js @@ -4,24 +4,24 @@ Tinytest.add('modules', function (test) { test.equal(typeof require, 'function'); }); -Tinytest.add('modules.throwStandardError', function (test) { +Tinytest.add('errors - standard', function (test) { var require = meteorInstall(); test.throws(() => { require('meteor/foo'); }, 'Cannot find package "foo". Try "meteor add foo".'); }); -if (Meteor.isClient) { - Tinytest.add('modules.throwClientError', function (test) { + + +if (Meteor.isServer) { + Tinytest.add('server - throwClientError', function (test) { var require = meteorInstall(); test.throws(() => { require('./../server/main.js'); - }, - 'Unable to import on the client a module from a server directory: "./../server/main.js" \n' + - ' (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + }, "Cannot find module './../server/main.js'" ); }); - Tinytest.add('modules.throwServerError', function (test) { + Tinytest.add('server - throwServerError', function (test) { var require = meteorInstall(); test.throws(() => { require('./../client/main.js'); @@ -32,20 +32,22 @@ if (Meteor.isClient) { }); } -if (Meteor.isServer) { - Tinytest.add('modules.throwClientError', function (test) { +if (Meteor.isClient) { + Tinytest.add('client - throwClientError', function (test) { var require = meteorInstall(); test.throws(() => { require('./../server/main.js'); - }, "Cannot find module './../server/main.js'" + }, + 'Unable to import on the client a module from a server directory: "./../server/main.js" \n' + + ' (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' ); }); - Tinytest.add('modules.throwServerError', function (test) { + Tinytest.add('client - throwServerError', function (test) { var require = meteorInstall(); test.throws(() => { require('./../client/main.js'); - },"Cannot find module './../client/main.js'" - ); + }, "Cannot find module './../client/main.js'"); }); } + From 4317e423f10035da868e4031bb39c54cf555feff Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:18:15 -0300 Subject: [PATCH 029/114] tests(module-runtime): added node_module error validation --- packages/modules-runtime/modules-runtime-tests.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/modules-runtime/modules-runtime-tests.js b/packages/modules-runtime/modules-runtime-tests.js index 2d771efcc6..267b059520 100644 --- a/packages/modules-runtime/modules-runtime-tests.js +++ b/packages/modules-runtime/modules-runtime-tests.js @@ -11,7 +11,12 @@ Tinytest.add('errors - standard', function (test) { }, 'Cannot find package "foo". Try "meteor add foo".'); }); - +Tinytest.add('errors - node_modules', function (test) { + var require = meteorInstall(); + test.throws(() => { + require('./node_modules/foo'); + }, "Cannot find module './node_modules/foo'"); +}); if (Meteor.isServer) { Tinytest.add('server - throwClientError', function (test) { From 2fcd55827dd7914d47a7dd225d248d17e3fc3015 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Fri, 2 Sep 2022 12:36:51 -0300 Subject: [PATCH 030/114] fix(errors): adjusted how it handles paths --- packages/modules-runtime/errors/importsErrors.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/modules-runtime/errors/importsErrors.js b/packages/modules-runtime/errors/importsErrors.js index 09a34e2e21..d82f62cb1f 100644 --- a/packages/modules-runtime/errors/importsErrors.js +++ b/packages/modules-runtime/errors/importsErrors.js @@ -14,11 +14,13 @@ imports = function (id) { if (!id) { return false; } - return String(id) - .split('/') - .some(function (subPath) { - return subPath === location; - }); + + // XXX: removed last part of path so that it does not trigger false positives + var path = String(id).split('/').slice(0, -1); + + return path.some(function (subPath) { + return subPath === location; + }); }; var fromClientError = From c73fea7ec4485d6db261afbc6fc94d2f57b8907c Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Fri, 2 Sep 2022 12:37:15 -0300 Subject: [PATCH 031/114] tests(errors): added case when there is client & server --- .../modules-runtime/modules-runtime-tests.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/modules-runtime/modules-runtime-tests.js b/packages/modules-runtime/modules-runtime-tests.js index 267b059520..78abd74037 100644 --- a/packages/modules-runtime/modules-runtime-tests.js +++ b/packages/modules-runtime/modules-runtime-tests.js @@ -26,6 +26,15 @@ if (Meteor.isServer) { }, "Cannot find module './../server/main.js'" ); }); + Tinytest.add('server - client and server in path', function (test) { + var require = meteorInstall(); + test.throws(() => { + require('/client/graphql/client'); + }, + 'Unable to import on the server a module from a client directory: "/client/graphql/client" \n' + + ' (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + ); + }); Tinytest.add('server - throwServerError', function (test) { var require = meteorInstall(); test.throws(() => { @@ -47,6 +56,15 @@ if (Meteor.isClient) { ' (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' ); }); + Tinytest.add('client - client and server in path', function (test) { + var require = meteorInstall(); + test.throws(() => { + require('/server/graphql/client'); + }, + 'Unable to import on the client a module from a server directory: "/server/graphql/client" \n' + + ' (cross-boundary import) see: https://guide.meteor.com/structure.html#special-directories' + ); + }); Tinytest.add('client - throwServerError', function (test) { var require = meteorInstall(); test.throws(() => { From 71927cd140cf901b231af2ab32df52f28f3913a5 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com> Date: Fri, 2 Sep 2022 12:37:37 -0300 Subject: [PATCH 032/114] fix(errors): moved logic to function imports --- packages/modules-runtime/verifyErrors.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/modules-runtime/verifyErrors.js b/packages/modules-runtime/verifyErrors.js index 0dfaaadcac..d0fe827e8d 100644 --- a/packages/modules-runtime/verifyErrors.js +++ b/packages/modules-runtime/verifyErrors.js @@ -15,11 +15,6 @@ verifyErrors = function (id, parentId,err) { throw err; } - if (id.endsWith('client') || id.endsWith('server')) { - // We don't know for sure what client wants to do so throw standard error - throw err; - } - if (imports(id).from('node_modules')) { // Problem with node modules throw err; From f5033ac5fa3f7afb2b732a2ea34a024b6f1fb645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Mon, 5 Sep 2022 17:46:28 +0200 Subject: [PATCH 033/114] Add types for accounts-base package --- packages/accounts-base/accounts-base.d.ts | 326 ++++++++++++++++++++++ packages/accounts-base/package-types.json | 3 + packages/accounts-base/package.js | 2 + 3 files changed, 331 insertions(+) create mode 100644 packages/accounts-base/accounts-base.d.ts create mode 100644 packages/accounts-base/package-types.json diff --git a/packages/accounts-base/accounts-base.d.ts b/packages/accounts-base/accounts-base.d.ts new file mode 100644 index 0000000000..923625be79 --- /dev/null +++ b/packages/accounts-base/accounts-base.d.ts @@ -0,0 +1,326 @@ +import { Mongo } from 'meteor/mongo'; +import { Meteor } from 'meteor/meteor'; + +export interface URLS { + resetPassword: (token: string) => string; + verifyEmail: (token: string) => string; + enrollAccount: (token: string) => string; +} + +export interface EmailFields { + from?: ((user: Meteor.User) => string) | undefined; + subject?: ((user: Meteor.User) => string) | undefined; + text?: ((user: Meteor.User, url: string) => string) | undefined; + html?: ((user: Meteor.User, url: string) => string) | undefined; +} + +export namespace Accounts { + var urls: URLS; + + function user(options?: { + fields?: Mongo.FieldSpecifier | undefined; + }): Meteor.User | null; + + function userId(): string | null; + + function createUser( + options: { + username?: string | undefined; + email?: string | undefined; + password?: string | undefined; + profile?: Object | undefined; + }, + callback?: (error?: Error | Meteor.Error | Meteor.TypedError) => void + ): string; + + function config(options: { + sendVerificationEmail?: boolean | undefined; + forbidClientAccountCreation?: boolean | undefined; + restrictCreationByEmailDomain?: string | Function | undefined; + loginExpirationInDays?: number | undefined; + oauthSecretKey?: string | undefined; + passwordResetTokenExpirationInDays?: number | undefined; + passwordEnrollTokenExpirationInDays?: number | undefined; + ambiguousErrorMessages?: boolean | undefined; + defaultFieldSelector?: { [key: string]: 0 | 1 } | undefined; + }): void; + + function onLogin( + func: Function + ): { + stop: () => void; + }; + + function onLoginFailure( + func: Function + ): { + stop: () => void; + }; + + function loginServicesConfigured(): boolean; + + function onPageLoadLogin(func: Function): void; +} + +export namespace Accounts { + function changePassword( + oldPassword: string, + newPassword: string, + callback?: (error?: Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function forgotPassword( + options: { email?: string | undefined }, + callback?: (error?: Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function resetPassword( + token: string, + newPassword: string, + callback?: (error?: Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function verifyEmail( + token: string, + callback?: (error?: Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function onEmailVerificationLink(callback: Function): void; + + function onEnrollmentLink(callback: Function): void; + + function onResetPasswordLink(callback: Function): void; + + function loggingIn(): boolean; + + function loggingOut(): boolean; + + function logout( + callback?: (error?: Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function logoutOtherClients( + callback?: (error?: Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + var ui: { + config(options: { + requestPermissions?: Object | undefined; + requestOfflineToken?: Object | undefined; + forceApprovalPrompt?: Object | undefined; + passwordSignupFields?: string | undefined; + }): void; + }; +} + +export interface Header { + [id: string]: string; +} + +export interface EmailTemplates { + from: string; + siteName: string; + headers?: Header | undefined; + resetPassword: EmailFields; + enrollAccount: EmailFields; + verifyEmail: EmailFields; +} + +export namespace Accounts { + var emailTemplates: EmailTemplates; + + function addEmail(userId: string, newEmail: string, verified?: boolean): void; + + function removeEmail(userId: string, email: string): void; + + function onCreateUser( + func: (options: { profile?: {} | undefined }, user: Meteor.User) => void + ): void; + + function findUserByEmail( + email: string, + options?: { fields?: Mongo.FieldSpecifier | undefined } + ): Meteor.User | null | undefined; + + function findUserByUsername( + username: string, + options?: { fields?: Mongo.FieldSpecifier | undefined } + ): Meteor.User | null | undefined; + + function sendEnrollmentEmail( + userId: string, + email?: string, + extraTokenData?: Record, + extraParams?: Record + ): void; + + function sendResetPasswordEmail( + userId: string, + email?: string, + extraTokenData?: Record, + extraParams?: Record + ): void; + + function sendVerificationEmail( + userId: string, + email?: string, + extraTokenData?: Record, + extraParams?: Record + ): void; + + function setUsername(userId: string, newUsername: string): void; + + function setPassword( + userId: string, + newPassword: string, + options?: { logout?: Object | undefined } + ): void; + + function validateNewUser(func: Function): boolean; + + function validateLoginAttempt( + func: Function + ): { + stop: () => void; + }; + + function _hashPassword( + password: string + ): { digest: string; algorithm: string }; + + interface IValidateLoginAttemptCbOpts { + type: string; + allowed: boolean; + error: Meteor.Error; + user: Meteor.User; + connection: Meteor.Connection; + methodName: string; + methodArguments: any[]; + } +} + +export namespace Accounts { + function onLogout(func: Function): void; +} + +export namespace Accounts { + function onLogout( + func: (options: { + user: Meteor.User; + connection: Meteor.Connection; + }) => void + ): void; +} + +export namespace Accounts { + interface LoginMethodOptions { + /** + * The method to call (default 'login') + */ + methodName?: string | undefined; + /** + * The arguments for the method + */ + methodArguments?: any[] | undefined; + /** + * If provided, will be called with the result of the + * method. If it throws, the client will not be logged in (and + * its error will be passed to the callback). + */ + validateResult?: Function | undefined; + /** + * Will be called with no arguments once the user is fully + * logged in, or with the error on error. + */ + userCallback?: ((err?: any) => void) | undefined; + } + + /** + * + * Call a login method on the server. + * + * A login method is a method which on success calls `this.setUserId(id)` and + * `Accounts._setLoginToken` on the server and returns an object with fields + * 'id' (containing the user id), 'token' (containing a resume token), and + * optionally `tokenExpires`. + * + * This function takes care of: + * - Updating the Meteor.loggingIn() reactive data source + * - Calling the method in 'wait' mode + * - On success, saving the resume token to localStorage + * - On success, calling Accounts.connection.setUserId() + * - Setting up an onReconnect handler which logs in with + * the resume token + * + * Options: + * - methodName: The method to call (default 'login') + * - methodArguments: The arguments for the method + * - validateResult: If provided, will be called with the result of the + * method. If it throws, the client will not be logged in (and + * its error will be passed to the callback). + * - userCallback: Will be called with no arguments once the user is fully + * logged in, or with the error on error. + * + * */ + function callLoginMethod(options: LoginMethodOptions): void; + + /** + * + * The main entry point for auth packages to hook in to login. + * + * A login handler is a login method which can return `undefined` to + * indicate that the login request is not handled by this handler. + * + * @param name {String} Optional. The service name, used by default + * if a specific service name isn't returned in the result. + * + * @param handler {Function} A function that receives an options object + * (as passed as an argument to the `login` method) and returns one of: + * - `undefined`, meaning don't handle; + * - a login method result object + **/ + function registerLoginHandler( + name: string, + handler: (options: any) => undefined | Object + ): void; + + type Password = + | string + | { + digest: string; + algorithm: 'sha-256'; + }; + + /** + * + * Check whether the provided password matches the bcrypt'ed password in + * the database user record. `password` can be a string (in which case + * it will be run through SHA256 before bcrypt) or an object with + * properties `digest` and `algorithm` (in which case we bcrypt + * `password.digest`). + */ + function _checkPassword( + user: Meteor.User, + password: Password + ): { userId: string; error?: any }; +} + +export namespace Accounts { + type StampedLoginToken = { + token: string; + when: Date; + }; + type HashedStampedLoginToken = { + hashedToken: string; + when: Date; + }; + + function _generateStampedLoginToken(): StampedLoginToken; + function _hashStampedToken(token: StampedLoginToken): HashedStampedLoginToken; + function _insertHashedLoginToken( + userId: string, + token: HashedStampedLoginToken, + query?: Mongo.Selector | Mongo.ObjectID | string + ): void; + function _hashLoginToken(token: string): string; +} diff --git a/packages/accounts-base/package-types.json b/packages/accounts-base/package-types.json new file mode 100644 index 0000000000..e948b74664 --- /dev/null +++ b/packages/accounts-base/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "__types/accounts-base.d.ts" +} diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js index 32a6df946c..ed41554770 100644 --- a/packages/accounts-base/package.js +++ b/packages/accounts-base/package.js @@ -48,6 +48,8 @@ Package.onUse(api => { // modules that import the accounts-base package. api.mainModule('server_main.js', 'server'); api.mainModule('client_main.js', 'client'); + + api.addAssets('accounts-base.d.ts', ['client', 'server']); }); Package.onTest(api => { From 43b3b7868dac3837b90e36aec9968813bc8b21f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Mon, 5 Sep 2022 18:06:03 +0200 Subject: [PATCH 034/114] Add types for browser-policy-common package --- .../browser-policy-common.d.ts | 38 +++++++++++++++++++ .../browser-policy-common/package-types.json | 3 ++ packages/browser-policy-common/package.js | 1 + 3 files changed, 42 insertions(+) create mode 100644 packages/browser-policy-common/browser-policy-common.d.ts create mode 100644 packages/browser-policy-common/package-types.json diff --git a/packages/browser-policy-common/browser-policy-common.d.ts b/packages/browser-policy-common/browser-policy-common.d.ts new file mode 100644 index 0000000000..0cfa8678a3 --- /dev/null +++ b/packages/browser-policy-common/browser-policy-common.d.ts @@ -0,0 +1,38 @@ +export namespace BrowserPolicy { + var framing: { + disallow(): void; + restrictToOrigin(origin: string): void; + allowAll(): void; + }; + + var content: { + allowEval(): void; + allowInlineStyles(): void; + allowInlineScripts(): void; + allowSameOriginForAll(): void; + allowDataUrlForAll(): void; + allowOriginForAll(origin: string): void; + allowImageOrigin(origin: string): void; + allowMediaOrigin(origin: string): void; + allowFontOrigin(origin: string): void; + allowStyleOrigin(origin: string): void; + allowScriptOrigin(origin: string): void; + allowFrameOrigin(origin: string): void; + allowFrameAncestorsOrigin(origin: string): void; + allowContentTypeSniffing(): void; + allowAllContentOrigin(): void; + allowAllContentDataUrl(): void; + allowAllContentSameOrigin(): void; + allowConnectOrigin(origin: string): void; + allowObjectOrigin(origin: string): void; + + disallowAll(): void; + disallowInlineStyles(): void; + disallowEval(): void; + disallowInlineScripts(): void; + disallowFont(): void; + disallowObject(): void; + disallowAllContent(): void; + disallowConnect(): void; + }; +} diff --git a/packages/browser-policy-common/package-types.json b/packages/browser-policy-common/package-types.json new file mode 100644 index 0000000000..1b2482b244 --- /dev/null +++ b/packages/browser-policy-common/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "browser-policy-common.d.ts" +} diff --git a/packages/browser-policy-common/package.js b/packages/browser-policy-common/package.js index 85c2554c3e..9f53f0a238 100644 --- a/packages/browser-policy-common/package.js +++ b/packages/browser-policy-common/package.js @@ -7,4 +7,5 @@ Package.onUse(function (api) { api.use('webapp', 'server'); api.addFiles('browser-policy-common.js', 'server'); api.export('BrowserPolicy', 'server'); + api.addAssets('browser-policy-common.d.ts', ['client', 'server']); }); From 0844cfd5cbf05d8fc393d69c90cd801c726b320e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Mon, 5 Sep 2022 18:21:57 +0200 Subject: [PATCH 035/114] Add types for check package --- packages/check/check.d.ts | 92 +++++++++++++++++++++++++++++++ packages/check/package-types.json | 3 + packages/check/package.js | 2 + 3 files changed, 97 insertions(+) create mode 100644 packages/check/check.d.ts create mode 100644 packages/check/package-types.json diff --git a/packages/check/check.d.ts b/packages/check/check.d.ts new file mode 100644 index 0000000000..4790890b9d --- /dev/null +++ b/packages/check/check.d.ts @@ -0,0 +1,92 @@ +/** + * The namespace for all Match types and methods. + */ +export namespace Match { + interface Matcher { + _meteorCheckMatcherBrand: void; + } + // prettier-ignore + export type Pattern = + typeof String | + typeof Number | + typeof Boolean | + typeof Object | + typeof Function | + (new (...args: any[]) => any) | + undefined | null | string | number | boolean | + [Pattern] | + {[key: string]: Pattern} | + Matcher; + // prettier-ignore + export type PatternMatch = + T extends Matcher ? U : + T extends typeof String ? string : + T extends typeof Number ? number : + T extends typeof Boolean ? boolean : + T extends typeof Object ? object : + T extends typeof Function ? Function : + T extends undefined | null | string | number | boolean ? T : + T extends new (...args: any[]) => infer U ? U : + T extends [Pattern] ? PatternMatch[] : + T extends {[key: string]: Pattern} ? {[K in keyof T]: PatternMatch} : + unknown; + + /** Matches any value. */ + var Any: Matcher; + /** Matches a signed 32-bit integer. Doesn’t match `Infinity`, `-Infinity`, or `NaN`. */ + var Integer: Matcher; + + /** + * Matches either `undefined`, `null`, or pattern. If used in an object, matches only if the key is not set as opposed to the value being set to `undefined` or `null`. This set of conditions + * was chosen because `undefined` arguments to Meteor Methods are converted to `null` when sent over the wire. + */ + function Maybe( + pattern: T + ): Matcher | undefined | null>; + + /** Behaves like `Match.Maybe` except it doesn’t accept `null`. If used in an object, the behavior is identical to `Match.Maybe`. */ + function Optional( + pattern: T + ): Matcher | undefined>; + + /** Matches an Object with the given keys; the value may also have other keys with arbitrary values. */ + function ObjectIncluding( + dico: T + ): Matcher>; + + /** Matches any value that matches at least one of the provided patterns. */ + function OneOf( + ...patterns: T + ): Matcher>; + + /** + * Calls the function condition with the value as the argument. If condition returns true, this matches. If condition throws a `Match.Error` or returns false, this fails. If condition throws + * any other error, that error is thrown from the call to `check` or `Match.test`. + */ + function Where(condition: (val: any) => val is T): Matcher; + function Where(condition: (val: any) => boolean): Matcher; + + /** + * Returns true if the value matches the pattern. + * @param value The value to check + * @param pattern The pattern to match `value` against + */ + function test( + value: any, + pattern: T + ): value is PatternMatch; +} + +/** + * Check that a value matches a pattern. + * If the value does not match the pattern, throw a `Match.Error`. + * + * Particularly useful to assert that arguments to a function have the right + * types and structure. + * @param value The value to check + * @param pattern The pattern to match `value` against + */ +export function check( + value: any, + pattern: T +): asserts value is Match.PatternMatch; diff --git a/packages/check/package-types.json b/packages/check/package-types.json new file mode 100644 index 0000000000..19e3d36ba9 --- /dev/null +++ b/packages/check/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "check.d.ts" +} diff --git a/packages/check/package.js b/packages/check/package.js index ee260f6f24..fa6b3a5ecd 100644 --- a/packages/check/package.js +++ b/packages/check/package.js @@ -7,6 +7,8 @@ Package.onUse(api => { api.use('ecmascript'); api.use('ejson'); + api.addAssets('check.d.ts', ['client', 'server']); + api.mainModule('match.js'); api.export('check'); From 8e7e0fce2c0f1ee3e8096664797281e068400c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Mon, 5 Sep 2022 18:24:43 +0200 Subject: [PATCH 036/114] Add types for ddp package --- packages/ddp/ddp.d.ts | 65 +++++++++++++++++++++++++++++++++ packages/ddp/package-types.json | 3 ++ packages/ddp/package.js | 2 + 3 files changed, 70 insertions(+) create mode 100644 packages/ddp/ddp.d.ts create mode 100644 packages/ddp/package-types.json diff --git a/packages/ddp/ddp.d.ts b/packages/ddp/ddp.d.ts new file mode 100644 index 0000000000..199adb3d55 --- /dev/null +++ b/packages/ddp/ddp.d.ts @@ -0,0 +1,65 @@ +import { Meteor } from 'meteor/meteor'; + +export namespace DDP { + interface DDPStatic { + subscribe(name: string, ...rest: any[]): Meteor.SubscriptionHandle; + call(method: string, ...parameters: any[]): any; + apply(method: string, ...parameters: any[]): any; + methods(IMeteorMethodsDictionary: any): any; + status(): DDPStatus; + reconnect(): void; + disconnect(): void; + onReconnect(): void; + } + + function _allSubscriptionsReady(): boolean; + + type Status = 'connected' | 'connecting' | 'failed' | 'waiting' | 'offline'; + + interface DDPStatus { + connected: boolean; + status: Status; + retryCount: number; + retryTime?: number | undefined; + reason?: string | undefined; + } + + function connect(url: string): DDPStatic; +} + +export namespace DDPCommon { + interface MethodInvocationOptions { + userId: string | null; + setUserId?: ((newUserId: string) => void) | undefined; + isSimulation: boolean; + connection: Meteor.Connection; + randomSeed: string; + } + + /** The state for a single invocation of a method, referenced by this inside a method definition. */ + interface MethodInvocation { + new (options: MethodInvocationOptions): MethodInvocation; + /** + * Call inside a method invocation. Allow subsequent method from this client to begin running in a new fiber. + */ + unblock(): void; + /** + * Set the logged in user. + * @param userId The value that should be returned by `userId` on this connection. + */ + setUserId(userId: string | null): void; + /** + * The id of the user that made this method call, or `null` if no user was logged in. + */ + userId: string | null; + /** + * Access inside a method invocation. Boolean value, true if this invocation is a stub. + */ + isSimulation: boolean; + /** + * Access inside a method invocation. The [connection](#meteor_onconnection) that this method was received on. `null` if the method is not associated with a connection, eg. a server + * initiated method call. Calls to methods made from a server method which was in turn initiated from the client share the same `connection`. + */ + connection: Meteor.Connection; + } +} diff --git a/packages/ddp/package-types.json b/packages/ddp/package-types.json new file mode 100644 index 0000000000..31646e57c4 --- /dev/null +++ b/packages/ddp/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "ddp.d.ts" +} diff --git a/packages/ddp/package.js b/packages/ddp/package.js index 49cace9e05..108285a4d0 100644 --- a/packages/ddp/package.js +++ b/packages/ddp/package.js @@ -7,6 +7,8 @@ Package.onUse(function (api) { api.use(['ddp-client'], ['client', 'server']); api.use(['ddp-server'], 'server'); + api.addAssets('ddp.d.ts', ['client', 'server']); + api.export('DDP'); api.export('DDPServer', 'server'); From d6403ac5440536bd8cc1527b1798976fdeb44e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Mon, 5 Sep 2022 18:25:00 +0200 Subject: [PATCH 037/114] Add types for ddp-rate-limiter package --- packages/ddp-rate-limiter/ddp-rate-limiter.d.ts | 17 +++++++++++++++++ packages/ddp-rate-limiter/package-types.json | 3 +++ packages/ddp-rate-limiter/package.js | 1 + 3 files changed, 21 insertions(+) create mode 100644 packages/ddp-rate-limiter/ddp-rate-limiter.d.ts create mode 100644 packages/ddp-rate-limiter/package-types.json diff --git a/packages/ddp-rate-limiter/ddp-rate-limiter.d.ts b/packages/ddp-rate-limiter/ddp-rate-limiter.d.ts new file mode 100644 index 0000000000..fbce221f5a --- /dev/null +++ b/packages/ddp-rate-limiter/ddp-rate-limiter.d.ts @@ -0,0 +1,17 @@ +export namespace DDPRateLimiter { + interface Matcher { + type?: string | ((type: string) => boolean) | undefined; + name?: string | ((name: string) => boolean) | undefined; + userId?: string | ((userId: string) => boolean) | undefined; + connectionId?: string | ((connectionId: string) => boolean) | undefined; + clientAddress?: string | ((clientAddress: string) => boolean) | undefined; + } + + function addRule( + matcher: Matcher, + numRequests: number, + timeInterval: number + ): string; + + function removeRule(ruleId: string): boolean; +} diff --git a/packages/ddp-rate-limiter/package-types.json b/packages/ddp-rate-limiter/package-types.json new file mode 100644 index 0000000000..34869b7735 --- /dev/null +++ b/packages/ddp-rate-limiter/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "ddp-rate-limiter.d.ts" +} diff --git a/packages/ddp-rate-limiter/package.js b/packages/ddp-rate-limiter/package.js index a38d55936e..3144f3d5ec 100644 --- a/packages/ddp-rate-limiter/package.js +++ b/packages/ddp-rate-limiter/package.js @@ -14,6 +14,7 @@ Package.describe({ Package.onUse(function(api) { api.use('rate-limit', 'server'); api.use('ecmascript'); + api.addAssets('ddp-rate-limiter.d.ts', ['client', 'server']); api.export('DDPRateLimiter', 'server'); api.mainModule('ddp-rate-limiter.js', 'server'); }); From 7422d4186668dcfc76e2e2143a231d66bbca9bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Mon, 5 Sep 2022 18:27:05 +0200 Subject: [PATCH 038/114] Add types for email package --- packages/email/email.d.ts | 43 +++++++++++++++++++++++++++++++ packages/email/package-types.json | 3 +++ packages/email/package.js | 1 + 3 files changed, 47 insertions(+) create mode 100644 packages/email/email.d.ts create mode 100644 packages/email/package-types.json diff --git a/packages/email/email.d.ts b/packages/email/email.d.ts new file mode 100644 index 0000000000..6b9a356721 --- /dev/null +++ b/packages/email/email.d.ts @@ -0,0 +1,43 @@ +export namespace Email { + interface EmailOptions { + from?: string | undefined; + to?: string | string[] | undefined; + cc?: string | string[] | undefined; + bcc?: string | string[] | undefined; + replyTo?: string | string[] | undefined; + subject?: string | undefined; + text?: string | undefined; + html?: string | undefined; + headers?: Object | undefined; + attachments?: Object[] | undefined; + mailComposer?: MailComposer | undefined; + } + + interface CustomEmailOptions extends EmailOptions { + packageSettings?: unknown; + } + + function send(options: EmailOptions): void; + function hookSend(fn: (options: EmailOptions) => boolean): void; + function customTransport(fn: (options: CustomEmailOptions) => void): void; +} + +export interface MailComposerOptions { + escapeSMTP: boolean; + encoding: string; + charset: string; + keepBcc: boolean; + forceEmbeddedImages: boolean; +} + +export var MailComposer: MailComposerStatic; +export interface MailComposerStatic { + new (options: MailComposerOptions): MailComposer; +} + +export interface MailComposer { + addHeader(name: string, value: string): void; + setMessageOption(from: string, to: string, body: string, html: string): void; + streamMessage(): void; + pipe(stream: any /** fs.WriteStream **/): void; +} diff --git a/packages/email/package-types.json b/packages/email/package-types.json new file mode 100644 index 0000000000..de228d2fc5 --- /dev/null +++ b/packages/email/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "email.d.ts" +} diff --git a/packages/email/package.js b/packages/email/package.js index 3fb07dae92..b3f6de4894 100644 --- a/packages/email/package.js +++ b/packages/email/package.js @@ -10,6 +10,7 @@ Npm.depends({ Package.onUse(function(api) { api.use(['ecmascript', 'logging', 'callback-hook'], 'server'); + api.addAssets('email.d.ts', ['client', 'server']); api.mainModule('email.js', 'server'); api.export(['Email', 'EmailInternals'], 'server'); api.export('EmailTest', 'server', { testOnly: true }); From 350b964c7829e07a268dbaab445ec75d5d83f6b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Mon, 5 Sep 2022 18:36:40 +0200 Subject: [PATCH 039/114] Add types for hot-module-replacement package --- .../hot-module-replacement.d.ts | 14 ++++++++++++++ packages/hot-module-replacement/package-types.json | 3 +++ packages/hot-module-replacement/package.js | 2 ++ 3 files changed, 19 insertions(+) create mode 100644 packages/hot-module-replacement/hot-module-replacement.d.ts create mode 100644 packages/hot-module-replacement/package-types.json diff --git a/packages/hot-module-replacement/hot-module-replacement.d.ts b/packages/hot-module-replacement/hot-module-replacement.d.ts new file mode 100644 index 0000000000..3d92dfc754 --- /dev/null +++ b/packages/hot-module-replacement/hot-module-replacement.d.ts @@ -0,0 +1,14 @@ +export interface Module { + readonly hot?: { + accept(): void; + decline(): void; + dispose(callback: (data: object) => void): void; + data: object | null; + onRequire(callbacks: { + before?(requiredModule: Module, parentId: string): T; + after?(requiredModule: Module, data: T): void; + }): void; + }; +} + +export var module: NodeJS.Module; diff --git a/packages/hot-module-replacement/package-types.json b/packages/hot-module-replacement/package-types.json new file mode 100644 index 0000000000..b11c5dadfe --- /dev/null +++ b/packages/hot-module-replacement/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "hot-module-replacement.d.ts" +} diff --git a/packages/hot-module-replacement/package.js b/packages/hot-module-replacement/package.js index 2d92f97b09..b3986feebc 100644 --- a/packages/hot-module-replacement/package.js +++ b/packages/hot-module-replacement/package.js @@ -11,6 +11,8 @@ Package.onUse(function(api) { api.use('meteor'); api.use('hot-code-push', { unordered: true }); + api.addAssets('hot-module-replacement.d.ts', ['client', 'server']); + // Provides polyfills needed by Meteor.absoluteUrl in legacy browsers api.use('ecmascript-runtime-client', { weak: true }); From f51c62c0e4a395e136a83bacb1be72c79c3ad661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Mon, 5 Sep 2022 18:37:09 +0200 Subject: [PATCH 040/114] Add types for meteor package --- packages/meteor/meteor.d.ts | 504 +++++++++++++++++++++++++++++ packages/meteor/package-types.json | 3 + packages/meteor/package.js | 2 + 3 files changed, 509 insertions(+) create mode 100644 packages/meteor/meteor.d.ts create mode 100644 packages/meteor/package-types.json diff --git a/packages/meteor/meteor.d.ts b/packages/meteor/meteor.d.ts new file mode 100644 index 0000000000..0a482c0aa9 --- /dev/null +++ b/packages/meteor/meteor.d.ts @@ -0,0 +1,504 @@ +import { Mongo } from 'meteor/mongo'; +import { EJSONable, EJSONableProperty } from 'meteor/ejson'; +import { Blaze } from 'meteor/blaze'; +import { DDP } from 'meteor/ddp'; + +export type global_Error = Error; + +export namespace Meteor { + /** Global props **/ + /** True if running in client environment. */ + var isClient: boolean; + /** True if running in a Cordova mobile environment. */ + var isCordova: boolean; + /** True if running in server environment. */ + var isServer: boolean; + /** True if running in production environment. */ + var isProduction: boolean; + /** + * `Meteor.release` is a string containing the name of the release with which the project was built (for example, `"1.2.3"`). It is `undefined` if the project was built using a git checkout + * of Meteor. + */ + var release: string; + /** Global props **/ + + /** Settings **/ + interface Settings { + public: { [id: string]: any }; + [id: string]: any; + } + /** + * `Meteor.settings` contains deployment-specific configuration options. You can initialize settings by passing the `--settings` option (which takes the name of a file containing JSON data) + * to `meteor run` or `meteor deploy`. When running your server directly (e.g. from a bundle), you instead specify settings by putting the JSON directly into the `METEOR_SETTINGS` environment + * variable. If the settings object contains a key named `public`, then `Meteor.settings.public` will be available on the client as well as the server. All other properties of + * `Meteor.settings` are only defined on the server. You can rely on `Meteor.settings` and `Meteor.settings.public` being defined objects (not undefined) on both client and server even if + * there are no settings specified. Changes to `Meteor.settings.public` at runtime will be picked up by new client connections. + */ + var settings: Settings; + /** Settings **/ + + /** User **/ + interface UserEmail { + address: string; + verified: boolean; + } + /** + * UserProfile is left intentionally underspecified here, to allow you + * to override it in your application (but keep in mind that the default + * Meteor configuration allows users to write directly to their user + * record's profile field) + */ + interface UserProfile {} + interface User { + _id: string; + username?: string | undefined; + emails?: UserEmail[] | undefined; + createdAt?: Date | undefined; + profile?: UserProfile; + services?: any; + } + + function user(options?: { + fields?: Mongo.FieldSpecifier | undefined; + }): User | null; + + function userId(): string | null; + var users: Mongo.Collection; + /** User **/ + + /** Error **/ + /** + * This class represents a symbolic error thrown by a method. + */ + var Error: ErrorStatic; + interface ErrorStatic { + /** + * @param error A string code uniquely identifying this kind of error. + * This string should be used by callers of the method to determine the + * appropriate action to take, instead of attempting to parse the reason + * or details fields. For example: + * + * ``` + * // on the server, pick a code unique to this error + * // the reason field should be a useful debug message + * throw new Meteor.Error("logged-out", + * "The user must be logged in to post a comment."); + * + * // on the client + * Meteor.call("methodName", function (error) { + * // identify the error + * if (error && error.error === "logged-out") { + * // show a nice error message + * Session.set("errorMessage", "Please log in to post a comment."); + * } + * }); + * ``` + * + * For legacy reasons, some built-in Meteor functions such as `check` throw + * errors with a number in this field. + * + * @param reason Optional. A short human-readable summary of the + * error, like 'Not Found'. + * @param details Optional. Additional information about the error, + * like a textual stack trace. + */ + new (error: string | number, reason?: string, details?: string): Error; + } + interface Error extends global_Error { + error: string | number; + reason?: string | undefined; + details?: string | undefined; + } + var TypedError: TypedErrorStatic; + interface TypedErrorStatic { + new (message: string, errorType: string): TypedError; + } + interface TypedError extends global_Error { + message: string; + errorType: string; + } + /** Error **/ + + /** Method **/ + interface MethodThisType { + /** Access inside a method invocation. Boolean value, true if this invocation is a stub. */ + isSimulation: boolean; + /** The id of the user that made this method call, or `null` if no user was logged in. */ + userId: string | null; + /** + * Access inside a method invocation. The connection that this method was received on. `null` if the method is not associated with a connection, eg. a server initiated method call. Calls + * to methods made from a server method which was in turn initiated from the client share the same `connection`. */ + connection: Connection | null; + /** + * Set the logged in user. + * @param userId The value that should be returned by `userId` on this connection. + */ + setUserId(userId: string | null): void; + /** Call inside a method invocation. Allow subsequent method from this client to begin running in a new fiber. */ + unblock(): void; + } + + /** + * Defines functions that can be invoked over the network by clients. + * @param methods Dictionary whose keys are method names and values are functions. + */ + function methods(methods: { + [key: string]: (this: MethodThisType, ...args: any[]) => any; + }): void; + + /** + * Invokes a method passing any number of arguments. + * @param name Name of method to invoke + * @param args Optional method arguments + */ + function call(name: string, ...args: any[]): any; + + function apply< + Result extends + | EJSONable + | EJSONable[] + | EJSONableProperty + | EJSONableProperty[] + >( + name: string, + args: ReadonlyArray, + options?: { + wait?: boolean | undefined; + onResultReceived?: + | (( + error: global_Error | Meteor.Error | undefined, + result?: Result + ) => void) + | undefined; + /** + * (Client only) if true, don't send this method again on reload, simply call the callback an error with the error code 'invocation-failed'. + */ + noRetry?: boolean | undefined; + returnStubValue?: boolean | undefined; + throwStubExceptions?: boolean | undefined; + }, + asyncCallback?: ( + error: global_Error | Meteor.Error | undefined, + result?: Result + ) => void + ): any; + /** Method **/ + + /** Url **/ + /** + * Generate an absolute URL pointing to the application. The server reads from the `ROOT_URL` environment variable to determine where it is running. This is taken care of automatically for + * apps deployed to Galaxy, but must be provided when using `meteor build`. + */ + var absoluteUrl: { + /** + * @param path A path to append to the root URL. Do not include a leading "`/`". + */ + (path?: string, options?: absoluteUrlOptions): string; + defaultOptions: absoluteUrlOptions; + }; + + interface absoluteUrlOptions { + /** Create an HTTPS URL. */ + secure?: boolean | undefined; + /** Replace localhost with 127.0.0.1. Useful for services that don't recognize localhost as a domain name. */ + replaceLocalhost?: boolean | undefined; + /** Override the default ROOT_URL from the server environment. For example: "`http://foo.example.com`" */ + rootUrl?: string | undefined; + } + /** Url **/ + + /** Timeout **/ + /** + * Call a function repeatedly, with a time delay between calls. + * @param func The function to run + * @param delay Number of milliseconds to wait between each function call. + */ + function setInterval(func: Function, delay: number): number; + + /** + * Call a function in the future after waiting for a specified delay. + * @param func The function to run + * @param delay Number of milliseconds to wait before calling function + */ + function setTimeout(func: Function, delay: number): number; + /** + * Cancel a repeating function call scheduled by `Meteor.setInterval`. + * @param id The handle returned by `Meteor.setInterval` + */ + function clearInterval(id: number): void; + + /** + * Cancel a function call scheduled by `Meteor.setTimeout`. + * @param id The handle returned by `Meteor.setTimeout` + */ + function clearTimeout(id: number): void; + /** + * Defer execution of a function to run asynchronously in the background (similar to `Meteor.setTimeout(func, 0)`. + * @param func The function to run + */ + function defer(func: Function): void; + /** Timeout **/ + + /** utils **/ + /** + * Run code when a client or a server starts. + * @param func A function to run on startup. + */ + function startup(func: Function): void; + + /** + * Wrap a function that takes a callback function as its final parameter. + * The signature of the callback of the wrapped function should be `function(error, result){}`. + * On the server, the wrapped function can be used either synchronously (without passing a callback) or asynchronously + * (when a callback is passed). On the client, a callback is always required; errors will be logged if there is no callback. + * If a callback is provided, the environment captured when the original function was called will be restored in the callback. + * The parameters of the wrapped function must not contain any optional parameters or be undefined, as the callback function is expected to be the final, non-undefined parameter. + * @param func A function that takes a callback as its final parameter + * @param context Optional `this` object against which the original function will be invoked + */ + function wrapAsync(func: Function, context?: Object): any; + + function bindEnvironment(func: TFunc): TFunc; + + class EnvironmentVariable { + readonly slot: number; + constructor(); + get(): T; + getOrNullIfOutsideFiber(): T | null; + withValue(value: T, fn: () => U): U; + } + /** utils **/ + + /** Pub/Sub **/ + interface SubscriptionHandle { + /** Cancel the subscription. This will typically result in the server directing the client to remove the subscription’s data from the client’s cache. */ + stop(): void; + /** True if the server has marked the subscription as ready. A reactive data source. */ + ready(): boolean; + } + interface LiveQueryHandle { + stop(): void; + } + /** Pub/Sub **/ +} + +export namespace Meteor { + /** Login **/ + interface LoginWithExternalServiceOptions { + requestPermissions?: ReadonlyArray | undefined; + requestOfflineToken?: Boolean | undefined; + forceApprovalPrompt?: Boolean | undefined; + loginUrlParameters?: Object | undefined; + redirectUrl?: string | undefined; + loginHint?: string | undefined; + loginStyle?: string | undefined; + } + + function loginWithMeteorDeveloperAccount( + options?: Meteor.LoginWithExternalServiceOptions, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loginWithFacebook( + options?: Meteor.LoginWithExternalServiceOptions, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loginWithGithub( + options?: Meteor.LoginWithExternalServiceOptions, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loginWithGoogle( + options?: Meteor.LoginWithExternalServiceOptions, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loginWithMeetup( + options?: Meteor.LoginWithExternalServiceOptions, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loginWithTwitter( + options?: Meteor.LoginWithExternalServiceOptions, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loginWithWeibo( + options?: Meteor.LoginWithExternalServiceOptions, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loginWith( + options?: { + requestPermissions?: ReadonlyArray | undefined; + requestOfflineToken?: boolean | undefined; + loginUrlParameters?: Object | undefined; + userEmail?: string | undefined; + loginStyle?: string | undefined; + redirectUrl?: string | undefined; + }, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loginWithPassword( + user: Object | string, + password: string, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loginWithToken( + token: string, + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function loggingIn(): boolean; + + function loggingOut(): boolean; + + function logout( + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + + function logoutOtherClients( + callback?: (error?: global_Error | Meteor.Error | Meteor.TypedError) => void + ): void; + /** Login **/ + + /** Event **/ + interface Event { + type: string; + target: HTMLElement; + currentTarget: HTMLElement; + which: number; + stopPropagation(): void; + stopImmediatePropagation(): void; + preventDefault(): void; + isPropagationStopped(): boolean; + isImmediatePropagationStopped(): boolean; + isDefaultPrevented(): boolean; + } + interface EventHandlerFunction extends Function { + (event?: Meteor.Event, templateInstance?: Blaze.TemplateInstance): void; + } + interface EventMap { + [id: string]: Meteor.EventHandlerFunction; + } + /** Event **/ + + /** Connection **/ + function reconnect(): void; + + function disconnect(): void; + /** Connection **/ + + /** Status **/ + function status(): DDP.DDPStatus; + /** Status **/ + + /** Pub/Sub **/ + /** + * Subscribe to a record set. Returns a handle that provides + * `stop()` and `ready()` methods. + * @param name Name of the subscription. Matches the name of the + * server's `publish()` call. + * @param args Optional arguments passed to publisher + * function on server. + * @param callbacks Optional. May include `onStop` + * and `onReady` callbacks. If there is an error, it is passed as an + * argument to `onStop`. If a function is passed instead of an object, it + * is interpreted as an `onReady` callback. + */ + function subscribe(name: string, ...args: any[]): Meteor.SubscriptionHandle; + /** Pub/Sub **/ +} + +export namespace Meteor { + /** Connection **/ + interface Connection { + id: string; + close: () => void; + onClose: (callback: () => void) => void; + clientAddress: string; + httpHeaders: Object; + } + + function onConnection(callback: (connection: Connection) => void): void; + /** Connection **/ + /** + * Publish a record set. + * @param name If String, name of the record set. If Object, publications Dictionary of publish functions by name. If `null`, the set has no name, and the record set is automatically sent to + * all connected clients. + * @param func Function called on the server each time a client subscribes. Inside the function, `this` is the publish handler object, described below. If the client passed arguments to + * `subscribe`, the function is called with the same arguments. + */ + function publish( + name: string | null, + func: (this: Subscription, ...args: any[]) => void, + options?: { is_auto: boolean } + ): void; + + function _debug(...args: any[]): void; +} + +export interface Subscription { + /** + * Call inside the publish function. Informs the subscriber that a document has been added to the record set. + * @param collection The name of the collection that contains the new document. + * @param id The new document's ID. + * @param fields The fields in the new document. If `_id` is present it is ignored. + */ + added(collection: string, id: string, fields: Object): void; + /** + * Call inside the publish function. Informs the subscriber that a document in the record set has been modified. + * @param collection The name of the collection that contains the changed document. + * @param id The changed document's ID. + * @param fields The fields in the document that have changed, together with their new values. If a field is not present in `fields` it was left unchanged; if it is present in `fields` and + * has a value of `undefined` it was removed from the document. If `_id` is present it is ignored. + */ + changed(collection: string, id: string, fields: Object): void; + /** Access inside the publish function. The incoming connection for this subscription. */ + connection: Meteor.Connection; + /** + * Call inside the publish function. Stops this client's subscription, triggering a call on the client to the `onStop` callback passed to `Meteor.subscribe`, if any. If `error` is not a + * `Meteor.Error`, it will be sanitized. + * @param error The error to pass to the client. + */ + error(error: Error): void; + /** + * Call inside the publish function. Registers a callback function to run when the subscription is stopped. + * @param func The callback function + */ + onStop(func: Function): void; + /** + * Call inside the publish function. Informs the subscriber that an initial, complete snapshot of the record set has been sent. This will trigger a call on the client to the `onReady` + * callback passed to `Meteor.subscribe`, if any. + */ + ready(): void; + /** + * Call inside the publish function. Informs the subscriber that a document has been removed from the record set. + * @param collection The name of the collection that the document has been removed from. + * @param id The ID of the document that has been removed. + */ + removed(collection: string, id: string): void; + /** + * Access inside the publish function. The incoming connection for this subscription. + */ + stop(): void; + /** + * Call inside the publish function. Allows subsequent methods or subscriptions for the client of this subscription + * to begin running without waiting for the publishing to become ready. + */ + unblock(): void; + /** Access inside the publish function. The id of the logged-in user, or `null` if no user is logged in. */ + userId: string | null; +} + +export namespace Meteor { + /** Global props **/ + /** True if running in development environment. */ + var isDevelopment: boolean; + var isTest: boolean; + var isAppTest: boolean; + /** Global props **/ +} diff --git a/packages/meteor/package-types.json b/packages/meteor/package-types.json new file mode 100644 index 0000000000..bc20149ad0 --- /dev/null +++ b/packages/meteor/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "meteor.d.ts" +} diff --git a/packages/meteor/package.js b/packages/meteor/package.js index da45c4cc16..86093b59b8 100644 --- a/packages/meteor/package.js +++ b/packages/meteor/package.js @@ -54,6 +54,8 @@ Package.onUse(function (api) { // People expect process.exit() to not swallow console output. // On Windows, it sometimes does, so we fix it for all apps and packages api.addFiles('flush-buffers-on-exit-in-windows.js', 'server'); + + api.addAssets('meteor.d.ts', ['client', 'server']); }); Package.onTest(function (api) { From 312230110b5d1891eaf409bacfdeec8ca6a7d615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 10:37:04 +0200 Subject: [PATCH 041/114] Add types for modern-browsers package --- packages/modern-browsers/modern.d.ts | 4 ++++ packages/modern-browsers/package-types.json | 3 +++ packages/modern-browsers/package.js | 1 + 3 files changed, 8 insertions(+) create mode 100644 packages/modern-browsers/modern.d.ts create mode 100644 packages/modern-browsers/package-types.json diff --git a/packages/modern-browsers/modern.d.ts b/packages/modern-browsers/modern.d.ts new file mode 100644 index 0000000000..28713c5705 --- /dev/null +++ b/packages/modern-browsers/modern.d.ts @@ -0,0 +1,4 @@ +export function setMinimumBrowserVersions( + versions: Record, + source: string +): void; diff --git a/packages/modern-browsers/package-types.json b/packages/modern-browsers/package-types.json new file mode 100644 index 0000000000..ee517974a2 --- /dev/null +++ b/packages/modern-browsers/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "modern.d.ts" +} diff --git a/packages/modern-browsers/package.js b/packages/modern-browsers/package.js index 40e95833a3..a18712b61e 100644 --- a/packages/modern-browsers/package.js +++ b/packages/modern-browsers/package.js @@ -10,6 +10,7 @@ Package.describe({ Package.onUse(function(api) { api.use('modules'); api.mainModule('modern.js', 'server'); + api.addAssets('modern.d.ts', ['client', 'server']); }); Package.onTest(function(api) { From 6817eabb217d1abbef4f128d9dc41fe8dc652960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 11:09:12 +0200 Subject: [PATCH 042/114] Add types for mongo package --- packages/mongo/mongo.d.ts | 598 ++++++++++++++++++++++++++++++ packages/mongo/package.js | 1 + packages/mongo/package.types.json | 3 + 3 files changed, 602 insertions(+) create mode 100644 packages/mongo/mongo.d.ts create mode 100644 packages/mongo/package.types.json diff --git a/packages/mongo/mongo.d.ts b/packages/mongo/mongo.d.ts new file mode 100644 index 0000000000..43e8e9c3e7 --- /dev/null +++ b/packages/mongo/mongo.d.ts @@ -0,0 +1,598 @@ +import * as MongoNpmModule from 'mongodb'; +import { + Collection as MongoCollection, + CreateIndexesOptions, + Db as MongoDb, + Hint, + IndexSpecification, + MongoClient, +} from 'mongodb'; +import { Meteor } from 'meteor/meteor'; + +// Based on https://github.com/microsoft/TypeScript/issues/28791#issuecomment-443520161 +export type UnionOmit = T extends T + ? Pick> + : never; + +export namespace Mongo { + // prettier-ignore + type BsonType = 1 | "double" | + 2 | "string" | + 3 | "object" | + 4 | "array" | + 5 | "binData" | + 6 | "undefined" | + 7 | "objectId" | + 8 | "bool" | + 9 | "date" | + 10 | "null" | + 11 | "regex" | + 12 | "dbPointer" | + 13 | "javascript" | + 14 | "symbol" | + 15 | "javascriptWithScope" | + 16 | "int" | + 17 | "timestamp" | + 18 | "long" | + 19 | "decimal" | + -1 | "minKey" | + 127 | "maxKey" | "number"; + + type FieldExpression = { + $eq?: T | undefined; + $gt?: T | undefined; + $gte?: T | undefined; + $lt?: T | undefined; + $lte?: T | undefined; + $in?: T[] | undefined; + $nin?: T[] | undefined; + $ne?: T | undefined; + $exists?: boolean | undefined; + $type?: BsonType[] | BsonType | undefined; + $not?: FieldExpression | undefined; + $expr?: FieldExpression | undefined; + $jsonSchema?: any; + $mod?: number[] | undefined; + $regex?: RegExp | string | undefined; + $options?: string | undefined; + $text?: + | { + $search: string; + $language?: string | undefined; + $caseSensitive?: boolean | undefined; + $diacriticSensitive?: boolean | undefined; + } + | undefined; + $where?: string | Function | undefined; + $geoIntersects?: any; + $geoWithin?: any; + $near?: any; + $nearSphere?: any; + $all?: T[] | undefined; + $elemMatch?: T extends {} ? Query : FieldExpression | undefined; + $size?: number | undefined; + $bitsAllClear?: any; + $bitsAllSet?: any; + $bitsAnyClear?: any; + $bitsAnySet?: any; + $comment?: string | undefined; + }; + + type Flatten = T extends any[] ? T[0] : T; + + type Query = { + [P in keyof T]?: Flatten | RegExp | FieldExpression>; + } & { + $or?: Query[] | undefined; + $and?: Query[] | undefined; + $nor?: Query[] | undefined; + } & Dictionary; + + type QueryWithModifiers = { + $query: Query; + $comment?: string | undefined; + $explain?: any; + $hint?: Hint; + $maxScan?: any; + $max?: any; + $maxTimeMS?: any; + $min?: any; + $orderby?: any; + $returnKey?: any; + $showDiskLoc?: any; + $natural?: any; + }; + + type Selector = Query | QueryWithModifiers; + + type Dictionary = { [key: string]: T }; + type PartialMapTo = Partial>; + type OnlyArrays = T extends any[] ? T : never; + type OnlyElementsOfArrays = T extends any[] ? Partial : never; + type ElementsOf = { + [P in keyof T]?: OnlyElementsOfArrays; + }; + type PushModifier = { + [P in keyof T]?: + | OnlyElementsOfArrays + | { + $each?: T[P] | undefined; + $position?: number | undefined; + $slice?: number | undefined; + $sort?: 1 | -1 | Dictionary | undefined; + }; + }; + type ArraysOrEach = { + [P in keyof T]?: OnlyElementsOfArrays | { $each: T[P] }; + }; + type CurrentDateModifier = { $type: 'timestamp' | 'date' } | true; + type Modifier = + | T + | { + $currentDate?: + | (Partial> & + Dictionary) + | undefined; + $inc?: (PartialMapTo & Dictionary) | undefined; + $min?: + | (PartialMapTo & Dictionary) + | undefined; + $max?: + | (PartialMapTo & Dictionary) + | undefined; + $mul?: (PartialMapTo & Dictionary) | undefined; + $rename?: (PartialMapTo & Dictionary) | undefined; + $set?: (Partial & Dictionary) | undefined; + $setOnInsert?: (Partial & Dictionary) | undefined; + $unset?: + | (PartialMapTo & Dictionary) + | undefined; + $addToSet?: (ArraysOrEach & Dictionary) | undefined; + $push?: (PushModifier & Dictionary) | undefined; + $pull?: (ElementsOf & Dictionary) | undefined; + $pullAll?: (Partial & Dictionary) | undefined; + $pop?: (PartialMapTo & Dictionary<1 | -1>) | undefined; + }; + + type OptionalId = UnionOmit & { _id?: any }; + + interface SortSpecifier {} + interface FieldSpecifier { + [id: string]: Number; + } + + type Transform = ((doc: T) => any) | null | undefined; + + type Options = { + /** Sort order (default: natural order) */ + sort?: SortSpecifier | undefined; + /** Number of results to skip at the beginning */ + skip?: number | undefined; + /** Maximum number of results to return */ + limit?: number | undefined; + /** Dictionary of fields to return or exclude. */ + fields?: FieldSpecifier | undefined; + /** (Server only) Overrides MongoDB's default index selection and query optimization process. Specify an index to force its use, either by its name or index specification. */ + hint?: Hint | undefined; + /** (Client only) Default `true`; pass `false` to disable reactivity */ + reactive?: boolean | undefined; + /** Overrides `transform` on the [`Collection`](#collections) for this cursor. Pass `null` to disable transformation. */ + transform?: Transform | undefined; + }; + + type DispatchTransform = Transform extends ( + ...args: any + ) => any + ? ReturnType + : Transform extends null + ? T + : U; + + var Collection: CollectionStatic; + interface CollectionStatic { + /** + * Constructor for a Collection + * @param name The name of the collection. If null, creates an unmanaged (unsynchronized) local collection. + */ + new ( + name: string | null, + options?: { + /** + * The server connection that will manage this collection. Uses the default connection if not specified. Pass the return value of calling `DDP.connect` to specify a different + * server. Pass `null` to specify no connection. Unmanaged (`name` is null) collections cannot specify a connection. + */ + connection?: Object | null | undefined; + /** The method of generating the `_id` fields of new documents in this collection. Possible values: + * - **`'STRING'`**: random strings + * - **`'MONGO'`**: random [`Mongo.ObjectID`](#mongo_object_id) values + * + * The default id generation technique is `'STRING'`. + */ + idGeneration?: string | undefined; + /** + * An optional transformation function. Documents will be passed through this function before being returned from `fetch` or `findOne`, and before being passed to callbacks of + * `observe`, `map`, `forEach`, `allow`, and `deny`. Transforms are *not* applied for the callbacks of `observeChanges` or to cursors returned from publish functions. + */ + transform?: (doc: T) => U; + /** Set to `false` to skip setting up the mutation methods that enable insert/update/remove from client code. Default `true`. */ + defineMutationMethods?: boolean | undefined; + } + ): Collection; + } + interface Collection { + allow = undefined>(options: { + insert?: + | ((userId: string, doc: DispatchTransform) => boolean) + | undefined; + update?: + | (( + userId: string, + doc: DispatchTransform, + fieldNames: string[], + modifier: any + ) => boolean) + | undefined; + remove?: + | ((userId: string, doc: DispatchTransform) => boolean) + | undefined; + fetch?: string[] | undefined; + transform?: Fn | undefined; + }): boolean; + createCappedCollectionAsync( + byteSize?: number, + maxDocuments?: number + ): Promise; + createIndex( + indexSpec: IndexSpecification, + options?: CreateIndexesOptions + ): void; + createIndexAsync( + indexSpec: IndexSpecification, + options?: CreateIndexesOptions + ): Promise; + deny = undefined>(options: { + insert?: + | ((userId: string, doc: DispatchTransform) => boolean) + | undefined; + update?: + | (( + userId: string, + doc: DispatchTransform, + fieldNames: string[], + modifier: any + ) => boolean) + | undefined; + remove?: + | ((userId: string, doc: DispatchTransform) => boolean) + | undefined; + fetch?: string[] | undefined; + transform?: Fn | undefined; + }): boolean; + dropCollectionAsync(): Promise; + dropIndexAsync(indexName: string): void; + /** + * Find the documents in a collection that match the selector. + * @param selector A query describing the documents to find + */ + find(selector?: Selector | ObjectID | string): Cursor; + /** + * Find the documents in a collection that match the selector. + * @param selector A query describing the documents to find + */ + find>( + selector?: Selector | ObjectID | string, + options?: O + ): Cursor>; + /** + * Finds the first document that matches the selector, as ordered by sort and skip options. Returns `undefined` if no matching document is found. + * @param selector A query describing the documents to find + */ + findOne(selector?: Selector | ObjectID | string): U | undefined; + /** + * Finds the first document that matches the selector, as ordered by sort and skip options. Returns `undefined` if no matching document is found. + * @param selector A query describing the documents to find + */ + findOne, 'limit'>>( + selector?: Selector | ObjectID | string, + options?: O + ): DispatchTransform | undefined; + /** + * Finds the first document that matches the selector, as ordered by sort and skip options. Returns `undefined` if no matching document is found. + * @param selector A query describing the documents to find + */ + findOneAsync( + selector?: Selector | ObjectID | string + ): Promise; + /** + * Finds the first document that matches the selector, as ordered by sort and skip options. Returns `undefined` if no matching document is found. + * @param selector A query describing the documents to find + */ + findOneAsync, 'limit'>>( + selector?: Selector | ObjectID | string, + options?: O + ): Promise | undefined>; + /** + * Insert a document in the collection. Returns its unique _id. + * @param doc The document to insert. May not yet have an _id attribute, in which case Meteor will generate one for you. + * @param callback If present, called with an error object as the first argument and, if no error, the _id as the second. + */ + insert(doc: OptionalId, callback?: Function): string; + /** + * Insert a document in the collection. Returns its unique _id. + * @param doc The document to insert. May not yet have an _id attribute, in which case Meteor will generate one for you. + * @param callback If present, called with an error object as the first argument and, if no error, the _id as the second. + */ + insertAsync(doc: OptionalId, callback?: Function): Promise; + /** + * Returns the [`Collection`](http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html) object corresponding to this collection from the + * [npm `mongodb` driver module](https://www.npmjs.com/package/mongodb) which is wrapped by `Mongo.Collection`. + */ + rawCollection(): MongoCollection; + /** + * Returns the [`Db`](http://mongodb.github.io/node-mongodb-native/3.0/api/Db.html) object corresponding to this collection's database connection from the + * [npm `mongodb` driver module](https://www.npmjs.com/package/mongodb) which is wrapped by `Mongo.Collection`. + */ + rawDatabase(): MongoDb; + /** + * Remove documents from the collection + * @param selector Specifies which documents to remove + * @param callback If present, called with an error object as its argument. + */ + remove( + selector: Selector | ObjectID | string, + callback?: Function + ): number; + /** + * Remove documents from the collection + * @param selector Specifies which documents to remove + * @param callback If present, called with an error object as its argument. + */ + removeAsync( + selector: Selector | ObjectID | string, + callback?: Function + ): Promise; + /** + * Modify one or more documents in the collection. Returns the number of matched documents. + * @param selector Specifies which documents to modify + * @param modifier Specifies how to modify the documents + * @param callback If present, called with an error object as the first argument and, if no error, the number of affected documents as the second. + */ + update( + selector: Selector | ObjectID | string, + modifier: Modifier, + options?: { + /** True to modify all matching documents; false to only modify one of the matching documents (the default). */ + multi?: boolean | undefined; + /** True to insert a document if no matching documents are found. */ + upsert?: boolean | undefined; + /** + * Used in combination with MongoDB [filtered positional operator](https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/) to specify which elements to + * modify in an array field. + */ + arrayFilters?: { [identifier: string]: any }[] | undefined; + }, + callback?: Function + ): number; + /** + * Modify one or more documents in the collection. Returns the number of matched documents. + * @param selector Specifies which documents to modify + * @param modifier Specifies how to modify the documents + * @param callback If present, called with an error object as the first argument and, if no error, the number of affected documents as the second. + */ + updateAsync( + selector: Selector | ObjectID | string, + modifier: Modifier, + options?: { + /** True to modify all matching documents; false to only modify one of the matching documents (the default). */ + multi?: boolean | undefined; + /** True to insert a document if no matching documents are found. */ + upsert?: boolean | undefined; + /** + * Used in combination with MongoDB [filtered positional operator](https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/) to specify which elements to + * modify in an array field. + */ + arrayFilters?: { [identifier: string]: any }[] | undefined; + }, + callback?: Function + ): Promise; + /** + * Modify one or more documents in the collection, or insert one if no matching documents were found. Returns an object with keys `numberAffected` (the number of documents modified) and + * `insertedId` (the unique _id of the document that was inserted, if any). + * @param selector Specifies which documents to modify + * @param modifier Specifies how to modify the documents + * @param callback If present, called with an error object as the first argument and, if no error, the number of affected documents as the second. + */ + upsert( + selector: Selector | ObjectID | string, + modifier: Modifier, + options?: { + /** True to modify all matching documents; false to only modify one of the matching documents (the default). */ + multi?: boolean | undefined; + }, + callback?: Function + ): { + numberAffected?: number | undefined; + insertedId?: string | undefined; + }; + /** + * Modify one or more documents in the collection, or insert one if no matching documents were found. Returns an object with keys `numberAffected` (the number of documents modified) and + * `insertedId` (the unique _id of the document that was inserted, if any). + * @param selector Specifies which documents to modify + * @param modifier Specifies how to modify the documents + * @param callback If present, called with an error object as the first argument and, if no error, the number of affected documents as the second. + */ + upsertAsync( + selector: Selector | ObjectID | string, + modifier: Modifier, + options?: { + /** True to modify all matching documents; false to only modify one of the matching documents (the default). */ + multi?: boolean | undefined; + }, + callback?: Function + ): Promise<{ + numberAffected?: number | undefined; + insertedId?: string | undefined; + }>; + _createCappedCollection(byteSize?: number, maxDocuments?: number): void; + /** @deprecated */ + _ensureIndex( + indexSpec: IndexSpecification, + options?: CreateIndexesOptions + ): void; + _dropCollection(): Promise; + _dropIndex(indexName: string): void; + } + + var Cursor: CursorStatic; + interface CursorStatic { + /** + * To create a cursor, use find. To access the documents in a cursor, use forEach, map, or fetch. + */ + new (): Cursor; + } + interface ObserveCallbacks { + added?(document: T): void; + addedAt?(document: T, atIndex: number, before: T | null): void; + changed?(newDocument: T, oldDocument: T): void; + changedAt?(newDocument: T, oldDocument: T, indexAt: number): void; + removed?(oldDocument: T): void; + removedAt?(oldDocument: T, atIndex: number): void; + movedTo?( + document: T, + fromIndex: number, + toIndex: number, + before: T | null + ): void; + } + interface ObserveChangesCallbacks { + added?(id: string, fields: Partial): void; + addedBefore?(id: string, fields: Partial, before: T | null): void; + changed?(id: string, fields: Partial): void; + movedBefore?(id: string, before: T | null): void; + removed?(id: string): void; + } + interface Cursor { + /** + * Returns the number of documents that match a query. + * @param applySkipLimit If set to `false`, the value returned will reflect the total number of matching documents, ignoring any value supplied for limit. (Default: true) + */ + count(applySkipLimit?: boolean): number; + /** + * Returns the number of documents that match a query. + * @param applySkipLimit If set to `false`, the value returned will reflect the total number of matching documents, ignoring any value supplied for limit. (Default: true) + */ + countAsync(applySkipLimit?: boolean): Promise; + /** + * Return all matching documents as an Array. + */ + fetch(): Array; + /** + * Return all matching documents as an Array. + */ + fetchAsync(): Promise>; + /** + * Call `callback` once for each matching document, sequentially and + * synchronously. + * @param callback Function to call. It will be called with three arguments: the document, a 0-based index, and cursor itself. + * @param thisArg An object which will be the value of `this` inside `callback`. + */ + forEach( + callback: (doc: U, index: number, cursor: Cursor) => void, + thisArg?: any + ): void; + /** + * Call `callback` once for each matching document, sequentially and + * synchronously. + * @param callback Function to call. It will be called with three arguments: the document, a 0-based index, and cursor itself. + * @param thisArg An object which will be the value of `this` inside `callback`. + */ + forEachAsync( + callback: (doc: U, index: number, cursor: Cursor) => void, + thisArg?: any + ): Promise; + /** + * Map callback over all matching documents. Returns an Array. + * @param callback Function to call. It will be called with three arguments: the document, a 0-based index, and cursor itself. + * @param thisArg An object which will be the value of `this` inside `callback`. + */ + map( + callback: (doc: U, index: number, cursor: Cursor) => M, + thisArg?: any + ): Array; + /** + * Map callback over all matching documents. Returns an Array. + * @param callback Function to call. It will be called with three arguments: the document, a 0-based index, and cursor itself. + * @param thisArg An object which will be the value of `this` inside `callback`. + */ + mapAsync( + callback: (doc: U, index: number, cursor: Cursor) => M, + thisArg?: any + ): Promise>; + /** + * Watch a query. Receive callbacks as the result set changes. + * @param callbacks Functions to call to deliver the result set as it changes + */ + observe(callbacks: ObserveCallbacks): Meteor.LiveQueryHandle; + /** + * Watch a query. Receive callbacks as the result set changes. Only the differences between the old and new documents are passed to the callbacks. + * @param callbacks Functions to call to deliver the result set as it changes + */ + observeChanges( + callbacks: ObserveChangesCallbacks, + options?: { nonMutatingCallbacks?: boolean | undefined } + ): Meteor.LiveQueryHandle; + [Symbol.iterator](): Iterator; + [Symbol.asyncIterator](): AsyncIterator; + } + + var ObjectID: ObjectIDStatic; + interface ObjectIDStatic { + /** + * Create a Mongo-style `ObjectID`. If you don't specify a `hexString`, the `ObjectID` will generated randomly (not using MongoDB's ID construction rules). + + * @param hexString The 24-character hexadecimal contents of the ObjectID to create + */ + new (hexString?: string): ObjectID; + } + interface ObjectID { + toHexString(): string; + equals(otherID: ObjectID): boolean; + } + + function setConnectionOptions(options: any): void; +} + +export namespace Mongo { + interface AllowDenyOptions { + insert?: ((userId: string, doc: any) => boolean) | undefined; + update?: + | (( + userId: string, + doc: any, + fieldNames: string[], + modifier: any + ) => boolean) + | undefined; + remove?: ((userId: string, doc: any) => boolean) | undefined; + fetch?: string[] | undefined; + transform?: Function | null | undefined; + } +} + +export declare module MongoInternals { + interface MongoConnection { + db: MongoDb; + client: MongoClient; + } + + function defaultRemoteCollectionDriver(): { + mongo: MongoConnection; + }; + + var NpmModules: { + mongodb: { + version: string; + module: typeof MongoNpmModule; + }; + }; +} diff --git a/packages/mongo/package.js b/packages/mongo/package.js index a6e1be4d70..39dd505837 100644 --- a/packages/mongo/package.js +++ b/packages/mongo/package.js @@ -82,6 +82,7 @@ Package.onUse(function (api) { api.addFiles('remote_collection_driver.js', 'server'); api.addFiles('collection.js', ['client', 'server']); api.addFiles('connection_options.js', 'server'); + api.addAssets('mongo.d.ts', ['client', 'server']); }); Package.onTest(function (api) { diff --git a/packages/mongo/package.types.json b/packages/mongo/package.types.json new file mode 100644 index 0000000000..97c9c11e61 --- /dev/null +++ b/packages/mongo/package.types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "mongo.d.ts" +} From e3a88b2218ca5cc9d08bd27e1846c42c771c9f0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 11:14:39 +0200 Subject: [PATCH 043/114] Add types for promise package --- packages/promise/package.js | 1 + packages/promise/package.types.json | 3 +++ packages/promise/promise.d.ts | 23 +++++++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 packages/promise/package.types.json create mode 100644 packages/promise/promise.d.ts diff --git a/packages/promise/package.js b/packages/promise/package.js index fad988b619..c0b3d613b6 100644 --- a/packages/promise/package.js +++ b/packages/promise/package.js @@ -20,6 +20,7 @@ Package.onUse(function(api) { api.mainModule("client.js", "client"); api.mainModule("server.js", "server"); api.export("Promise"); + api.addAssets("promise.d.ts", ["client", "server"]); }); Package.onTest(function(api) { diff --git a/packages/promise/package.types.json b/packages/promise/package.types.json new file mode 100644 index 0000000000..b939961149 --- /dev/null +++ b/packages/promise/package.types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "promise.d.ts" +} diff --git a/packages/promise/promise.d.ts b/packages/promise/promise.d.ts new file mode 100644 index 0000000000..2e6b034b55 --- /dev/null +++ b/packages/promise/promise.d.ts @@ -0,0 +1,23 @@ +export class Promise extends globalThis.Promise { + static async< + Fn extends (this: This, ...args: Args) => any, + This, + Args extends any[] + >( + fn: Fn, + allowReuseOfCurrentFiber?: boolean + ): (this: This, ...args: Args) => Promise>; + static asyncApply< + Fn extends (this: This, ...args: Args) => any, + This, + Args extends any[] + >( + fn: Fn, + context: This, + args: Args, + allowReuseOfCurrentFiber?: boolean + ): Promise>; + static await(value: PromiseLike): T; + static awaitAll(values: Iterable>): T[]; + await(): T; +} From 51f4b58a5b3a3dc92ef20cdcf0620814a8c740ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 11:46:11 +0200 Subject: [PATCH 044/114] Add types for random package --- packages/random/package-types.json | 3 +++ packages/random/package.js | 1 + packages/random/random.d.ts | 13 +++++++++++++ 3 files changed, 17 insertions(+) create mode 100644 packages/random/package-types.json create mode 100644 packages/random/random.d.ts diff --git a/packages/random/package-types.json b/packages/random/package-types.json new file mode 100644 index 0000000000..71bd4af0cd --- /dev/null +++ b/packages/random/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "random.d.ts" +} diff --git a/packages/random/package.js b/packages/random/package.js index 370077010c..1f6dcb9231 100644 --- a/packages/random/package.js +++ b/packages/random/package.js @@ -8,6 +8,7 @@ Package.onUse(function (api) { api.export('Random'); api.mainModule('main_client.js', 'client'); api.mainModule('main_server.js', 'server'); + api.addAssets('random.d.ts', ['client', 'server']); }); Package.onTest(function (api) { diff --git a/packages/random/random.d.ts b/packages/random/random.d.ts new file mode 100644 index 0000000000..fd529f9a4d --- /dev/null +++ b/packages/random/random.d.ts @@ -0,0 +1,13 @@ +export namespace Random { + function id(numberOfChars?: number): string; + + function secret(numberOfChars?: number): string; + + function fraction(): number; + // @param numberOfDigits, @returns a random hex string of the given length + function hexString(numberOfDigits: number): string; + // @param array, @return a random element in array + function choice(array: T[]): T | undefined; + // @param str, @return a random char in str + function choice(str: string): string; +} From c92796622a48650dc193946825d6bbcf9c10dfab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 11:56:22 +0200 Subject: [PATCH 045/114] Add types for reactive-dict package --- packages/reactive-dict/package-types.json | 3 + packages/reactive-dict/package.js | 1 + packages/reactive-dict/reactive-dict.d.ts | 94 +++++++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 packages/reactive-dict/package-types.json create mode 100644 packages/reactive-dict/reactive-dict.d.ts diff --git a/packages/reactive-dict/package-types.json b/packages/reactive-dict/package-types.json new file mode 100644 index 0000000000..089231243f --- /dev/null +++ b/packages/reactive-dict/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "reactive-dict.d.ts" +} diff --git a/packages/reactive-dict/package.js b/packages/reactive-dict/package.js index ee7d4e4e9f..62a7ad8788 100644 --- a/packages/reactive-dict/package.js +++ b/packages/reactive-dict/package.js @@ -9,6 +9,7 @@ Package.onUse(function (api) { api.use(['mongo', 'reload'], { weak: true }); api.mainModule('migration.js'); api.export('ReactiveDict'); + api.addAssets('reactive-dict.d.ts', ['client', 'server']); }); Package.onTest(function (api) { diff --git a/packages/reactive-dict/reactive-dict.d.ts b/packages/reactive-dict/reactive-dict.d.ts new file mode 100644 index 0000000000..78c671c4d3 --- /dev/null +++ b/packages/reactive-dict/reactive-dict.d.ts @@ -0,0 +1,94 @@ +import { EJSONable } from 'meteor/ejson'; + +export class ReactiveDict { + /** + * Constructor for a ReactiveDict, which represents a reactive dictionary of key/value pairs. + * @param name When a name is passed, preserves contents across Hot Code Pushes + * @param initialValue The default values for the dictionary + */ + constructor(name?: string, initialValue?: Partial); + /** + * Set a value for a key if it hasn't been set before. + * Otherwise works exactly the same as `ReactiveDict.set`. + * @param key The key to set, eg, `selectedItem` + * @param value The new value for `key` + */ + setDefault

(key: P, value?: O[P]): void; + /** + * Set a value for a key if it hasn't been set before. + * Otherwise works exactly the same as `ReactiveDict.set`. + */ + setDefault(object: Partial): void; + /** + * Set a value for a key in the ReactiveDict. Notify any listeners + * that the value has changed (eg: redraw templates, and rerun any + * `Tracker.autorun` computations, that called + * `ReactiveDict.get` on this `key`.) + * @param key The key to set, eg, `selectedItem` + * @param value The new value for `key` + */ + set

(key: P, value?: O[P]): void; + /** + * Set a value for a key in the ReactiveDict. Notify any listeners + * that the value has changed (eg: redraw templates, and rerun any + * `Tracker.autorun` computations, that called + * `ReactiveDict.get` on this `key`.) + */ + set(object: Partial): void; + /** + * Get the value assiciated with a key. If inside a reactive + * computation, invalidate the computation the next time the + * value associated with this key is changed by `ReactiveDict.set`. + * This returns a clone of the value, so if it's an object or an array, + * mutating the returned value has no effect on the value stored in the + * ReactiveDict. + * @param key The key of the element to return + */ + get

(key: P): O[P] | undefined; + /** + * Test if the stored entry for a key is equal to a value. If inside a + * reactive computation, invalidate the computation the next + * time the variable changes to or from the value. + * @param key The name of the session variable to test + * @param value The value to + * test against + */ + equals

( + key: P, + value: string | number | boolean | undefined | null + ): boolean; + /** + * Get all key-value pairs as a plain object. If inside a reactive + * computation, invalidate the computation the next time the + * value associated with any key is changed by `ReactiveDict.set`. + * This returns a clone of each value, so if it's an object or an array, + * mutating the returned value has no effect on the value stored in the + * ReactiveDict. + */ + all(): Partial; + /** + * remove all key-value pairs from the ReactiveDict. Notify any + * listeners that the value has changed (eg: redraw templates, and rerun any + * `Tracker.autorun` computations, that called + * `ReactiveDict.get` on this `key`.) + */ + clear(): void; + + /** + * remove a key-value pair from the ReactiveDict. Notify any listeners + * that the value has changed (eg: redraw templates, and rerun any + * `Tracker.autorun` computations, that called + * `ReactiveDict.get` on this `key`.) + * @param key The key to delete, eg, `selectedItem` + * @return did remove + */ + delete

(key: P): boolean; + /** + * Clear all values from the reactiveDict and prevent it from being + * migrated on a Hot Code Pushes. Notify any listeners + * that the value has changed (eg: redraw templates, and rerun any + * `Tracker.autorun` computations, that called + * `ReactiveDict.get` on this `key`.) + */ + destroy(): void; +} From 51ee25df495a9384b416bd8af6626bdd3b0f23e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 12:45:42 +0200 Subject: [PATCH 046/114] Add types for reactive-var package --- packages/reactive-var/package-types.json | 3 +++ packages/reactive-var/package.js | 1 + packages/reactive-var/reactive-var.d.ts | 25 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 packages/reactive-var/package-types.json create mode 100644 packages/reactive-var/reactive-var.d.ts diff --git a/packages/reactive-var/package-types.json b/packages/reactive-var/package-types.json new file mode 100644 index 0000000000..24149d998a --- /dev/null +++ b/packages/reactive-var/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "reactive-var.d.ts" +} diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js index 029608a876..e452ffe216 100644 --- a/packages/reactive-var/package.js +++ b/packages/reactive-var/package.js @@ -9,4 +9,5 @@ Package.onUse(function (api) { api.use('tracker'); api.addFiles('reactive-var.js'); + api.addAssets('reactive-var.d.ts', ['client', 'server']); }); diff --git a/packages/reactive-var/reactive-var.d.ts b/packages/reactive-var/reactive-var.d.ts new file mode 100644 index 0000000000..b47730aa51 --- /dev/null +++ b/packages/reactive-var/reactive-var.d.ts @@ -0,0 +1,25 @@ +export var ReactiveVar: ReactiveVarStatic; + +export interface ReactiveVarStatic { + /** + * Constructor for a ReactiveVar, which represents a single reactive variable. + * @param initialValue The initial value to set. `equalsFunc` is ignored when setting the initial value. + * @param equalsFunc A function of two arguments, called on the old value and the new value whenever the ReactiveVar is set. If it returns true, no set is performed. If omitted, the default + * `equalsFunc` returns true if its arguments are `===` and are of type number, boolean, string, undefined, or null. + */ + new ( + initialValue: T, + equalsFunc?: (oldValue: T, newValue: T) => boolean + ): ReactiveVar; +} + +export interface ReactiveVar { + /** + * Returns the current value of the ReactiveVar, establishing a reactive dependency. + */ + get(): T; + /** + * Sets the current value of the ReactiveVar, invalidating the Computations that called `get` if `newValue` is different from the old value. + */ + set(newValue: T): void; +} From d3acf63a8ffb95ccb7ba1f84835c17d2ed3dc155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 13:45:55 +0200 Subject: [PATCH 047/114] Add types for server-render package --- packages/server-render/package-types.json | 3 ++ packages/server-render/package.js | 1 + packages/server-render/server-render.d.ts | 36 +++++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 packages/server-render/package-types.json create mode 100644 packages/server-render/server-render.d.ts diff --git a/packages/server-render/package-types.json b/packages/server-render/package-types.json new file mode 100644 index 0000000000..11840961ec --- /dev/null +++ b/packages/server-render/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "server-render.d.ts" +} diff --git a/packages/server-render/package.js b/packages/server-render/package.js index 47d3cadc5c..7b3dab2aaa 100644 --- a/packages/server-render/package.js +++ b/packages/server-render/package.js @@ -17,6 +17,7 @@ Package.onUse(function(api) { api.use("webapp"); api.mainModule("client.js", "client", { lazy: true }); api.mainModule("server.js", "server"); + api.addAssets('server-render.d.ts', ['client', 'server']); }); Package.onTest(function(api) { diff --git a/packages/server-render/server-render.d.ts b/packages/server-render/server-render.d.ts new file mode 100644 index 0000000000..9a16690cfd --- /dev/null +++ b/packages/server-render/server-render.d.ts @@ -0,0 +1,36 @@ +import * as http from 'http'; + +// NodeJS.ReadableStream only works on server. +// HTMLElement only works on client. +type Content = string | Content[] | NodeJS.ReadableStream | HTMLElement; + +interface ClientSink { + // Client and server. Only client + appendToHead(html: Content): void; + appendToBody(html: Content): void; + appendToElementById(id: string, html: Content): void; + renderIntoElementById(id: string, html: Content): void; + redirect(location: string, code?: number): void; + + // Server-only, but error-raising stubs provided to client: + setStatusCode(code: number): void; + setHeader(key: string, value: number | string | string[]): void; + getHeaders(): http.IncomingHttpHeaders; + getCookies(): { [key: string]: string }; +} + +interface ServerSink extends ClientSink { + // Server-only: + request: http.IncomingMessage; + arch: string; + head: string; + body: string; + htmlById: { [key: string]: string }; + maybeMadeChanges: boolean; +} + +type Sink = ClientSink | ServerSink; + +type Callback = (sink: Sink) => Promise | any; + +export function onPageLoad(callback: T): T; From 88829ee941949548b63e5da5437c9508b9e599c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 13:51:06 +0200 Subject: [PATCH 048/114] Add types for service-configuration package --- packages/service-configuration/package-types.json | 3 +++ packages/service-configuration/package.js | 1 + .../service-configuration/service-configuration.d.ts | 10 ++++++++++ 3 files changed, 14 insertions(+) create mode 100644 packages/service-configuration/package-types.json create mode 100644 packages/service-configuration/service-configuration.d.ts diff --git a/packages/service-configuration/package-types.json b/packages/service-configuration/package-types.json new file mode 100644 index 0000000000..16883a4dac --- /dev/null +++ b/packages/service-configuration/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "service-configuration.d.ts" +} diff --git a/packages/service-configuration/package.js b/packages/service-configuration/package.js index ec496a1fff..b411945e8d 100644 --- a/packages/service-configuration/package.js +++ b/packages/service-configuration/package.js @@ -10,4 +10,5 @@ Package.onUse(function(api) { api.export('ServiceConfiguration'); api.addFiles('service_configuration_common.js', ['client', 'server']); api.addFiles('service_configuration_server.js', 'server'); + api.addAssets('service-configuration.d.ts', ['client', 'server']); }); diff --git a/packages/service-configuration/service-configuration.d.ts b/packages/service-configuration/service-configuration.d.ts new file mode 100644 index 0000000000..267f0ac7b2 --- /dev/null +++ b/packages/service-configuration/service-configuration.d.ts @@ -0,0 +1,10 @@ +import { Mongo } from 'meteor/mongo'; + +interface Configuration { + appId: string; + secret: string; +} + +declare var ServiceConfiguration: { + configurations: Mongo.Collection; +}; From 8b891a406346cab149ca8861d38d1158d0188612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 13:59:03 +0200 Subject: [PATCH 049/114] Add types for session package --- packages/session/package-types.json | 3 +++ packages/session/package.js | 1 + packages/session/session.d.ts | 41 +++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 packages/session/package-types.json create mode 100644 packages/session/session.d.ts diff --git a/packages/session/package-types.json b/packages/session/package-types.json new file mode 100644 index 0000000000..ee5a93cac4 --- /dev/null +++ b/packages/session/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "session.d.ts" +} diff --git a/packages/session/package.js b/packages/session/package.js index 5515510f25..0ef45d2cea 100644 --- a/packages/session/package.js +++ b/packages/session/package.js @@ -13,6 +13,7 @@ Package.onUse(function (api) { api.export('Session', 'client'); api.mainModule('session.js', 'client'); + api.addAssets('session.d.ts', ['client', 'server']); }); Package.onTest(function (api) { diff --git a/packages/session/session.d.ts b/packages/session/session.d.ts new file mode 100644 index 0000000000..c32f863244 --- /dev/null +++ b/packages/session/session.d.ts @@ -0,0 +1,41 @@ +import { EJSONable } from 'meteor/ejson'; + +declare namespace Session { + /** + * Test if a session variable is equal to a value. If inside a + * reactive computation, invalidate the computation the next + * time the variable changes to or from the value. + * @param key The name of the session variable to test + * @param value The value to test against + */ + function equals(key: string, value: string | number | boolean | any): boolean; + + /** + * Get the value of a session variable. If inside a reactive + * computation, invalidate the computation the next time the + * value of the variable is changed by `Session.set`. This + * returns a clone of the session value, so if it's an object or an array, + * mutating the returned value has no effect on the value stored in the + * session. + * @param key The name of the session variable to return + */ + function get(key: string): any; + + /** + * Set a variable in the session. Notify any listeners that the value + * has changed (eg: redraw templates, and rerun any + * `Tracker.autorun` computations, that called + * `Session.get` on this `key`.) + * @param key The key to set, eg, `selectedItem` + * @param value The new value for `key` + */ + function set(key: string, value: EJSONable | any): void; + + /** + * Set a variable in the session if it hasn't been set before. + * Otherwise works exactly the same as `Session.set`. + * @param key The key to set, eg, `selectedItem` + * @param value The new value for `key` + */ + function setDefault(key: string, value: EJSONable | any): void; +} From cc226bf4e305ae45d312f6c4716c697f342a3d01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 15:06:23 +0200 Subject: [PATCH 050/114] Add types for tracker package --- packages/tracker/package-types.json | 3 + packages/tracker/package.js | 1 + packages/tracker/tracker.d.ts | 128 ++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 packages/tracker/package-types.json create mode 100644 packages/tracker/tracker.d.ts diff --git a/packages/tracker/package-types.json b/packages/tracker/package-types.json new file mode 100644 index 0000000000..7e03462336 --- /dev/null +++ b/packages/tracker/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "tracker.d.ts" +} diff --git a/packages/tracker/package.js b/packages/tracker/package.js index 9475828977..f56f16be60 100644 --- a/packages/tracker/package.js +++ b/packages/tracker/package.js @@ -8,6 +8,7 @@ Package.onUse(function (api) { api.addFiles("tracker.js"); api.export("Tracker"); api.export("Deps"); + api.addAssets("tracker.d.ts", ["client", "server"]); }); Package.onTest(function (api) { diff --git a/packages/tracker/tracker.d.ts b/packages/tracker/tracker.d.ts new file mode 100644 index 0000000000..cbd49a9b29 --- /dev/null +++ b/packages/tracker/tracker.d.ts @@ -0,0 +1,128 @@ +/** + * The namespace for Tracker-related methods. + */ +export declare namespace Tracker { + function Computation(): void; + /** + * A Computation object represents code that is repeatedly rerun + * in response to + * reactive data changes. Computations don't have return values; they just + * perform actions, such as rerendering a template on the screen. Computations + * are created using Tracker.autorun. Use stop to prevent further rerunning of a + * computation. + */ + interface Computation { + /** + * True during the initial run of the computation at the time `Tracker.autorun` is called, and false on subsequent reruns and at other times. + */ + firstRun: boolean; + /** + * Invalidates this computation so that it will be rerun. + */ + invalidate(): void; + /** + * True if this computation has been invalidated (and not yet rerun), or if it has been stopped. + */ + invalidated: boolean; + /** + * Registers `callback` to run when this computation is next invalidated, or runs it immediately if the computation is already invalidated. The callback is run exactly once and not upon + * future invalidations unless `onInvalidate` is called again after the computation becomes valid again. + * @param callback Function to be called on invalidation. Receives one argument, the computation that was invalidated. + */ + onInvalidate(callback: Function): void; + /** + * Registers `callback` to run when this computation is stopped, or runs it immediately if the computation is already stopped. The callback is run after any `onInvalidate` callbacks. + * @param callback Function to be called on stop. Receives one argument, the computation that was stopped. + */ + onStop(callback: Function): void; + /** + * Prevents this computation from rerunning. + */ + stop(): void; + /** + * True if this computation has been stopped. + */ + stopped: boolean; + } + /** + * The current computation, or `null` if there isn't one. The current computation is the `Tracker.Computation` object created by the innermost active call to + * `Tracker.autorun`, and it's the computation that gains dependencies when reactive data sources are accessed. + */ + var currentComputation: Computation; + + var Dependency: DependencyStatic; + /** + * A Dependency represents an atomic unit of reactive data that a + * computation might depend on. Reactive data sources such as Session or + * Minimongo internally create different Dependency objects for different + * pieces of data, each of which may be depended on by multiple computations. + * When the data changes, the computations are invalidated. + */ + interface DependencyStatic { + new (): Dependency; + } + interface Dependency { + /** + * Invalidate all dependent computations immediately and remove them as dependents. + */ + changed(): void; + /** + * Declares that the current computation (or `fromComputation` if given) depends on `dependency`. The computation will be invalidated the next time `dependency` changes. + * If there is no current computation and `depend()` is called with no arguments, it does nothing and returns false. + * Returns true if the computation is a new dependent of `dependency` rather than an existing one. + * @param fromComputation An optional computation declared to depend on `dependency` instead of the current computation. + */ + depend(fromComputation?: Computation): boolean; + /** + * True if this Dependency has one or more dependent Computations, which would be invalidated if this Dependency were to change. + */ + hasDependents(): boolean; + } + + /** + * True if there is a current computation, meaning that dependencies on reactive data sources will be tracked and potentially cause the current computation to be rerun. + */ + var active: boolean; + + /** + * Schedules a function to be called during the next flush, or later in the current flush if one is in progress, after all invalidated computations have been rerun. The function will be run + * once and not on subsequent flushes unless `afterFlush` is called again. + * @param callback A function to call at flush time. + */ + function afterFlush(callback: Function): void; + + /** + * Run a function now and rerun it later whenever its dependencies + * change. Returns a Computation object that can be used to stop or observe the + * rerunning. + * @param runFunc The function to run. It receives one argument: the Computation object that will be returned. + */ + function autorun( + runFunc: (computation: Computation) => void, + options?: { + /** + * The function to run when an error + * happens in the Computation. The only argument it receives is the Error + * thrown. Defaults to the error being logged to the console. + */ + onError?: Function | undefined; + } + ): Computation; + + /** + * Process all reactive updates immediately and ensure that all invalidated computations are rerun. + */ + function flush(): void; + + /** + * Run a function without tracking dependencies. + * @param func A function to call immediately. + */ + function nonreactive(func: () => T): T; + + /** + * Registers a new `onInvalidate` callback on the current computation (which must exist), to be called immediately when the current computation is invalidated or stopped. + * @param callback A callback function that will be invoked as `func(c)`, where `c` is the computation on which the callback is registered. + */ + function onInvalidate(callback: Function): void; +} From 79563d6da25f9011f69db27c213e87a0ef5a7772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 7 Sep 2022 16:02:59 +0200 Subject: [PATCH 051/114] Add types for webapp package --- packages/webapp/package-types.json | 3 ++ packages/webapp/package.js | 1 + packages/webapp/webapp.d.ts | 87 ++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 packages/webapp/package-types.json create mode 100644 packages/webapp/webapp.d.ts diff --git a/packages/webapp/package-types.json b/packages/webapp/package-types.json new file mode 100644 index 0000000000..ba477f3ba8 --- /dev/null +++ b/packages/webapp/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "webapp.d.ts" +} diff --git a/packages/webapp/package.js b/packages/webapp/package.js index 5464ea7dc8..5420188efc 100644 --- a/packages/webapp/package.js +++ b/packages/webapp/package.js @@ -57,6 +57,7 @@ Package.onUse(function(api) { api.export('WebApp', 'client'); api.mainModule('webapp_cordova.js', 'web.cordova'); + api.addAssets('webapp.d.ts', ['client', 'server']); }); Package.onTest(function(api) { diff --git a/packages/webapp/webapp.d.ts b/packages/webapp/webapp.d.ts new file mode 100644 index 0000000000..2a3d9ecdfb --- /dev/null +++ b/packages/webapp/webapp.d.ts @@ -0,0 +1,87 @@ +import * as http from 'http'; +import * as connect from 'connect'; + +declare interface StaticFiles { + [key: string]: { + content?: string | undefined; + absolutePath: string; + cacheable: boolean; + hash: string; + sourceMapUrl?: string | undefined; + type: string; + }; +} + +declare module WebApp { + var defaultArch: string; + var clientPrograms: { + [key: string]: { + format: string; + manifest: any; + version: string; + cordovaCompatibilityVersions?: any; + PUBLIC_SETTINGS: any; + }; + }; + var connectHandlers: connect.Server; + var rawConnectHandlers: connect.Server; + var httpServer: http.Server; + var connectApp: connect.Server; + function suppressConnectErrors(): void; + function onListening(callback: Function): void; + + type RuntimeConfigHookCallback = (options: { + arch: 'web.browser' | 'web.browser.legacy' | 'web.cordova'; + request: http.IncomingMessage; + encodedCurrentConfig: string; + updated: boolean; + }) => string | undefined | null | false; + function addRuntimeConfigHook(callback: RuntimeConfigHookCallback): void; + function decodeRuntimeConfig(rtimeConfigString: string): unknown; + function encodeRuntimeConfig(rtimeConfig: unknown): string; +} + +declare module WebAppInternals { + var NpmModules: { + [key: string]: { + version: string; + module: any; + }; + }; + function identifyBrowser( + userAgentString: string + ): { + name: string; + major: string; + minor: string; + patch: string; + }; + function registerBoilerplateDataCallback( + key: string, + callback: Function + ): Function; + function generateBoilerplateInstance( + arch: string, + manifest: any, + additionalOptions: any + ): any; + + function staticFilesMiddleware( + staticFiles: StaticFiles, + req: http.IncomingMessage, + res: http.ServerResponse, + next: Function + ): void; + function parsePort(port: string): number; + function reloadClientPrograms(): void; + function generateBoilerplate(): void; + var staticFiles: StaticFiles; + function inlineScriptsAllowed(): boolean; + function setInlineScriptsAllowed(inlineScriptsAllowed: boolean): void; + + function setBundledJsCssUrlRewriteHook(hookFn: (url: string) => string): void; + function setBundledJsCssPrefix(bundledJsCssPrefix: string): void; + function addStaticJs(): void; + function getBoilerplate(request: http.IncomingMessage, arch: string): string; + var additionalStaticJs: any; +} From 37cbb9b06bcc5e0e5372e5d778c84c063a8c32b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Fri, 9 Sep 2022 13:19:09 +0200 Subject: [PATCH 052/114] Add types for underscore package --- packages/underscore/package-types.json | 3 +++ packages/underscore/package.js | 2 ++ packages/underscore/underscore.d.ts | 2 ++ 3 files changed, 7 insertions(+) create mode 100644 packages/underscore/package-types.json create mode 100644 packages/underscore/underscore.d.ts diff --git a/packages/underscore/package-types.json b/packages/underscore/package-types.json new file mode 100644 index 0000000000..347b86d05e --- /dev/null +++ b/packages/underscore/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "underscore.d.ts" +} diff --git a/packages/underscore/package.js b/packages/underscore/package.js index 483509a727..dca1b73c77 100644 --- a/packages/underscore/package.js +++ b/packages/underscore/package.js @@ -27,6 +27,8 @@ Package.onUse(function (api) { // numeric length field whose constructor === Object are still treated as // objects, not as arrays. Search for looksLikeArray. api.addFiles(['pre.js', 'underscore.js', 'post.js']); + + api.addAssets('underscore.d.ts', ['client', 'server']); }); diff --git a/packages/underscore/underscore.d.ts b/packages/underscore/underscore.d.ts new file mode 100644 index 0000000000..ffbb281e51 --- /dev/null +++ b/packages/underscore/underscore.d.ts @@ -0,0 +1,2 @@ +import * as _ from 'underscore'; +export { _ }; From 8e30cfd7112f040214f4ac4053938deab8181349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Fri, 9 Sep 2022 13:21:34 +0200 Subject: [PATCH 053/114] Add declarations and missing exports --- packages/check/check.d.ts | 2 +- packages/email/email.d.ts | 3 ++- .../hot-module-replacement/hot-module-replacement.d.ts | 2 +- packages/modern-browsers/modern.d.ts | 2 +- packages/promise/promise.d.ts | 2 +- packages/reactive-dict/reactive-dict.d.ts | 2 +- packages/reactive-var/reactive-var.d.ts | 2 +- packages/server-render/server-render.d.ts | 10 +++++----- .../service-configuration/service-configuration.d.ts | 4 ++-- packages/session/session.d.ts | 2 +- packages/tracker/tracker.d.ts | 2 +- packages/webapp/webapp.d.ts | 6 +++--- 12 files changed, 20 insertions(+), 19 deletions(-) diff --git a/packages/check/check.d.ts b/packages/check/check.d.ts index 4790890b9d..0322aab9e9 100644 --- a/packages/check/check.d.ts +++ b/packages/check/check.d.ts @@ -86,7 +86,7 @@ export namespace Match { * @param value The value to check * @param pattern The pattern to match `value` against */ -export function check( +export declare function check( value: any, pattern: T ): asserts value is Match.PatternMatch; diff --git a/packages/email/email.d.ts b/packages/email/email.d.ts index 6b9a356721..71380d328e 100644 --- a/packages/email/email.d.ts +++ b/packages/email/email.d.ts @@ -30,7 +30,8 @@ export interface MailComposerOptions { forceEmbeddedImages: boolean; } -export var MailComposer: MailComposerStatic; +export declare var MailComposer: MailComposerStatic; + export interface MailComposerStatic { new (options: MailComposerOptions): MailComposer; } diff --git a/packages/hot-module-replacement/hot-module-replacement.d.ts b/packages/hot-module-replacement/hot-module-replacement.d.ts index 3d92dfc754..767262f3ac 100644 --- a/packages/hot-module-replacement/hot-module-replacement.d.ts +++ b/packages/hot-module-replacement/hot-module-replacement.d.ts @@ -11,4 +11,4 @@ export interface Module { }; } -export var module: NodeJS.Module; +export declare var module: NodeJS.Module; diff --git a/packages/modern-browsers/modern.d.ts b/packages/modern-browsers/modern.d.ts index 28713c5705..69f1268f74 100644 --- a/packages/modern-browsers/modern.d.ts +++ b/packages/modern-browsers/modern.d.ts @@ -1,4 +1,4 @@ -export function setMinimumBrowserVersions( +export declare function setMinimumBrowserVersions( versions: Record, source: string ): void; diff --git a/packages/promise/promise.d.ts b/packages/promise/promise.d.ts index 2e6b034b55..38698fc7cb 100644 --- a/packages/promise/promise.d.ts +++ b/packages/promise/promise.d.ts @@ -1,4 +1,4 @@ -export class Promise extends globalThis.Promise { +export declare class Promise extends globalThis.Promise { static async< Fn extends (this: This, ...args: Args) => any, This, diff --git a/packages/reactive-dict/reactive-dict.d.ts b/packages/reactive-dict/reactive-dict.d.ts index 78c671c4d3..b9a32ec4d8 100644 --- a/packages/reactive-dict/reactive-dict.d.ts +++ b/packages/reactive-dict/reactive-dict.d.ts @@ -1,6 +1,6 @@ import { EJSONable } from 'meteor/ejson'; -export class ReactiveDict { +export declare class ReactiveDict { /** * Constructor for a ReactiveDict, which represents a reactive dictionary of key/value pairs. * @param name When a name is passed, preserves contents across Hot Code Pushes diff --git a/packages/reactive-var/reactive-var.d.ts b/packages/reactive-var/reactive-var.d.ts index b47730aa51..f7d22c7559 100644 --- a/packages/reactive-var/reactive-var.d.ts +++ b/packages/reactive-var/reactive-var.d.ts @@ -1,4 +1,4 @@ -export var ReactiveVar: ReactiveVarStatic; +export declare var ReactiveVar: ReactiveVarStatic; export interface ReactiveVarStatic { /** diff --git a/packages/server-render/server-render.d.ts b/packages/server-render/server-render.d.ts index 9a16690cfd..8f55c0fe07 100644 --- a/packages/server-render/server-render.d.ts +++ b/packages/server-render/server-render.d.ts @@ -2,9 +2,9 @@ import * as http from 'http'; // NodeJS.ReadableStream only works on server. // HTMLElement only works on client. -type Content = string | Content[] | NodeJS.ReadableStream | HTMLElement; +export type Content = string | Content[] | NodeJS.ReadableStream | HTMLElement; -interface ClientSink { +export interface ClientSink { // Client and server. Only client appendToHead(html: Content): void; appendToBody(html: Content): void; @@ -19,7 +19,7 @@ interface ClientSink { getCookies(): { [key: string]: string }; } -interface ServerSink extends ClientSink { +export interface ServerSink extends ClientSink { // Server-only: request: http.IncomingMessage; arch: string; @@ -29,8 +29,8 @@ interface ServerSink extends ClientSink { maybeMadeChanges: boolean; } -type Sink = ClientSink | ServerSink; +export type Sink = ClientSink | ServerSink; -type Callback = (sink: Sink) => Promise | any; +export type Callback = (sink: Sink) => Promise | any; export function onPageLoad(callback: T): T; diff --git a/packages/service-configuration/service-configuration.d.ts b/packages/service-configuration/service-configuration.d.ts index 267f0ac7b2..3c18cfaac3 100644 --- a/packages/service-configuration/service-configuration.d.ts +++ b/packages/service-configuration/service-configuration.d.ts @@ -1,10 +1,10 @@ import { Mongo } from 'meteor/mongo'; -interface Configuration { +export interface Configuration { appId: string; secret: string; } -declare var ServiceConfiguration: { +export declare var ServiceConfiguration: { configurations: Mongo.Collection; }; diff --git a/packages/session/session.d.ts b/packages/session/session.d.ts index c32f863244..6e5afd4420 100644 --- a/packages/session/session.d.ts +++ b/packages/session/session.d.ts @@ -1,6 +1,6 @@ import { EJSONable } from 'meteor/ejson'; -declare namespace Session { +export namespace Session { /** * Test if a session variable is equal to a value. If inside a * reactive computation, invalidate the computation the next diff --git a/packages/tracker/tracker.d.ts b/packages/tracker/tracker.d.ts index cbd49a9b29..9ab6e0bdc5 100644 --- a/packages/tracker/tracker.d.ts +++ b/packages/tracker/tracker.d.ts @@ -1,7 +1,7 @@ /** * The namespace for Tracker-related methods. */ -export declare namespace Tracker { +export namespace Tracker { function Computation(): void; /** * A Computation object represents code that is repeatedly rerun diff --git a/packages/webapp/webapp.d.ts b/packages/webapp/webapp.d.ts index 2a3d9ecdfb..e13bb9ccf0 100644 --- a/packages/webapp/webapp.d.ts +++ b/packages/webapp/webapp.d.ts @@ -1,7 +1,7 @@ import * as http from 'http'; import * as connect from 'connect'; -declare interface StaticFiles { +export interface StaticFiles { [key: string]: { content?: string | undefined; absolutePath: string; @@ -12,7 +12,7 @@ declare interface StaticFiles { }; } -declare module WebApp { +export declare module WebApp { var defaultArch: string; var clientPrograms: { [key: string]: { @@ -41,7 +41,7 @@ declare module WebApp { function encodeRuntimeConfig(rtimeConfig: unknown): string; } -declare module WebAppInternals { +export declare module WebAppInternals { var NpmModules: { [key: string]: { version: string; From eb7a50c61006282d1e93c8e78b741fb885b295d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Fri, 9 Sep 2022 14:04:11 +0200 Subject: [PATCH 054/114] Add types for fetch package --- packages/fetch/fetch.d.ts | 4 ++++ packages/fetch/package-types.json | 3 +++ packages/fetch/package.js | 1 + 3 files changed, 8 insertions(+) create mode 100644 packages/fetch/fetch.d.ts create mode 100644 packages/fetch/package-types.json diff --git a/packages/fetch/fetch.d.ts b/packages/fetch/fetch.d.ts new file mode 100644 index 0000000000..8d6eb289ad --- /dev/null +++ b/packages/fetch/fetch.d.ts @@ -0,0 +1,4 @@ +export declare function fetch(): typeof globalThis.fetch; +export declare var Headers: typeof globalThis.Headers; +export declare var Request: typeof globalThis.Request; +export declare var Response: typeof globalThis.Response; diff --git a/packages/fetch/package-types.json b/packages/fetch/package-types.json new file mode 100644 index 0000000000..3fcb42c31a --- /dev/null +++ b/packages/fetch/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "fetch.d.ts" +} diff --git a/packages/fetch/package.js b/packages/fetch/package.js index 9c3969ff7b..53830c6a2c 100644 --- a/packages/fetch/package.js +++ b/packages/fetch/package.js @@ -19,6 +19,7 @@ Package.onUse(function(api) { api.mainModule("legacy.js", "legacy"); api.mainModule("server.js", "server"); + api.addAssets("fetch.d.ts", ["client", "server"]); // The other exports (Headers, Request, Response) can be imported // explicitly from the "meteor/fetch" package. api.export("fetch"); From 559a1c622f40dc06711408c640d5ded73c8d384a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Fri, 9 Sep 2022 14:04:37 +0200 Subject: [PATCH 055/114] Add types for ejson package --- packages/ejson/ejson.d.ts | 71 +++++++++++++++++++++++++++++++ packages/ejson/package-types.json | 3 ++ packages/ejson/package.js | 1 + 3 files changed, 75 insertions(+) create mode 100644 packages/ejson/ejson.d.ts create mode 100644 packages/ejson/package-types.json diff --git a/packages/ejson/ejson.d.ts b/packages/ejson/ejson.d.ts new file mode 100644 index 0000000000..61c3a7674c --- /dev/null +++ b/packages/ejson/ejson.d.ts @@ -0,0 +1,71 @@ +export interface EJSONableCustomType { + clone?(): EJSONableCustomType; + equals?(other: Object): boolean; + toJSONValue(): JSONable; + typeName(): string; +} + +export type EJSONableProperty = + | number + | string + | boolean + | Object + | number[] + | string[] + | Object[] + | Date + | Uint8Array + | EJSONableCustomType + | undefined + | null; + +export interface EJSONable { + [key: string]: EJSONableProperty; +} + +export interface JSONable { + [key: string]: + | number + | string + | boolean + | Object + | number[] + | string[] + | Object[] + | undefined + | null; +} + +export interface EJSON extends EJSONable {} + +export namespace EJSON { + function addType( + name: string, + factory: (val: JSONable) => EJSONableCustomType + ): void; + + function clone(val: T): T; + + function equals( + a: EJSON, + b: EJSON, + options?: { keyOrderSensitive?: boolean | undefined } + ): boolean; + + function fromJSONValue(val: JSONable): any; + + function isBinary(x: Object): x is Uint8Array; + function newBinary(size: number): Uint8Array; + + function parse(str: string): EJSON; + + function stringify( + val: EJSON, + options?: { + indent?: boolean | number | string | undefined; + canonical?: boolean | undefined; + } + ): string; + + function toJSONValue(val: EJSON): JSONable; +} diff --git a/packages/ejson/package-types.json b/packages/ejson/package-types.json new file mode 100644 index 0000000000..3f2149b4c0 --- /dev/null +++ b/packages/ejson/package-types.json @@ -0,0 +1,3 @@ +{ + "typesEntry": "ejson.d.ts" +} diff --git a/packages/ejson/package.js b/packages/ejson/package.js index 2a10d49443..7ed5099790 100644 --- a/packages/ejson/package.js +++ b/packages/ejson/package.js @@ -5,6 +5,7 @@ Package.describe({ Package.onUse(function onUse(api) { api.use(['ecmascript', 'base64']); + api.addAssets('ejson.d.ts', ['client', 'server']); api.mainModule('ejson.js'); api.export('EJSON'); }); From a91016fbcb99d7881dada756db6ad7f770dc5f15 Mon Sep 17 00:00:00 2001 From: Zack Date: Thu, 15 Sep 2022 17:14:03 -0400 Subject: [PATCH 056/114] Update mongo_driver.js --- packages/mongo/mongo_driver.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/mongo/mongo_driver.js b/packages/mongo/mongo_driver.js index 02dcb994cd..4bcc5686ec 100644 --- a/packages/mongo/mongo_driver.js +++ b/packages/mongo/mongo_driver.js @@ -63,6 +63,10 @@ var unmakeMongoLegal = function (name) { return name.substr(5); }; var replaceMongoAtomWithMeteor = function (document) { if (document instanceof MongoDB.Binary) { + // for backwards compatibility + if (document.sub_type !== 0) { + return document; + } var buffer = document.value(true); return new Uint8Array(buffer); } @@ -92,6 +96,9 @@ var replaceMeteorAtomWithMongo = function (document) { // serialize it correctly). return new MongoDB.Binary(Buffer.from(document)); } + if (document instanceof Mongo.Binary) { + return document; + } if (document instanceof Mongo.ObjectID) { return new MongoDB.ObjectID(document.toHexString()); } From 454c40fb96db65a713472f9c36854b2d7d411d71 Mon Sep 17 00:00:00 2001 From: Zack Date: Thu, 15 Sep 2022 17:18:25 -0400 Subject: [PATCH 057/114] Update mongo_driver.js --- packages/mongo/mongo_driver.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mongo/mongo_driver.js b/packages/mongo/mongo_driver.js index 4bcc5686ec..27b0e33248 100644 --- a/packages/mongo/mongo_driver.js +++ b/packages/mongo/mongo_driver.js @@ -96,7 +96,7 @@ var replaceMeteorAtomWithMongo = function (document) { // serialize it correctly). return new MongoDB.Binary(Buffer.from(document)); } - if (document instanceof Mongo.Binary) { + if (document instanceof MongoDB.Binary) { return document; } if (document instanceof Mongo.ObjectID) { From a86296e47a24e55592e42ef72db7422ef2b43e8d Mon Sep 17 00:00:00 2001 From: Zack Newsham Date: Mon, 19 Sep 2022 07:45:06 -0400 Subject: [PATCH 058/114] add tests for Binary atoms --- packages/mongo/collection_tests.js | 181 +++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) diff --git a/packages/mongo/collection_tests.js b/packages/mongo/collection_tests.js index da34c62792..4c6b7f11b2 100644 --- a/packages/mongo/collection_tests.js +++ b/packages/mongo/collection_tests.js @@ -1,3 +1,6 @@ + +var MongoDB = NpmModuleMongodb; + Tinytest.add( 'collection - call Mongo.Collection without new', function (test) { @@ -203,3 +206,181 @@ Tinytest.add('collection - calling find with an invalid readPreference', } } ); + +Tinytest.add('collection - inserting a document with a binary should return a document with a binary', + function(test) { + if (Meteor.isServer) { + const collection = new Mongo.Collection('testBinary1'); + const _id = Random.id(); + collection.insert({ + _id, + binary: new MongoDB.Binary(Buffer.from('hello world'), 6) + }); + + const doc = collection.findOne({ _id }); + test.ok( + doc.binary instanceof MongoDB.Binary + ); + test.equal( + doc.binary.buffer, + Buffer.from('hello world') + ); + } + } +); + +Tinytest.add('collection - inserting a document with a binary (sub type 0) should return a document with a uint8array', + function(test) { + if (Meteor.isServer) { + const collection = new Mongo.Collection('testBinary8'); + const _id = Random.id(); + collection.insert({ + _id, + binary: new MongoDB.Binary(Buffer.from('hello world'), 0) + }); + + const doc = collection.findOne({ _id }); + test.ok( + doc.binary instanceof Uint8Array + ); + test.equal( + doc.binary, + new Uint8Array(Buffer.from('hello world')) + ); + } + } +); + +Tinytest.add('collection - updating a document with a binary should return a document with a binary', + function(test) { + if (Meteor.isServer) { + const collection = new Mongo.Collection('testBinary2'); + const _id = Random.id(); + collection.insert({ + _id + }); + + collection.update({ _id }, { $set: { binary: new MongoDB.Binary(Buffer.from('hello world'), 6) } }); + + const doc = collection.findOne({ _id }); + test.ok( + doc.binary instanceof MongoDB.Binary + ); + test.equal( + doc.binary.buffer, + Buffer.from('hello world') + ); + } + } +); + +Tinytest.add('collection - updating a document with a binary (sub type 0) should return a document with a uint8array', + function(test) { + if (Meteor.isServer) { + const collection = new Mongo.Collection('testBinary7'); + const _id = Random.id(); + collection.insert({ + _id + }); + + collection.update({ _id }, { $set: { binary: new MongoDB.Binary(Buffer.from('hello world'), 0) } }); + + const doc = collection.findOne({ _id }); + test.ok( + doc.binary instanceof Uint8Array + ); + test.equal( + doc.binary, + new Uint8Array(Buffer.from('hello world')) + ); + } + } +); + +Tinytest.add('collection - inserting a document with a uint8array should return a document with a uint8array', + function(test) { + if (Meteor.isServer) { + const collection = new Mongo.Collection('testBinary3'); + const _id = Random.id(); + collection.insert({ + _id, + binary: new Uint8Array(Buffer.from('hello world')) + }); + + const doc = collection.findOne({ _id }); + test.ok( + doc.binary instanceof Uint8Array + ); + test.equal( + doc.binary, + new Uint8Array(Buffer.from('hello world')) + ); + } + } +); + +Tinytest.add('collection - updating a document with a uint8array should return a document with a uint8array', + function(test) { + if (Meteor.isServer) { + const collection = new Mongo.Collection('testBinary4'); + const _id = Random.id(); + collection.insert({ + _id + }); + + collection.update( + { _id }, + { $set: { binary: new Uint8Array(Buffer.from('hello world')) } } + ) + + const doc = collection.findOne({ _id }); + test.ok( + doc.binary instanceof Uint8Array + ); + test.equal( + doc.binary, + new Uint8Array(Buffer.from('hello world')) + ); + } + } +); + +Tinytest.add('collection - finding with a query with a uint8array field should return the correct document', + function(test) { + if (Meteor.isServer) { + const collection = new Mongo.Collection('testBinary5'); + const _id = Random.id(); + collection.insert({ + _id, + binary: new Uint8Array(Buffer.from('hello world')) + }); + + const doc = collection.findOne({ binary: new Uint8Array(Buffer.from('hello world')) }); + test.equal( + doc._id, + _id + ); + collection.remove({}); + } + } +); + +Tinytest.add('collection - finding with a query with a binary field should return the correct document', + function(test) { + if (Meteor.isServer) { + const collection = new Mongo.Collection('testBinary6'); + const _id = Random.id(); + collection.insert({ + _id, + binary: new MongoDB.Binary(Buffer.from('hello world'), 6) + }); + + const doc = collection.findOne({ binary: new MongoDB.Binary(Buffer.from('hello world'), 6) }); + test.equal( + doc._id, + _id + ); + collection.remove({}); + } + } +); From 0a643dd95f269bd80d7a652151f196fcd520c633 Mon Sep 17 00:00:00 2001 From: Zack Newsham Date: Mon, 19 Sep 2022 07:46:16 -0400 Subject: [PATCH 059/114] add npm-mongo dependency for testing --- packages/mongo/package.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/mongo/package.js b/packages/mongo/package.js index fc6703c9b4..ff811d0d63 100644 --- a/packages/mongo/package.js +++ b/packages/mongo/package.js @@ -9,7 +9,7 @@ Package.describe({ summary: "Adaptor for using MongoDB and Minimongo over DDP", - version: '1.15.0' + version: '1.14.4' }); Npm.depends({ @@ -88,6 +88,7 @@ Package.onTest(function (api) { api.use('mongo'); api.use('check'); api.use('ecmascript'); + api.use('npm-mongo', 'server'); api.use(['tinytest', 'underscore', 'test-helpers', 'ejson', 'random', 'ddp', 'base64']); // XXX test order dependency: the allow_tests "partial allow" test From 4485201f4f28edbfa24fd39cd2fb9dd92a0b6ac1 Mon Sep 17 00:00:00 2001 From: Zack Date: Mon, 19 Sep 2022 11:22:13 -0400 Subject: [PATCH 060/114] Update package.js --- packages/mongo/package.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mongo/package.js b/packages/mongo/package.js index ff811d0d63..57ec61c98b 100644 --- a/packages/mongo/package.js +++ b/packages/mongo/package.js @@ -9,7 +9,7 @@ Package.describe({ summary: "Adaptor for using MongoDB and Minimongo over DDP", - version: '1.14.4' + version: '1.15.0' }); Npm.depends({ From 7f070b83c1e43a2122a41039d8785559599c6378 Mon Sep 17 00:00:00 2001 From: Jan Dvorak Date: Wed, 5 Oct 2022 08:54:51 +0200 Subject: [PATCH 061/114] Update default Facebook API to v15 and fix local changelog --- docs/history.md | 12 ++++++++++ packages/facebook-oauth/CHANGELOG.md | 26 +++++++++++++++++----- packages/facebook-oauth/facebook_client.js | 2 +- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/docs/history.md b/docs/history.md index e20218863c..f51be3d9d7 100644 --- a/docs/history.md +++ b/docs/history.md @@ -1,3 +1,15 @@ +## 2.X.X, Unreleased + +#### Highlights + +#### Breaking Changes + +#### Migration Steps + +#### Meteor Version Release +* `facebook-oauth@1.12.0` + - Updated default version of Facebook GraphAPI to v15 + ## 2.7.3, 2022-05-31 #### Highlights diff --git a/packages/facebook-oauth/CHANGELOG.md b/packages/facebook-oauth/CHANGELOG.md index a772af6e78..b492fe1f09 100644 --- a/packages/facebook-oauth/CHANGELOG.md +++ b/packages/facebook-oauth/CHANGELOG.md @@ -1,10 +1,26 @@ # Changelog -## 1.8.0 - unreleased -### Breaking changes -- N/A - +## 1.12.0 - UNRELEASED +### Changes +- Updated default version of Facebook GraphAPI to v15 + +## 1.11.0 - 2022-03-24 +### Changes +- Updated default version of Facebook GraphAPI to v12 + +## 1.10.0 - 2021-09-14 +### Changes +- Added login handler hook, like in the Google package for easier management in React Native and similar apps. [PR](https://github.com/meteor/meteor/pull/11603) + +## 1.9.1 - 2021-08-12 +### Changes +- Allow usage of `http` package both v1 and v2 for backward compatibility + +## 1.9.0 - 2021-06-24 +### Changes +- Upgrade default Facebook API to v10 [#11362](https://github.com/meteor/meteor/pull/11362) + +## 1.8.0 - 2021-04-15 ### Changes -- Updated to use Facebook GraphAPI v10 - You can now override the default API version by setting `Meteor.settings.public.packages.facebook-oauth.apiVersion` to for example `8.0` ## 1.7.3 - 2020-10-05 diff --git a/packages/facebook-oauth/facebook_client.js b/packages/facebook-oauth/facebook_client.js index 771e1d6828..582d63bf04 100644 --- a/packages/facebook-oauth/facebook_client.js +++ b/packages/facebook-oauth/facebook_client.js @@ -30,7 +30,7 @@ Facebook.requestCredential = (options, credentialRequestCompleteCallback) => { const loginStyle = OAuth._loginStyle('facebook', config, options); - const API_VERSION = Meteor.settings?.public?.packages?.['facebook-oauth']?.apiVersion || '13.0'; + const API_VERSION = Meteor.settings?.public?.packages?.['facebook-oauth']?.apiVersion || '15.0'; let loginUrl = `https://www.facebook.com/v${API_VERSION}/dialog/oauth?client_id=${config.appId}` + From 55690f7328938f1e6d4cba2d253b77f8b97e8dd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= Date: Wed, 5 Oct 2022 14:55:55 +0200 Subject: [PATCH 062/114] updated adding assets --- packages/ejson/package.js | 2 +- packages/fetch/package.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ejson/package.js b/packages/ejson/package.js index 7ed5099790..654f16c568 100644 --- a/packages/ejson/package.js +++ b/packages/ejson/package.js @@ -5,7 +5,7 @@ Package.describe({ Package.onUse(function onUse(api) { api.use(['ecmascript', 'base64']); - api.addAssets('ejson.d.ts', ['client', 'server']); + api.addAssets('ejson.d.ts', 'server'); api.mainModule('ejson.js'); api.export('EJSON'); }); diff --git a/packages/fetch/package.js b/packages/fetch/package.js index 53830c6a2c..dcba22f913 100644 --- a/packages/fetch/package.js +++ b/packages/fetch/package.js @@ -19,7 +19,7 @@ Package.onUse(function(api) { api.mainModule("legacy.js", "legacy"); api.mainModule("server.js", "server"); - api.addAssets("fetch.d.ts", ["client", "server"]); + api.addAssets("fetch.d.ts", "server"); // The other exports (Headers, Request, Response) can be imported // explicitly from the "meteor/fetch" package. api.export("fetch"); From 43394e18559960b9f7c3aa31e79ecfdc8d5b7006 Mon Sep 17 00:00:00 2001 From: ToyboxZach <64285391+ToyboxZach@users.noreply.github.com> Date: Wed, 5 Oct 2022 11:55:22 -0700 Subject: [PATCH 063/114] Update accounts_server.js --- packages/accounts-base/accounts_server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/accounts-base/accounts_server.js b/packages/accounts-base/accounts_server.js index 9088bbbea9..76da1fe072 100644 --- a/packages/accounts-base/accounts_server.js +++ b/packages/accounts-base/accounts_server.js @@ -318,7 +318,7 @@ export class AccountsServer extends AccountsCommon { // If user is not found, try a case insensitive lookup if (!user) { selector = this._selectorForFastCaseInsensitiveLookup(fieldName, fieldValue); - const candidateUsers = Meteor.users.find(selector, options).fetch(); + const candidateUsers = Meteor.users.find(selector, { ...options, limit: 2 }).fetch(); // No match if multiple candidates are found if (candidateUsers.length === 1) { user = candidateUsers[0]; From a8aeeeea3862ae59bdf5da276b7af9cb16ca6ca8 Mon Sep 17 00:00:00 2001 From: Shivam Date: Mon, 10 Oct 2022 20:12:35 +0530 Subject: [PATCH 064/114] add docs for registering login handler --- docs/source/api/accounts-multi.md | 9 +++++++++ packages/accounts-base/accounts_server.js | 21 ++++++++------------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/docs/source/api/accounts-multi.md b/docs/source/api/accounts-multi.md index 644a28970f..8689b15859 100644 --- a/docs/source/api/accounts-multi.md +++ b/docs/source/api/accounts-multi.md @@ -315,6 +315,15 @@ Accounts.setAdditionalFindUserOnExternalLogin(({serviceName, serviceData}) => { } }) ``` +{% apibox "AccountsServer#registerLoginHandler" %} + +Use this to register your own custom authentication method. This is also used by all of the other inbuilt accounts packages to integrate with the accounts system. + +There can be multiple login handlers that are registered. When a login request is made, it will go through all these handlers to find its own handler. + +The registered handler callback is called with a single argument, the `options` object which comes from the login method. For example, if you want to login with a plaintext password, `options` could be `{ user: { username: }, password: }`,or `{ user: { email: }, password: }`. + +The login handler should return `undefined` if it's not going to handle the login request or else the login result object.

Rate Limiting

diff --git a/packages/accounts-base/accounts_server.js b/packages/accounts-base/accounts_server.js index 9088bbbea9..35d6df57e7 100644 --- a/packages/accounts-base/accounts_server.js +++ b/packages/accounts-base/accounts_server.js @@ -547,19 +547,14 @@ export class AccountsServer extends AccountsCommon { /// LOGIN HANDLERS /// - // The main entry point for auth packages to hook in to login. - // - // A login handler is a login method which can return `undefined` to - // indicate that the login request is not handled by this handler. - // - // @param name {String} Optional. The service name, used by default - // if a specific service name isn't returned in the result. - // - // @param handler {Function} A function that receives an options object - // (as passed as an argument to the `login` method) and returns one of: - // - `undefined`, meaning don't handle; - // - a login method result object - + /** + * @summary Registers a new login handler. + * @locus Server + * @param {String} [name] The type of login method like oauth, password, etc. + * @param {Function} handler A function that receives an options object + * (as passed as an argument to the `login` method) and returns one of + * `undefined`, meaning don't handle or a login method result object. + */ registerLoginHandler(name, handler) { if (! handler) { handler = name; From 12e867f89b15d56ecee807817e6028e086ce81fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Miernik?= Date: Tue, 18 Oct 2022 22:31:19 +0200 Subject: [PATCH 065/114] Updated MongoDB driver to 4.10. --- .../.npm/package/npm-shrinkwrap.json | 30 +++++++++---------- packages/npm-mongo/package.js | 4 +-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json index bdf03af949..67cb84d7f3 100644 --- a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json +++ b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json @@ -2,14 +2,14 @@ "lockfileVersion": 1, "dependencies": { "@types/node": { - "version": "18.7.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", - "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==" + "version": "18.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz", + "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==" }, "@types/webidl-conversions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", - "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" }, "@types/whatwg-url": { "version": "8.2.2", @@ -52,14 +52,14 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" }, "mongodb": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.0.tgz", - "integrity": "sha512-tJJEFJz7OQTQPZeVHZJIeSOjMRqc5eSyXTt86vSQENEErpkiG7279tM/GT5AVZ7TgXNh9HQxoa2ZkbrANz5GQw==" + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.10.0.tgz", + "integrity": "sha512-My2QxLTw0Cc1O9gih0mz4mqo145Jq4rLAQx0Glk/Ha9iYBzYpt4I2QFNRIh35uNFNfe8KFQcdwY1/HKxXBkinw==" }, "mongodb-connection-string-url": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz", - "integrity": "sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==" + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", + "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==" }, "punycode": { "version": "2.1.1", @@ -77,9 +77,9 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==" + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==" }, "sparse-bitfield": { "version": "3.0.3", diff --git a/packages/npm-mongo/package.js b/packages/npm-mongo/package.js index b8519fa86a..bab293fd71 100644 --- a/packages/npm-mongo/package.js +++ b/packages/npm-mongo/package.js @@ -3,12 +3,12 @@ Package.describe({ summary: "Wrapper around the mongo npm package", - version: "4.9.0", + version: "4.10.0", documentation: null }); Npm.depends({ - mongodb: "4.9.0" + mongodb: "4.10.0" }); Package.onUse(function (api) { From c951192ff83d7a01f20f5ec95763324bf8d37fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Miernik?= Date: Thu, 20 Oct 2022 08:34:04 +0200 Subject: [PATCH 066/114] Updated MongoDB driver to 4.11. --- .../.npm/package/npm-shrinkwrap.json | 377 +++++++++++++++++- packages/npm-mongo/package.js | 4 +- 2 files changed, 373 insertions(+), 8 deletions(-) diff --git a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json index 67cb84d7f3..11662ebe99 100644 --- a/packages/npm-mongo/.npm/package/npm-shrinkwrap.json +++ b/packages/npm-mongo/.npm/package/npm-shrinkwrap.json @@ -1,10 +1,350 @@ { "lockfileVersion": 1, "dependencies": { + "@aws-crypto/ie11-detection": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", + "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", + "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", + "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", + "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", + "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.190.0.tgz", + "integrity": "sha512-M6qo2exTzEfHT5RuW7K090OgesUojhb2JyWiV4ulu7ngY4DWBUBMKUqac696sHRUZvGE5CDzSi0606DMboM+kA==" + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.192.0.tgz", + "integrity": "sha512-nIRmiv5JY8wWGUadhG7yLx8o8aVETj5CAgO8e8UJIwwqfue/Yv9bHi2mvkUphO1pj0TeBatAtvu79neJQtsR5g==" + }, + "@aws-sdk/client-sso": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.190.0.tgz", + "integrity": "sha512-joEKRjJEzgvXnEih/x2UDDCPlvXWCO3MAHmqi44yJ36Ph4YsFS299mOjPdVLuzUtpQ+cST1nRO7hXNFrulW2jQ==" + }, + "@aws-sdk/client-sts": { + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.192.0.tgz", + "integrity": "sha512-iv72dmRxbZ1cN5jGn4KIVzzu11eduS2fXHbNgd7JsFd5hLBV5TvJaugQzUdXNmy2gN4HiRJr+qa9WkD5b39lsA==" + }, + "@aws-sdk/config-resolver": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.190.0.tgz", + "integrity": "sha512-K+VnDtjTgjpf7yHEdDB0qgGbHToF0pIL0pQMSnmk2yc8BoB3LGG/gg1T0Ki+wRlrFnDCJ6L+8zUdawY2qDsbyw==" + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.192.0.tgz", + "integrity": "sha512-CWo+KyHCGyYtvjlmDIGtnwBEkdiondergZADiStbFFvie8pPI7IsdTXNVssQQ1VxKIBGGHVebgZGSklHBqthwA==" + }, + "@aws-sdk/credential-provider-env": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.190.0.tgz", + "integrity": "sha512-GTY7l3SJhTmRGFpWddbdJOihSqoMN8JMo3CsCtIjk4/h3xirBi02T4GSvbrMyP7FP3Fdl4NAdT+mHJ4q2Bvzxw==" + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.190.0.tgz", + "integrity": "sha512-gI5pfBqGYCKdmx8igPvq+jLzyE2kuNn9Q5u73pdM/JZxiq7GeWYpE/MqqCubHxPtPcTFgAwxCxCFoXlUTBh/2g==" + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.190.0.tgz", + "integrity": "sha512-Z7NN/evXJk59hBQlfOSWDfHntwmxwryu6uclgv7ECI6SEVtKt1EKIlPuCLUYgQ4lxb9bomyO5lQAl/1WutNT5w==" + }, + "@aws-sdk/credential-provider-node": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.190.0.tgz", + "integrity": "sha512-ctCG5+TsIK2gVgvvFiFjinPjc5nGpSypU3nQKCaihtPh83wDN6gCx4D0p9M8+fUrlPa5y+o/Y7yHo94ATepM8w==" + }, + "@aws-sdk/credential-provider-process": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.190.0.tgz", + "integrity": "sha512-sIJhICR80n5XY1kW/EFHTh5ZzBHb5X+744QCH3StcbKYI44mOZvNKfFdeRL2fQ7yLgV7npte2HJRZzQPWpZUrw==" + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.190.0.tgz", + "integrity": "sha512-uarU9vk471MHHT+GJj3KWFSmaaqLNL5n1KcMer2CCAZfjs+mStAi8+IjZuuKXB4vqVs5DxdH8cy5aLaJcBlXwQ==" + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.190.0.tgz", + "integrity": "sha512-nlIBeK9hGHKWC874h+ITAfPZ9Eaok+x/ydZQVKsLHiQ9PH3tuQ8AaGqhuCwBSH0hEAHZ/BiKeEx5VyWAE8/x+Q==" + }, + "@aws-sdk/credential-providers": { + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.192.0.tgz", + "integrity": "sha512-iBTrEPkfOHlfgQyk7EeUCmZnhUKXsGcc/hhxBbc6Z/Xc7Y8LqRVLbEmHq9lruXraFuvs26xV9oZi1s1UMXneQA==" + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.190.0.tgz", + "integrity": "sha512-5riRpKydARXAPLesTZm6eP6QKJ4HJGQ3k0Tepi3nvxHVx3UddkRNoX0pLS3rvbajkykWPNC2qdfRGApWlwOYsA==" + }, + "@aws-sdk/hash-node": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.190.0.tgz", + "integrity": "sha512-DNwVT3O8zc9Jk/bXiXcN0WsD98r+JJWryw9F1/ZZbuzbf6rx2qhI8ZK+nh5X6WMtYPU84luQMcF702fJt/1bzg==" + }, + "@aws-sdk/invalid-dependency": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.190.0.tgz", + "integrity": "sha512-crCh63e8d/Uw9y3dQlVTPja7+IZiXpNXyH6oSuAadTDQwMq6KK87Av1/SDzVf6bAo2KgAOo41MyO2joaCEk0dQ==" + }, + "@aws-sdk/is-array-buffer": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.188.0.tgz", + "integrity": "sha512-n69N4zJZCNd87Rf4NzufPzhactUeM877Y0Tp/F3KiHqGeTnVjYUa4Lv1vLBjqtfjYb2HWT3NKlYn5yzrhaEwiQ==" + }, + "@aws-sdk/middleware-content-length": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.190.0.tgz", + "integrity": "sha512-sSU347SuC6I8kWum1jlJlpAqeV23KP7enG+ToWcEcgFrJhm3AvuqB//NJxDbkKb2DNroRvJjBckBvrwNAjQnBQ==" + }, + "@aws-sdk/middleware-host-header": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.190.0.tgz", + "integrity": "sha512-cL7Vo/QSpGx/DDmFxjeV0Qlyi1atvHQDPn3MLBBmi1icu+3GKZkCMAJwzsrV3U4+WoVoDYT9FJ9yMQf2HaIjeQ==" + }, + "@aws-sdk/middleware-logger": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.190.0.tgz", + "integrity": "sha512-rrfLGYSZCBtiXNrIa8pJ2uwUoUMyj6Q82E8zmduTvqKWviCr6ZKes0lttGIkWhjvhql2m4CbjG5MPBnY7RXL4A==" + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.190.0.tgz", + "integrity": "sha512-5tc1AIIZe5jDNdyuJW+7vIFmQOxz3q031ZVrEtUEIF7cz2ySho2lkOWziz+v+UGSLhjHGKMz3V26+aN1FLZNxQ==" + }, + "@aws-sdk/middleware-retry": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.190.0.tgz", + "integrity": "sha512-h1bPopkncf2ue/erJdhqvgR2AEh0bIvkNsIHhx93DckWKotZd/GAVDq0gpKj7/f/7B+teHH8Fg5GDOwOOGyKcg==" + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.192.0.tgz", + "integrity": "sha512-xzTV7MyG5ipWYTvekWX1tQc5ExsUvCYsDTBCD3LR5hBrP8assUDPo52zGSe+QMcjgnQv7BcYIzeikTkLEG0dUw==" + }, + "@aws-sdk/middleware-serde": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.190.0.tgz", + "integrity": "sha512-S132hEOK4jwbtZ1bGAgSuQ0DMFG4TiD4ulAwbQRBYooC7tiWZbRiR0Pkt2hV8d7WhOHgUpg7rvqlA7/HXXBAsA==" + }, + "@aws-sdk/middleware-signing": { + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.192.0.tgz", + "integrity": "sha512-qTRIU/TL/dvtTrNj+AkZkgYeTIFslib3Y3XnQNNM6RCm4cMxIgs2K/lnhaUmLdbzHrpOQb4cISkY8yiHo+pNsw==" + }, + "@aws-sdk/middleware-stack": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.190.0.tgz", + "integrity": "sha512-h1mqiWNJdi1OTSEY8QovpiHgDQEeRG818v8yShpqSYXJKEqdn54MA3Z1D2fg/Wv/8ZJsFrBCiI7waT1JUYOmCg==" + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.190.0.tgz", + "integrity": "sha512-y/2cTE1iYHKR0nkb3DvR3G8vt12lcTP95r/iHp8ZO+Uzpc25jM/AyMHWr2ZjqQiHKNlzh8uRw1CmQtgg4sBxXQ==" + }, + "@aws-sdk/node-config-provider": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.190.0.tgz", + "integrity": "sha512-TJPUchyeK5KeEXWrwb6oW5/OkY3STCSGR1QIlbPcaTGkbo4kXAVyQmmZsY4KtRPuDM6/HlfUQV17bD716K65rQ==" + }, + "@aws-sdk/node-http-handler": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.190.0.tgz", + "integrity": "sha512-3Klkr73TpZkCzcnSP+gmFF0Baluzk3r7BaWclJHqt2LcFUWfIJzYlnbBQNZ4t3EEq7ZlBJX85rIDHBRlS+rUyA==" + }, + "@aws-sdk/property-provider": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.190.0.tgz", + "integrity": "sha512-uzdKjHE2blbuceTC5zeBgZ0+Uo/hf9pH20CHpJeVNtrrtF3GALtu4Y1Gu5QQVIQBz8gjHnqANx0XhfYzorv69Q==" + }, + "@aws-sdk/protocol-http": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.190.0.tgz", + "integrity": "sha512-s5MVfeONpfZYRzCSbqQ+wJ3GxKED+aSS7+CQoeaYoD6HDTDxaMGNv9aiPxVCzW02sgG7py7f29Q6Vw+5taZXZA==" + }, + "@aws-sdk/querystring-builder": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.190.0.tgz", + "integrity": "sha512-w9mTKkCsaLIBC8EA4RAHrqethNGbf60CbpPzN/QM7yCV3ZZJAXkppFfjTVVOMbPaI8GUEOptJtzgqV68CRB7ow==" + }, + "@aws-sdk/querystring-parser": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.190.0.tgz", + "integrity": "sha512-vCKP0s33VtS47LSYzEWRRr2aTbi3qNkUuQyIrc5LMqBfS5hsy79P1HL4Q7lCVqZB5fe61N8fKzOxDxWRCF0sXg==" + }, + "@aws-sdk/service-error-classification": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.190.0.tgz", + "integrity": "sha512-g+s6xtaMa5fCMA2zJQC4BiFGMP7FN5/L1V/UwxCnKy8skCwaN0K5A1tFffBjjbYiPI7Gu7LVorWD2A0Y4xl01Q==" + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.190.0.tgz", + "integrity": "sha512-CZC/xsGReUEl5w+JgfancrxfkaCbEisyIFy6HALUYrioWQe80WMqLAdUMZSXHWjIaNK9mH0J/qvcSV2MuIoMzQ==" + }, + "@aws-sdk/signature-v4": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.190.0.tgz", + "integrity": "sha512-L/R/1X2T+/Kg2k/sjoYyDFulVUGrVcRfyEKKVFIUNg0NwUtw5UKa1/gS7geTKcg4q8M2pd/v+OCBrge2X7phUw==" + }, + "@aws-sdk/smithy-client": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.190.0.tgz", + "integrity": "sha512-f5EoCwjBLXMyuN491u1NmEutbolL0cJegaJbtgK9OJw2BLuRHiBknjDF4OEVuK/WqK0kz2JLMGi9xwVPl4BKCA==" + }, + "@aws-sdk/types": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.190.0.tgz", + "integrity": "sha512-mkeZ+vJZzElP6OdRXvuLKWHSlDQxZP9u8BjQB9N0Rw0pCXTzYS0vzIhN1pL0uddWp5fMrIE68snto9xNR6BQuA==" + }, + "@aws-sdk/url-parser": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.190.0.tgz", + "integrity": "sha512-FKFDtxA9pvHmpfWmNVK5BAVRpDgkWMz3u4Sg9UzB+WAFN6UexRypXXUZCFAo8S04FbPKfYOR3O0uVlw7kzmj9g==" + }, + "@aws-sdk/util-base64-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz", + "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==" + }, + "@aws-sdk/util-base64-node": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.188.0.tgz", + "integrity": "sha512-r1dccRsRjKq+OhVRUfqFiW3sGgZBjHbMeHLbrAs9jrOjU2PTQ8PSzAXLvX/9lmp7YjmX17Qvlsg0NCr1tbB9OA==" + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==" + }, + "@aws-sdk/util-body-length-node": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.188.0.tgz", + "integrity": "sha512-XwqP3vxk60MKp4YDdvDeCD6BPOiG2e+/Ou4AofZOy5/toB6NKz2pFNibQIUg2+jc7mPMnGnvOW3MQEgSJ+gu/Q==" + }, + "@aws-sdk/util-buffer-from": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.188.0.tgz", + "integrity": "sha512-NX1WXZ8TH20IZb4jPFT2CnLKSqZWddGxtfiWxD9M47YOtq/SSQeR82fhqqVjJn4P8w2F5E28f+Du4ntg/sGcxA==" + }, + "@aws-sdk/util-config-provider": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.188.0.tgz", + "integrity": "sha512-LBA7tLbi7v4uvbOJhSnjJrxbcRifKK/1ZVK94JTV2MNSCCyNkFotyEI5UWDl10YKriTIUyf7o5cakpiDZ3O4xg==" + }, + "@aws-sdk/util-defaults-mode-browser": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.190.0.tgz", + "integrity": "sha512-FKxTU4tIbFk2pdUbBNneStF++j+/pB4NYJ1HRSEAb/g4D2+kxikR/WKIv3p0JTVvAkwcuX/ausILYEPUyDZ4HQ==" + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.190.0.tgz", + "integrity": "sha512-qBiIMjNynqAP7p6urG1+ZattYkFaylhyinofVcLEiDvM9a6zGt6GZsxru2Loq0kRAXXGew9E9BWGt45HcDc20g==" + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.188.0.tgz", + "integrity": "sha512-QyWovTtjQ2RYxqVM+STPh65owSqzuXURnfoof778spyX4iQ4z46wOge1YV2ZtwS8w5LWd9eeVvDrLu5POPYOnA==" + }, + "@aws-sdk/util-locate-window": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.188.0.tgz", + "integrity": "sha512-SxobBVLZkkLSawTCfeQnhVX3Azm9O+C2dngZVe1+BqtF8+retUbVTs7OfYeWBlawVkULKF2e781lTzEHBBjCzw==" + }, + "@aws-sdk/util-middleware": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.190.0.tgz", + "integrity": "sha512-qzTJ/qhFDzHZS+iXdHydQ/0sWAuNIB5feeLm55Io/I8Utv3l3TKYOhbgGwTsXY+jDk7oD+YnAi7hLN5oEBCwpg==" + }, + "@aws-sdk/util-uri-escape": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.188.0.tgz", + "integrity": "sha512-4Y6AYZMT483Tiuq8dxz5WHIiPNdSFPGrl6tRTo2Oi2FcwypwmFhqgEGcqxeXDUJktvaCBxeA08DLr/AemVhPCg==" + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.190.0.tgz", + "integrity": "sha512-c074wjsD+/u9vT7DVrBLkwVhn28I+OEHuHaqpTVCvAIjpueZ3oms0e99YJLfpdpEgdLavOroAsNFtAuRrrTZZw==" + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.190.0.tgz", + "integrity": "sha512-R36BMvvPX8frqFhU4lAsrOJ/2PJEHH/Jz1WZzO3GWmVSEAQQdHmo8tVPE3KOM7mZWe5Hj1dZudFAIxWHHFYKJA==" + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==" + }, + "@aws-sdk/util-utf8-node": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.188.0.tgz", + "integrity": "sha512-hCgP4+C0Lekjpjt2zFJ2R/iHes5sBGljXa5bScOFAEkRUc0Qw0VNgTv7LpEbIOAwGmqyxBoCwBW0YHPW1DfmYQ==" + }, "@types/node": { - "version": "18.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz", - "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==" + "version": "18.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", + "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==" }, "@types/webidl-conversions": { "version": "7.0.0", @@ -21,6 +361,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, "bson": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", @@ -36,6 +381,11 @@ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, + "fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==" + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -52,9 +402,9 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" }, "mongodb": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.10.0.tgz", - "integrity": "sha512-My2QxLTw0Cc1O9gih0mz4mqo145Jq4rLAQx0Glk/Ha9iYBzYpt4I2QFNRIh35uNFNfe8KFQcdwY1/HKxXBkinw==" + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.11.0.tgz", + "integrity": "sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg==" }, "mongodb-connection-string-url": { "version": "2.5.4", @@ -86,11 +436,26 @@ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==" }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "tr46": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==" }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/packages/npm-mongo/package.js b/packages/npm-mongo/package.js index bab293fd71..2222c52f7a 100644 --- a/packages/npm-mongo/package.js +++ b/packages/npm-mongo/package.js @@ -3,12 +3,12 @@ Package.describe({ summary: "Wrapper around the mongo npm package", - version: "4.10.0", + version: "4.11.0", documentation: null }); Npm.depends({ - mongodb: "4.10.0" + mongodb: "4.11.0" }); Package.onUse(function (api) { From a4ca60e819b59a5466b078bf2590a9ec189a657a Mon Sep 17 00:00:00 2001 From: harryadel Date: Thu, 20 Oct 2022 14:48:11 +0200 Subject: [PATCH 067/114] Append port to restart message --- tools/runners/run-app.js | 2 +- tools/runners/run-log.js | 4 ++-- tools/tests/server-restart-port.js | 25 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 tools/tests/server-restart-port.js diff --git a/tools/runners/run-app.js b/tools/runners/run-app.js index d02d044dc5..fbc3b03af5 100644 --- a/tools/runners/run-app.js +++ b/tools/runners/run-app.js @@ -947,7 +947,7 @@ Object.assign(AppRunner.prototype, { var runResult = self._runOnce({ onListen: function () { if (! self.noRestartBanner && ! firstRun) { - runLog.logRestart(); + runLog.logRestart(self); Console.enableProgressDisplay(false); } }, diff --git a/tools/runners/run-log.js b/tools/runners/run-log.js index a661f69963..103c4a7e9a 100644 --- a/tools/runners/run-log.js +++ b/tools/runners/run-log.js @@ -145,7 +145,7 @@ Object.assign(RunLog.prototype, { self.temporaryMessageLength = msg.length; }, - logRestart: function () { + logRestart: function (options) { var self = this; if (self.consecutiveRestartMessages) { @@ -159,7 +159,7 @@ Object.assign(RunLog.prototype, { self.consecutiveRestartMessages = 1; } - var message = "=> Meteor server restarted"; + var message = "=> Meteor server restarted on port " + options.proxy.listenPort; if (self.consecutiveRestartMessages > 1) { message += " (x" + self.consecutiveRestartMessages + ")"; } diff --git a/tools/tests/server-restart-port.js b/tools/tests/server-restart-port.js new file mode 100644 index 0000000000..fddea0cc06 --- /dev/null +++ b/tools/tests/server-restart-port.js @@ -0,0 +1,25 @@ +import * as selftest from '../tool-testing/selftest'; + +selftest.define("server outputs port number on restarting", () => testHelper({ + path: "server/main.js", + id: "server/main.js" +})); + +function testHelper(server) { + const s = new selftest.Sandbox(); + s.createApp("myapp", "client-refresh"); + s.cd("myapp"); + + let run = s.run("--port", "21000"); + run.match("Started proxy"); + run.waitSecs(15); + + run.match(server.id + " 0"); + + s.write(server.path, s.read(server.path).replace( + /module.id, (\d+)/, + (match, n) => `module.id, ${ ++n }`, + )); + + run.match("Meteor server restarted on port 21000"); +} From 1c2210a39b91459c1c982e3a52825d89062f0172 Mon Sep 17 00:00:00 2001 From: harryadel Date: Thu, 20 Oct 2022 16:03:03 +0200 Subject: [PATCH 068/114] Source hello-myfonts locally instead of cdn --- .../non-core/less/tests/hello-myfonts.css | 22 +++++++++++++++++++ packages/non-core/less/tests/top.import.less | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 packages/non-core/less/tests/hello-myfonts.css diff --git a/packages/non-core/less/tests/hello-myfonts.css b/packages/non-core/less/tests/hello-myfonts.css new file mode 100644 index 0000000000..8a1a820d41 --- /dev/null +++ b/packages/non-core/less/tests/hello-myfonts.css @@ -0,0 +1,22 @@ + +/* + FILE ARCHIVED ON 22:48:06 Jan 31, 2021 AND RETRIEVED FROM THE + INTERNET ARCHIVE ON 14:01:15 Oct 20, 2022. + JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. + + ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. + SECTION 108(a)(3)). +*/ +/* +playback timings (ms): + captures_list: 273.718 + exclusion.robots: 0.088 + exclusion.robots.policy: 0.08 + cdx.remote: 0.063 + esindex: 0.009 + LoadShardBlock: 52.202 (3) + PetaboxLoader3.datanode: 93.37 (5) + CDXLines.iter: 13.615 (3) + load_resource: 130.222 (2) + PetaboxLoader3.resolve: 65.34 (2) +*/ \ No newline at end of file diff --git a/packages/non-core/less/tests/top.import.less b/packages/non-core/less/tests/top.import.less index b7f1071eda..32fb5035ff 100644 --- a/packages/non-core/less/tests/top.import.less +++ b/packages/non-core/less/tests/top.import.less @@ -6,4 +6,4 @@ // Make sure regular CSS import doesn't make the compiler explode - this was // a regression from 1.1.0.3 caught in QA -@import url("http://hello.myfonts.net/count/2c4b9d"); +@import url("./hello-myfonts.css"); From b3aa0e0196290f4ab3b7218d346330db627be87a Mon Sep 17 00:00:00 2001 From: harryadel Date: Fri, 21 Oct 2022 10:43:28 +0200 Subject: [PATCH 069/114] Revert hello-myfonts.css changes --- .../non-core/less/tests/hello-myfonts.css | 22 ------------------- packages/non-core/less/tests/top.import.less | 2 +- 2 files changed, 1 insertion(+), 23 deletions(-) delete mode 100644 packages/non-core/less/tests/hello-myfonts.css diff --git a/packages/non-core/less/tests/hello-myfonts.css b/packages/non-core/less/tests/hello-myfonts.css deleted file mode 100644 index 8a1a820d41..0000000000 --- a/packages/non-core/less/tests/hello-myfonts.css +++ /dev/null @@ -1,22 +0,0 @@ - -/* - FILE ARCHIVED ON 22:48:06 Jan 31, 2021 AND RETRIEVED FROM THE - INTERNET ARCHIVE ON 14:01:15 Oct 20, 2022. - JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. - - ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. - SECTION 108(a)(3)). -*/ -/* -playback timings (ms): - captures_list: 273.718 - exclusion.robots: 0.088 - exclusion.robots.policy: 0.08 - cdx.remote: 0.063 - esindex: 0.009 - LoadShardBlock: 52.202 (3) - PetaboxLoader3.datanode: 93.37 (5) - CDXLines.iter: 13.615 (3) - load_resource: 130.222 (2) - PetaboxLoader3.resolve: 65.34 (2) -*/ \ No newline at end of file diff --git a/packages/non-core/less/tests/top.import.less b/packages/non-core/less/tests/top.import.less index 32fb5035ff..ce2c98e250 100644 --- a/packages/non-core/less/tests/top.import.less +++ b/packages/non-core/less/tests/top.import.less @@ -6,4 +6,4 @@ // Make sure regular CSS import doesn't make the compiler explode - this was // a regression from 1.1.0.3 caught in QA -@import url("./hello-myfonts.css"); +@import url("http://hello.myfonts.net/count/2c4b9d"); \ No newline at end of file From ec48d0d7626aa29a6fc9c612c8dc0dccd9118bec Mon Sep 17 00:00:00 2001 From: harryadel Date: Fri, 21 Oct 2022 11:06:47 +0200 Subject: [PATCH 070/114] Use rootUrl to display port number on rebooting --- tools/runners/run-log.js | 2 +- tools/tests/server-restart-port.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/runners/run-log.js b/tools/runners/run-log.js index 103c4a7e9a..d7a2f812f6 100644 --- a/tools/runners/run-log.js +++ b/tools/runners/run-log.js @@ -159,7 +159,7 @@ Object.assign(RunLog.prototype, { self.consecutiveRestartMessages = 1; } - var message = "=> Meteor server restarted on port " + options.proxy.listenPort; + var message = "=> Meteor server restarted at: " + options.rootUrl; if (self.consecutiveRestartMessages > 1) { message += " (x" + self.consecutiveRestartMessages + ")"; } diff --git a/tools/tests/server-restart-port.js b/tools/tests/server-restart-port.js index fddea0cc06..ef6a985541 100644 --- a/tools/tests/server-restart-port.js +++ b/tools/tests/server-restart-port.js @@ -21,5 +21,5 @@ function testHelper(server) { (match, n) => `module.id, ${ ++n }`, )); - run.match("Meteor server restarted on port 21000"); + run.match("Meteor server restarted at: http://localhost:21000/"); } From 80305ddfc0fe07dc023da04b3a8137ebb5d07c78 Mon Sep 17 00:00:00 2001 From: harryadel Date: Fri, 21 Oct 2022 12:22:15 +0200 Subject: [PATCH 071/114] [webapp-hashing] Remove underscore --- packages/webapp-hashing/package.js | 2 +- packages/webapp-hashing/webapp-hashing.js | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/webapp-hashing/package.js b/packages/webapp-hashing/package.js index af8f7e762d..b2353e90c3 100644 --- a/packages/webapp-hashing/package.js +++ b/packages/webapp-hashing/package.js @@ -5,7 +5,7 @@ Package.describe({ Package.onUse(function(api) { api.use('ecmascript'); - api.use('underscore', 'server'); + api.use('server'); api.addFiles('webapp-hashing.js', 'server'); api.export('WebAppHashing'); }); diff --git a/packages/webapp-hashing/webapp-hashing.js b/packages/webapp-hashing/webapp-hashing.js index f2fc190449..0968b45323 100644 --- a/packages/webapp-hashing/webapp-hashing.js +++ b/packages/webapp-hashing/webapp-hashing.js @@ -1,4 +1,4 @@ -var crypto = Npm.require("crypto"); +import { createHash } from "crypto"; WebAppHashing = {}; @@ -13,13 +13,11 @@ WebAppHashing = {}; WebAppHashing.calculateClientHash = function (manifest, includeFilter, runtimeConfigOverride) { - var hash = crypto.createHash('sha1'); + var hash = createHash('sha1'); // Omit the old hashed client values in the new hash. These may be // modified in the new boilerplate. - var runtimeCfg = _.omit(__meteor_runtime_config__, - ['autoupdateVersion', 'autoupdateVersionRefreshable', - 'autoupdateVersionCordova']); + var { autoupdateVersion, autoupdateVersionRefreshable, autoupdateVersionCordova, ...runtimeCfg } = __meteor_runtime_config__; if (runtimeConfigOverride) { runtimeCfg = runtimeConfigOverride; @@ -27,7 +25,7 @@ WebAppHashing.calculateClientHash = hash.update(JSON.stringify(runtimeCfg, 'utf8')); - _.each(manifest, function (resource) { + manifest.forEach(function (resource) { if ((! includeFilter || includeFilter(resource.type, resource.replaceable)) && (resource.where === 'client' || resource.where === 'internal')) { hash.update(resource.path); @@ -39,7 +37,7 @@ WebAppHashing.calculateClientHash = WebAppHashing.calculateCordovaCompatibilityHash = function(platformVersion, pluginVersions) { - const hash = crypto.createHash('sha1'); + const hash = createHash('sha1'); hash.update(platformVersion); From 355fde896a4577bb2d009bca0e63332815278142 Mon Sep 17 00:00:00 2001 From: harryadel Date: Fri, 21 Oct 2022 12:27:14 +0200 Subject: [PATCH 072/114] [twitter-oauth] Remove underscore --- packages/twitter-oauth/package.js | 1 - packages/twitter-oauth/twitter_server.js | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/twitter-oauth/package.js b/packages/twitter-oauth/package.js index 3f5cde5730..34e0d8bff8 100644 --- a/packages/twitter-oauth/package.js +++ b/packages/twitter-oauth/package.js @@ -7,7 +7,6 @@ Package.onUse(function(api) { api.use('oauth1', ['client', 'server']); api.use('oauth', ['client', 'server']); api.use('random', 'client'); - api.use('underscore', 'server'); api.use('service-configuration', ['client', 'server']); api.addFiles('twitter_common.js', ['server', 'client']); diff --git a/packages/twitter-oauth/twitter_server.js b/packages/twitter-oauth/twitter_server.js index d597f0db1e..6a973ac57d 100644 --- a/packages/twitter-oauth/twitter_server.js +++ b/packages/twitter-oauth/twitter_server.js @@ -26,8 +26,8 @@ OAuth.registerService('twitter', 1, urls, function(oauthBinding) { }; // include helpful fields from twitter - var fields = _.pick(identity, Twitter.whitelistedFields); - _.extend(serviceData, fields); + const { identity: fields } = Twitter.whitelistedFields; + Object.assign(serviceData, fields); return { serviceData: serviceData, From 22403ce8c43831ce68eec4c163ccd660b0d58945 Mon Sep 17 00:00:00 2001 From: harryadel Date: Fri, 21 Oct 2022 12:28:59 +0200 Subject: [PATCH 073/114] [webapp-hashing] Remove api.use('server') --- packages/webapp-hashing/package.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/webapp-hashing/package.js b/packages/webapp-hashing/package.js index b2353e90c3..4098a5b937 100644 --- a/packages/webapp-hashing/package.js +++ b/packages/webapp-hashing/package.js @@ -5,7 +5,6 @@ Package.describe({ Package.onUse(function(api) { api.use('ecmascript'); - api.use('server'); api.addFiles('webapp-hashing.js', 'server'); api.export('WebAppHashing'); }); From adb0184c24ec4ff8c83755a8aa54e87cb130d961 Mon Sep 17 00:00:00 2001 From: harryadel Date: Fri, 21 Oct 2022 12:59:20 +0200 Subject: [PATCH 074/114] [test-in-browser] Remove underscore --- packages/test-in-browser/driver.js | 54 ++++++++++++++--------------- packages/test-in-browser/package.js | 1 - 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/packages/test-in-browser/driver.js b/packages/test-in-browser/driver.js index 5e6120d04a..d0d5fa4423 100644 --- a/packages/test-in-browser/driver.js +++ b/packages/test-in-browser/driver.js @@ -88,7 +88,7 @@ var reportResults = function(results) { } // Now process the current report - if (_.isArray(results.events)) { + if (Array.isArray(results.events)) { // append events, if present Array.prototype.push.apply((test.events || (test.events = [])), results.events); @@ -97,7 +97,7 @@ var reportResults = function(results) { return a.sequence - b.sequence; }); var out = []; - _.each(test.events, function (e) { + test.events.forEach(function (e) { if (out.length === 0 || out[out.length - 1].sequence !== e.sequence) out.push(e); }); @@ -110,7 +110,7 @@ var reportResults = function(results) { // test name yet). if (test.expanded === undefined) test.expanded = true; - if (!_.contains(failedTests, test.fullName)) + if (!failedTests.includes(test.fullName)) failedTests.push(test.fullName); countDep.changed(); @@ -147,16 +147,16 @@ var forgetEvents = function (results) { // possibly 'events'. var _findTestForResults = function (results) { var groupPath = results.groupPath; // array - if ((! _.isArray(groupPath)) || (groupPath.length < 1)) { + if ((! Array.isArray(groupPath)) || (groupPath.length < 1)) { throw new Error("Test must be part of a group"); } var group; var i = 0; - _.each(groupPath, function(gname) { + groupPath.forEach(function(gname) { var array = (group ? (group.groups || (group.groups = [])) : resultTree); - var newGroup = _.find(array, function(g) { return g.name === gname; }); + var newGroup = array.find(function(g) { return g.name === gname; }); if (! newGroup) { newGroup = { name: gname, @@ -177,12 +177,12 @@ var _findTestForResults = function (results) { var testName = results.test; var server = !!results.server; - var test = _.find(group.tests || (group.tests = []), + var test = (group.tests || (group.tests = [])).find( function(t) { return t.name === testName && t.server === server; }); if (! test) { // create test - var nameParts = _.clone(groupPath); + var nameParts = [...groupPath]; nameParts.push(testName); var fullName = nameParts.join(' - '); test = { @@ -209,7 +209,7 @@ var _findTestForResults = function (results) { var _testTime = function(t) { if (t.events && t.events.length > 0) { - var lastEvent = _.last(t.events); + var lastEvent = t.events[t.events.length - 1]; if (lastEvent.type === "finish") { if ((typeof lastEvent.timeMs) === "number") { return lastEvent.timeMs; @@ -221,15 +221,15 @@ var _testTime = function(t) { var _testStatus = function(t) { var events = t.events || []; - if (_.find(events, function(x) { return x.type === "exception"; })) { + if (events.find(function(x) { return x.type === "exception"; })) { // "exception" should be last event, except race conditions on the // server can make this not the case. Technically we can't tell // if the test is still running at this point, but it can only // result in FAIL. return "failed"; - } else if (events.length == 0 || (_.last(events).type != "finish")) { + } else if (events.length == 0 || (events[events.length - 1].type != "finish")) { return "running"; - } else if (_.any(events, function(e) { + } else if (events.some(function(e) { return e.type == "fail" || e.type == "exception"; })) { return "failed"; } else { @@ -261,8 +261,8 @@ Template.navBar.helpers({ var walk = function (groups) { var total = 0; - _.each(groups || [], function (group) { - _.each(group.tests || [], function (t) { + (groups || []).forEach(function (group) { + (group.tests || []).forEach(function (t) { total += _testTime(t); }); @@ -450,14 +450,14 @@ Template.test.helpers({ }, eventsArray: function() { - var events = _.filter(this.events, function(e) { - return e.type != "finish"; + var events = this.events.filter(function(e) { + return e[type] != "finish"; }); var partitionBy = function(seq, func) { var result = []; var lastValue = {}; - _.each(seq, function(x) { + seq.forEach(function(x) { var newValue = func(x); if (newValue === lastValue) { result[result.length-1].push(x); @@ -470,17 +470,17 @@ Template.test.helpers({ }; var dupLists = partitionBy( - _.map(events, function(e) { + events.map(function(e) { // XXX XXX We need something better than stringify! // stringify([undefined]) === "[null]" - e = _.clone(e); + e = Object.assign({}, e); delete e.sequence; return {obj: e, str: JSON.stringify(e)}; }), function(x) { return x.str; }); - return _.map(dupLists, function(L) { + return dupLists.map(function(L) { var obj = L[0].obj; - return (L.length > 1) ? _.extend({times: L.length}, obj) : obj; + return (L.length > 1) ? Object.assign({times: L.length}, obj) : obj; }); } }); @@ -525,7 +525,7 @@ Template.event.helpers({ var type = details.type; var stack = details.stack; - details = _.clone(details); + details = Array.isArray(details) && [...details] || Object.assign({}, details); delete details.type; delete details.stack; @@ -535,14 +535,14 @@ Template.event.helpers({ details.expected); } - return _.compact(_.map(details, function(val, key) { + return Object.entries(details).map(function([key, val]) { // make test._stringEqual results print nicely, // in particular for multiline strings if (type === 'string_equal' && (key === 'actual' || key === 'expected')) { var html = '
';
-            _.each(diff, function (piece) {
+            diff.forEach(function (piece) {
               var which = piece[0];
               var text = piece[1];
               if (which === 0 ||
@@ -561,7 +561,7 @@ Template.event.helpers({
           // You can end up with a an undefined value, e.g. using
           // isNull without providing a message attribute: isNull(1).
           // No need to display those.
-          if (!_.isUndefined(val)) {
+          if (typeof val !== 'undefined') {
             return {
               key: key,
               val: val
@@ -569,7 +569,7 @@ Template.event.helpers({
           } else {
             return undefined;
           }
-        }));
+        }).filter(Boolean);
       };
 
       return {
@@ -583,4 +583,4 @@ Template.event.helpers({
   is_debuggable: function() {
     return !!this.cookie;
   }
-});
+});
\ No newline at end of file
diff --git a/packages/test-in-browser/package.js b/packages/test-in-browser/package.js
index a92fb4206a..7bc88d5cf7 100644
--- a/packages/test-in-browser/package.js
+++ b/packages/test-in-browser/package.js
@@ -13,7 +13,6 @@ Package.onUse(function (api) {
   // XXX this should go away, and there should be a clean interface
   // that tinytest and the driver both implement?
   api.use('tinytest');
-  api.use('underscore');
 
   api.use('session');
   api.use('reload');

From 2f2baea89b7bf0cf7f773951b2871578a6bf42a3 Mon Sep 17 00:00:00 2001
From: harryadel 
Date: Sat, 22 Oct 2022 07:36:23 +0200
Subject: [PATCH 075/114] [geojson-utils] Remove underscore

---
 packages/geojson-utils/geojson-utils.tests.js | 4 ++--
 packages/geojson-utils/package.js             | 1 -
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/packages/geojson-utils/geojson-utils.tests.js b/packages/geojson-utils/geojson-utils.tests.js
index ea7ab39462..2d97d7a472 100644
--- a/packages/geojson-utils/geojson-utils.tests.js
+++ b/packages/geojson-utils/geojson-utils.tests.js
@@ -85,8 +85,8 @@ Tinytest.add("geojson-utils - points distance generated tests", function (test)
     6846704.0253010122, 1368055.9401701286, 14041503.0409814864,
     18560499.7346975356, 3793112.6186894816];
 
-  _.each(tests, function (pair, testN) {
-    var distance = GeoJSON.pointDistance.apply(this, _.map(pair, toGeoJSONPoint));
+    tests.forEach(function (pair, testN) {
+    var distance = GeoJSON.pointDistance.apply(this, pair.map(toGeoJSONPoint));
     test.isTrue(Math.abs(distance - answers[testN]) < 0.000001,
       "Wrong distance between points " + JSON.stringify(pair) + ": " + distance + ", " + Math.abs(distance - answers[testN]) + " differenc");
   });
diff --git a/packages/geojson-utils/package.js b/packages/geojson-utils/package.js
index 5ae045b046..052cdc64bc 100644
--- a/packages/geojson-utils/package.js
+++ b/packages/geojson-utils/package.js
@@ -11,7 +11,6 @@ Package.onUse(function (api) {
 
 Package.onTest(function (api) {
   api.use('tinytest');
-  api.use('underscore');
   api.use('geojson-utils');
   api.addFiles(['geojson-utils.tests.js'], 'client');
 });

From 8130ff1d27bfceafa28057f9b9abd9266d0c1005 Mon Sep 17 00:00:00 2001
From: harryadel 
Date: Sat, 22 Oct 2022 07:39:29 +0200
Subject: [PATCH 076/114] [facts-ui] Remove underscore

---
 packages/facts-ui/facts_ui_client.js | 2 +-
 packages/facts-ui/package.js         | 3 +--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/packages/facts-ui/facts_ui_client.js b/packages/facts-ui/facts_ui_client.js
index 9542c5f5f9..6731cfe466 100644
--- a/packages/facts-ui/facts_ui_client.js
+++ b/packages/facts-ui/facts_ui_client.js
@@ -6,7 +6,7 @@ Template.serverFacts.helpers({
   factsByPackage: () => Facts.server.find(),
   facts: function () {
     const factArray = [];
-    _.each(this, function (value, name) {
+    Object.entries(this).forEach(function ([name, value]) {
       if (name !== '_id')
         factArray.push({name: name, value: value});
     });
diff --git a/packages/facts-ui/package.js b/packages/facts-ui/package.js
index 20d72c3b10..5f367eb09d 100644
--- a/packages/facts-ui/package.js
+++ b/packages/facts-ui/package.js
@@ -8,8 +8,7 @@ Package.onUse(function (api) {
     'ecmascript',
     'facts-base',
     'mongo',
-    'templating@1.2.13',
-    'underscore',
+    'templating@1.2.13'
   ], 'client');
 
   api.imply('facts-base');

From 80e09739fd96d1c9f5a141f25af1944198e3f4a6 Mon Sep 17 00:00:00 2001
From: harryadel 
Date: Sat, 22 Oct 2022 07:44:38 +0200
Subject: [PATCH 077/114] [ecmascript] Remove underscore

---
 packages/ecmascript/package.js       | 2 +-
 packages/ecmascript/runtime-tests.js | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js
index eed53fefd0..37378b5163 100644
--- a/packages/ecmascript/package.js
+++ b/packages/ecmascript/package.js
@@ -31,7 +31,7 @@ Package.onUse(function(api) {
 });
 
 Package.onTest(function(api) {
-  api.use(['tinytest', 'underscore']);
+  api.use(['tinytest']);
   api.use(['es5-shim', 'ecmascript', 'babel-compiler']);
   api.addFiles('runtime-tests.js');
   api.addFiles('transpilation-tests.js', 'server');
diff --git a/packages/ecmascript/runtime-tests.js b/packages/ecmascript/runtime-tests.js
index f0cb308a97..c4ddfe227d 100644
--- a/packages/ecmascript/runtime-tests.js
+++ b/packages/ecmascript/runtime-tests.js
@@ -216,7 +216,7 @@ Tinytest.add('ecmascript - runtime - block scope', test => {
       });
     }
 
-    _.each(thunks, f => f());
+    thunks.forEach(f => f());
     test.equal(buf, [0, 1, 2]);
   }
 });

From 96fac46c6202e9aea2c9e421671e13a41a19b0f2 Mon Sep 17 00:00:00 2001
From: harryadel 
Date: Sat, 22 Oct 2022 07:48:47 +0200
Subject: [PATCH 078/114] [diff-sequence] Remove underscore

---
 packages/diff-sequence/package.js |  1 -
 packages/diff-sequence/tests.js   | 17 ++++++++---------
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/packages/diff-sequence/package.js b/packages/diff-sequence/package.js
index 18c673049b..ff143f3e8a 100644
--- a/packages/diff-sequence/package.js
+++ b/packages/diff-sequence/package.js
@@ -14,7 +14,6 @@ Package.onUse(function (api) {
 Package.onTest(function (api) {
   api.use([
     'tinytest',
-    'underscore',
     'ejson'
   ]);
 
diff --git a/packages/diff-sequence/tests.js b/packages/diff-sequence/tests.js
index a8cc9c3c58..8c593baee0 100644
--- a/packages/diff-sequence/tests.js
+++ b/packages/diff-sequence/tests.js
@@ -1,6 +1,6 @@
 Tinytest.add("diff-sequence - diff changes ordering", function (test) {
   var makeDocs = function (ids) {
-    return _.map(ids, function (id) { return {_id: id};});
+    return ids.map(function (id) { return {_id: id};});
   };
   var testMutation = function (a, b) {
     var aa = makeDocs(a);
@@ -10,12 +10,12 @@ Tinytest.add("diff-sequence - diff changes ordering", function (test) {
 
       addedBefore: function (id, doc, before) {
         if (before === null) {
-          aaCopy.push( _.extend({_id: id}, doc));
+          aaCopy.push( Object.assign({_id: id}, doc));
           return;
         }
         for (var i = 0; i < aaCopy.length; i++) {
           if (aaCopy[i]._id === before) {
-            aaCopy.splice(i, 0, _.extend({_id: id}, doc));
+            aaCopy.splice(i, 0, Object.assign({_id: id}, doc));
             return;
           }
         }
@@ -29,12 +29,12 @@ Tinytest.add("diff-sequence - diff changes ordering", function (test) {
           }
         }
         if (before === null) {
-          aaCopy.push( _.extend({_id: id}, found));
+          aaCopy.push( Object.assign({_id: id}, found));
           return;
         }
         for (i = 0; i < aaCopy.length; i++) {
           if (aaCopy[i]._id === before) {
-            aaCopy.splice(i, 0, _.extend({_id: id}, found));
+            aaCopy.splice(i, 0, Object.assign({_id: id}, found));
             return;
           }
         }
@@ -75,7 +75,7 @@ Tinytest.add("diff-sequence - diff", function (test) {
     for (var i = 1; i <= origLen; i++)
       oldResults[i-1] = {_id: i};
 
-    var newResults = _.map(newOldIdx, function(n) {
+    var newResults = newOldIdx.map(function(n) {
       var doc = {_id: Math.abs(n)};
       if (n < 0)
         doc.changed = true;
@@ -89,7 +89,7 @@ Tinytest.add("diff-sequence - diff", function (test) {
       return -1;
     };
 
-    var results = _.clone(oldResults);
+    var results = [...oldResults];
     var observer = {
       addedBefore: function(id, fields, before) {
         var before_idx;
@@ -97,7 +97,7 @@ Tinytest.add("diff-sequence - diff", function (test) {
           before_idx = results.length;
         else
           before_idx = find (results, before);
-        var doc = _.extend({_id: id}, fields);
+        var doc = Object.assign({_id: id}, fields);
         test.isFalse(before_idx < 0 || before_idx > results.length);
         results.splice(before_idx, 0, doc);
       },
@@ -157,4 +157,3 @@ Tinytest.add("diff-sequence - diff", function (test) {
   diffTest(3, [-3, -2, -1]);
   diffTest(10, [-2, 7, 4, 6, 11, -3, -8, 9]);
 });
-

From 236ffc2a5a29a324be64d78a1bde76924342218c Mon Sep 17 00:00:00 2001
From: harryadel 
Date: Sat, 22 Oct 2022 09:07:54 +0200
Subject: [PATCH 079/114] [browser-policy] Remove underscore

---
 .../browser-policy/browser-policy-test.js     | 39 +++++++++++++------
 packages/browser-policy/package.js            |  2 +-
 2 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/packages/browser-policy/browser-policy-test.js b/packages/browser-policy/browser-policy-test.js
index cd2e453a74..4ba437f761 100644
--- a/packages/browser-policy/browser-policy-test.js
+++ b/packages/browser-policy/browser-policy-test.js
@@ -1,17 +1,34 @@
 BrowserPolicy._setRunningTest();
 
+var toObject = function(list, values) {
+  if (list == null) return {};
+  var result = {};
+  for (var i = 0, length = list.length; i < length; i++) {
+    if (values) {
+      result[list[i]] = values[i];
+    } else {
+      result[list[i][0]] = list[i][1];
+    }
+  }
+  return result;
+};
+
 var cspsEqual = function (csp1, csp2) {
   var cspToObj = function (csp) {
     csp = csp.substring(0, csp.length - 1);
-    var parts = _.map(csp.split("; "), function (part) {
+    var parts = csp.split("; ").map(function (part) {
       return part.split(" ");
     });
-    var keys = _.map(parts, _.first);
-    var values = _.map(parts, _.rest);
-    _.each(values, function (value) {
+    var keys = parts.map(part => part[0]);
+    var values = parts.map((part) => {
+      const [head, ...tail] = part;
+      return tail;
+    });
+    values.forEach(function (value) {
       value.sort();
     });
-    return _.object(keys, values);
+    
+    return toObject(keys, values);
   };
 
   return EJSON.equals(cspToObj(csp1), cspToObj(csp2));
@@ -137,11 +154,11 @@ Tinytest.add("browser-policy - csp", function (test) {
                         "default-src 'none'; frame-src https://foo.com; " +
                         "object-src http://foo.com https://foo.com;"));
 
-  // Check that frame-ancestors property is set correctly.

-  BrowserPolicy.content.allowFrameAncestorsOrigin("https://foo.com/");

-  test.isTrue(cspsEqual(BrowserPolicy.content._constructCsp(),

-                        "default-src 'none'; frame-src https://foo.com; " +

-                        "object-src http://foo.com https://foo.com; " +

+  // Check that frame-ancestors property is set correctly.
+  BrowserPolicy.content.allowFrameAncestorsOrigin("https://foo.com/");
+  test.isTrue(cspsEqual(BrowserPolicy.content._constructCsp(),
+                        "default-src 'none'; frame-src https://foo.com; " +
+                        "object-src http://foo.com https://foo.com; " +
                         "frame-ancestors https://foo.com;"));
 
   // CSP2 options: nonce
@@ -188,4 +205,4 @@ Tinytest.add("browser-policy - X-Content-Type-Options", function (test) {
   test.equal(BrowserPolicy.content._xContentTypeOptions(), "nosniff");
   BrowserPolicy.content.allowContentTypeSniffing();
   test.equal(BrowserPolicy.content._xContentTypeOptions(), undefined);
-});
+});
\ No newline at end of file
diff --git a/packages/browser-policy/package.js b/packages/browser-policy/package.js
index 8d370afc66..a44f8ba6b4 100644
--- a/packages/browser-policy/package.js
+++ b/packages/browser-policy/package.js
@@ -11,6 +11,6 @@ Package.onUse(function (api) {
 });
 
 Package.onTest(function (api) {
-  api.use(["tinytest", "browser-policy", "ejson", "underscore"], "server");
+  api.use(["tinytest", "browser-policy", "ejson"], "server");
   api.addFiles("browser-policy-test.js", "server");
 });

From 312f0f07939c5d6ec1e115207599eb2b7a6587f2 Mon Sep 17 00:00:00 2001
From: harryadel 
Date: Sat, 22 Oct 2022 09:18:57 +0200
Subject: [PATCH 080/114] [browser-policy-framing] Remove underscore

---
 packages/browser-policy-framing/browser-policy-framing.js | 2 +-
 packages/browser-policy-framing/package.js                | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/browser-policy-framing/browser-policy-framing.js b/packages/browser-policy-framing/browser-policy-framing.js
index eb90a3778b..1027492c57 100644
--- a/packages/browser-policy-framing/browser-policy-framing.js
+++ b/packages/browser-policy-framing/browser-policy-framing.js
@@ -12,7 +12,7 @@ var xFrameOptions = defaultXFrameOptions;
 const BrowserPolicy = require("meteor/browser-policy-common").BrowserPolicy;
 BrowserPolicy.framing = {};
 
-_.extend(BrowserPolicy.framing, {
+Object.assign(BrowserPolicy.framing, {
   // Exported for tests and browser-policy-common.
   _constructXFrameOptions: function () {
     return xFrameOptions;
diff --git a/packages/browser-policy-framing/package.js b/packages/browser-policy-framing/package.js
index 4b982f0967..7dc9041568 100644
--- a/packages/browser-policy-framing/package.js
+++ b/packages/browser-policy-framing/package.js
@@ -5,7 +5,7 @@ Package.describe({
 
 Package.onUse(function (api) {
   api.use("modules");
-  api.use(["underscore", "browser-policy-common"], "server");
+  api.use(["browser-policy-common"], "server");
   api.imply(["browser-policy-common"], "server");
   api.mainModule("browser-policy-framing.js", "server");
 });

From d24bf3a797bc35b2f40cdf0884e33bd16c4d55ca Mon Sep 17 00:00:00 2001
From: denihs 
Date: Tue, 25 Oct 2022 09:23:27 -0300
Subject: [PATCH 081/114] In the client, don't wait if the stub doesn't return
 a promise

---
 packages/ddp-client/common/livedata_connection.js | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/packages/ddp-client/common/livedata_connection.js b/packages/ddp-client/common/livedata_connection.js
index c30ff6f48d..868201c43d 100644
--- a/packages/ddp-client/common/livedata_connection.js
+++ b/packages/ddp-client/common/livedata_connection.js
@@ -695,7 +695,14 @@ export class Connection {
           invocation
         );
         try {
-          stubOptions.stubReturnValue = await stubInvocation();
+          const resultOrThenable = stubInvocation();
+          const isThenable =
+            resultOrThenable && typeof resultOrThenable.then === 'function';
+          if (isThenable) {
+            stubOptions.stubReturnValue = await resultOrThenable;
+          } else {
+            stubOptions.stubReturnValue = resultOrThenable;
+          }
         } finally {
           DDP._CurrentMethodInvocation._set(currentContext);
         }

From 7f80ad4b446826cef02f0d6241af50542b4a0cc9 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Tue, 25 Oct 2022 14:10:42 -0300
Subject: [PATCH 082/114] chore : update cicrcle ci

---
 .circleci/config.yml | 48 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 46 insertions(+), 2 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 8b275071cd..e8e1b5e52f 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -343,7 +343,7 @@ jobs:
       - run:
           name: "Running self-test (Test Group 3)"
           command: |
-            if [ -f ./tmp/test-groups/3.txt ]; then TEST_GROUP=$(<./tmp/test-groups/3.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^c[p-z]|^[d-g]|^h[a-e]'; fi
+            if [ -f ./tmp/test-groups/3.txt ]; then TEST_GROUP=$(<./tmp/test-groups/3.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^c[p-z]|^h[a-e]'; fi
             echo $TEST_GROUP;
             eval $PRE_TEST_COMMANDS;
             ./meteor self-test \
@@ -353,7 +353,7 @@ jobs:
               --headless \
               --junit ./tmp/results/junit/3.xml \
               --without-tag "custom-warehouse"
-          no_output_timeout: 20m
+          no_output_timeout: 30m
       - run:
           <<: *run_save_node_bin
       - store_test_results:
@@ -648,6 +648,46 @@ jobs:
       - store_artifacts:
           path: /tmp/memuse.txt
 
+  Test Group 11:
+    <<: *build_machine_environment
+    steps:
+      - run:
+          <<: *run_log_mem_use
+      - run:
+          <<: *run_env_change
+      - attach_workspace:
+          at: .
+      - run:
+          name: "Print environment"
+          command: printenv
+      - run:
+          name: "Running self-test (Test Group 11)"
+          command: |
+            if [ -f ./tmp/test-groups/11.txt ]; then TEST_GROUP=$(<./tmp/test-groups/11.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^[d-g]'; fi
+            echo $TEST_GROUP;
+            eval $PRE_TEST_COMMANDS;
+            ./meteor self-test \
+              "$TEST_GROUP" \
+              --retries ${METEOR_SELF_TEST_RETRIES} \
+              --exclude "${SELF_TEST_EXCLUDE}" \
+              --headless \
+              --junit ./tmp/results/junit/11.xml \
+              --without-tag "custom-warehouse"
+          no_output_timeout: 30m
+      - run:
+          <<: *run_save_node_bin
+      - store_test_results:
+          path: ./tmp/results
+      - persist_to_workspace:
+          root: .
+          paths: ./tmp/results/junit
+      - store_artifacts:
+          path: ./tmp/results
+      - store_artifacts:
+          path: /tmp/core_dumps
+      - store_artifacts:
+          path: /tmp/memuse.txt
+
   # Test the JSDoc declarations which live within this codebase against the
   # Meteor Docs (https://github.com/meteor/docs) repository, where they'll
   # eventually be consumed.  This test aims to provide an early warning of
@@ -804,6 +844,9 @@ workflows:
       - Test Group 10:
           requires:
             - Get Ready
+      - Test Group 11:
+          requires:
+            - Get Ready
       - Clean Up:
           requires:
             - Isolated Tests
@@ -818,3 +861,4 @@ workflows:
             - Test Group 8
             - Test Group 9
             - Test Group 10
+            - Test Group 11

From 03adee521a6a96253b91f72679e62a50f66b066c Mon Sep 17 00:00:00 2001
From: Vlad Lasky 
Date: Thu, 27 Oct 2022 18:36:11 +1100
Subject: [PATCH 083/114] str.match() returns an array on success which is not
 coerced into boolean true. An explicit not null check is now performed
 instead.

---
 packages/mongo-id/id.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/mongo-id/id.js b/packages/mongo-id/id.js
index b0bf43dd37..59a571cf88 100644
--- a/packages/mongo-id/id.js
+++ b/packages/mongo-id/id.js
@@ -3,7 +3,7 @@ import { Random } from 'meteor/random';
 
 const MongoID = {};
 
-MongoID._looksLikeObjectID = str => str.length === 24 && str.match(/^[0-9a-f]*$/);
+MongoID._looksLikeObjectID = str => str.length === 24 && (str.match(/^[0-9a-f]*$/) != null);
 
 MongoID.ObjectID = class ObjectID {
   constructor (hexString) {

From 02b5397694794850a3db05de96985251396df0a6 Mon Sep 17 00:00:00 2001
From: Vlad Lasky 
Date: Thu, 27 Oct 2022 23:22:53 +1100
Subject: [PATCH 084/114] Update packages/mongo-id/id.js
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Radosław Miernik 
---
 packages/mongo-id/id.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/mongo-id/id.js b/packages/mongo-id/id.js
index 59a571cf88..142a761a0d 100644
--- a/packages/mongo-id/id.js
+++ b/packages/mongo-id/id.js
@@ -3,7 +3,7 @@ import { Random } from 'meteor/random';
 
 const MongoID = {};
 
-MongoID._looksLikeObjectID = str => str.length === 24 && (str.match(/^[0-9a-f]*$/) != null);
+MongoID._looksLikeObjectID = str => str.length === 24 && /^[0-9a-f]*$/.test(str);
 
 MongoID.ObjectID = class ObjectID {
   constructor (hexString) {

From 971f85e8a61d82126ada28618c787b79dcf56180 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Thu, 27 Oct 2022 10:59:57 -0300
Subject: [PATCH 085/114] Meteor version to 2.8.1-beta.0 :comet:

---
 docs/history.md                               |  1 +
 packages/browser-policy-framing/package.js    |  2 +-
 packages/browser-policy/package.js            |  2 +-
 packages/diff-sequence/package.js             |  2 +-
 packages/ecmascript/package.js                |  2 +-
 packages/ejson/package.js                     |  2 +-
 packages/facebook-oauth/package.js            |  2 +-
 packages/facts-ui/package.js                  |  2 +-
 packages/fetch/package.js                     |  2 +-
 packages/geojson-utils/package.js             |  2 +-
 packages/meteor-tool/package.js               |  2 +-
 packages/modules-runtime-hot/package.js       |  2 +-
 packages/modules-runtime/package.js           |  2 +-
 packages/mongo/package.js                     |  2 +-
 packages/npm-mongo/package.js                 |  2 +-
 packages/test-in-browser/package.js           |  2 +-
 packages/twitter-oauth/package.js             |  2 +-
 packages/webapp-hashing/package.js            |  2 +-
 .../admin/meteor-release-experimental.json    |  2 +-
 scripts/admin/update-semver/index.js          | 46 +++++++++++++++----
 20 files changed, 56 insertions(+), 27 deletions(-)

diff --git a/docs/history.md b/docs/history.md
index c748fda441..6fce5aa79f 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -11,6 +11,7 @@
   - Updated default version of Facebook GraphAPI to v15
 
 
+
 ## v2.8, 2022-10-19
 
 #### Highlights
diff --git a/packages/browser-policy-framing/package.js b/packages/browser-policy-framing/package.js
index 7dc9041568..06ebdfe2e6 100644
--- a/packages/browser-policy-framing/package.js
+++ b/packages/browser-policy-framing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Restrict which websites can frame your app",
-  version: "1.1.0"
+  version: '1.1.1-beta.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/browser-policy/package.js b/packages/browser-policy/package.js
index a44f8ba6b4..aa3ab9dd80 100644
--- a/packages/browser-policy/package.js
+++ b/packages/browser-policy/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Configure security policies enforced by the browser",
-  version: "1.1.0"
+  version: '1.1.1-beta.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/diff-sequence/package.js b/packages/diff-sequence/package.js
index ff143f3e8a..e81b548ccf 100644
--- a/packages/diff-sequence/package.js
+++ b/packages/diff-sequence/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "An implementation of a diff algorithm on arrays and objects.",
-  version: '1.1.1',
+  version: '1.1.2-beta.0',
   documentation: null
 });
 
diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js
index 37378b5163..a7db21c514 100644
--- a/packages/ecmascript/package.js
+++ b/packages/ecmascript/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'ecmascript',
-  version: '0.16.2',
+  version: '0.16.3-beta.0',
   summary: 'Compiler plugin that supports ES2015+ in all .js files',
   documentation: 'README.md',
 });
diff --git a/packages/ejson/package.js b/packages/ejson/package.js
index 654f16c568..24754970e9 100644
--- a/packages/ejson/package.js
+++ b/packages/ejson/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Extended and Extensible JSON library',
-  version: '1.1.2'
+  version: '1.1.3-beta.0'
 });
 
 Package.onUse(function onUse(api) {
diff --git a/packages/facebook-oauth/package.js b/packages/facebook-oauth/package.js
index 67536065cb..db269c6ef9 100644
--- a/packages/facebook-oauth/package.js
+++ b/packages/facebook-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Facebook OAuth flow",
-  version: "1.11.0"
+  version: '1.11.1-beta.0'
 });
 
 Package.onUse(api => {
diff --git a/packages/facts-ui/package.js b/packages/facts-ui/package.js
index 5f367eb09d..7267d44a8e 100644
--- a/packages/facts-ui/package.js
+++ b/packages/facts-ui/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Display internal app statistics",
-  version: '1.0.0'
+  version: '1.0.1-beta.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/fetch/package.js b/packages/fetch/package.js
index dcba22f913..b56e1265b8 100644
--- a/packages/fetch/package.js
+++ b/packages/fetch/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "fetch",
-  version: "0.1.1",
+  version: '0.1.2-beta.0',
   summary: "Isomorphic modern/legacy/Node polyfill for WHATWG fetch()",
   documentation: "README.md"
 });
diff --git a/packages/geojson-utils/package.js b/packages/geojson-utils/package.js
index 052cdc64bc..7bb6607532 100644
--- a/packages/geojson-utils/package.js
+++ b/packages/geojson-utils/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'GeoJSON utility functions (from https://github.com/maxogden/geojson-js-utils)',
-  version: '1.0.10'
+  version: '1.0.11-beta.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js
index 374140976c..68565fa34c 100644
--- a/packages/meteor-tool/package.js
+++ b/packages/meteor-tool/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'The Meteor command-line tool',
-  version: '2.8.0',
+  version: '2.8.1-beta.0',
 });
 
 Package.includeTool();
diff --git a/packages/modules-runtime-hot/package.js b/packages/modules-runtime-hot/package.js
index 6a932eb21b..4d303badb3 100644
--- a/packages/modules-runtime-hot/package.js
+++ b/packages/modules-runtime-hot/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'modules-runtime-hot',
-  version: '0.14.0',
+  version: '0.14.1-beta.0',
   summary: 'Patches modules-runtime to support Hot Module Replacement',
   git: 'https://github.com/benjamn/install',
   documentation: 'README.md',
diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js
index f7ba69f134..66b80c028e 100644
--- a/packages/modules-runtime/package.js
+++ b/packages/modules-runtime/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "modules-runtime",
-  version: "0.13.0",
+  version: '0.13.2-beta.0',
   summary: "CommonJS module system",
   git: "https://github.com/benjamn/install",
   documentation: "README.md"
diff --git a/packages/mongo/package.js b/packages/mongo/package.js
index f31b7efe27..0ec175d219 100644
--- a/packages/mongo/package.js
+++ b/packages/mongo/package.js
@@ -9,7 +9,7 @@
 
 Package.describe({
   summary: "Adaptor for using MongoDB and Minimongo over DDP",
-  version: '1.16.0'
+  version: '1.16.1-beta.0'
 });
 
 Npm.depends({
diff --git a/packages/npm-mongo/package.js b/packages/npm-mongo/package.js
index 2222c52f7a..25a4b4ecb6 100644
--- a/packages/npm-mongo/package.js
+++ b/packages/npm-mongo/package.js
@@ -3,7 +3,7 @@
 
 Package.describe({
   summary: "Wrapper around the mongo npm package",
-  version: "4.11.0",
+  version: '4.11.0-beta.0',
   documentation: null
 });
 
diff --git a/packages/test-in-browser/package.js b/packages/test-in-browser/package.js
index 7bc88d5cf7..fb5e49cf72 100644
--- a/packages/test-in-browser/package.js
+++ b/packages/test-in-browser/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Run tests interactively in the browser",
-  version: '1.3.0',
+  version: '1.3.1-beta.0',
   documentation: null
 });
 
diff --git a/packages/twitter-oauth/package.js b/packages/twitter-oauth/package.js
index 34e0d8bff8..27eb65c32f 100644
--- a/packages/twitter-oauth/package.js
+++ b/packages/twitter-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Twitter OAuth flow",
-  version: "1.3.0"
+  version: '1.3.1-beta.0'
 });
 
 Package.onUse(function(api) {
diff --git a/packages/webapp-hashing/package.js b/packages/webapp-hashing/package.js
index 4098a5b937..088b184ffe 100644
--- a/packages/webapp-hashing/package.js
+++ b/packages/webapp-hashing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Used internally by WebApp. Knows how to hash programs from manifests.",
-  version: "1.1.0"
+  version: '1.1.1-beta.0'
 });
 
 Package.onUse(function(api) {
diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json
index 73b31948b6..2295f3302d 100644
--- a/scripts/admin/meteor-release-experimental.json
+++ b/scripts/admin/meteor-release-experimental.json
@@ -1,6 +1,6 @@
 {
   "track": "METEOR",
-  "version": "2.8-rc.0",
+  "version": "2.8.1-beta.0",
   "recommended": false,
   "official": false,
   "description": "Meteor experimental release"
diff --git a/scripts/admin/update-semver/index.js b/scripts/admin/update-semver/index.js
index bc903a43f1..3024508bb1 100644
--- a/scripts/admin/update-semver/index.js
+++ b/scripts/admin/update-semver/index.js
@@ -26,24 +26,49 @@ const runCommand = async (command) => {
   })
 }
 
+/**
+ *
+ * @returns {Promise}
+ */
 async function getPackages() {
   return await runCommand("./get-diff.sh");
 }
 
+async function getFile(path) {
+  try {
+    const data = await fs.promises.readFile(path, 'utf8');
+    return [data, null]
+  } catch (e) {
+    console.error(e);
+    return ['', e];
+  }
+
+}
+
 async function main() {
+  /**
+   * @type {string[]}
+   */
   let args = process.argv.slice(2);
 
-  if (args[0] === '@auto') {
-    const packages = await getPackages();
+  if (args[0].startsWith('@auto')) {
+    const [_, type] = args[0].split('.');
+    // List of packages that for some reason are not in the diff.
+    // If there is a change in one of them please do not forget
+    // to add it to the list.
+    // List:
+    // ddp-common
+
+    const p = await getPackages();
+    const packages = p.concat(`packages/meteor-tool.${ type }`);
     args = packages
       .split('/')
-      .filter((packageName) => packageName !== 'packages' && packageName !== "\npackages" && packageName !== "\n");
+      .filter((packageName) => packageName !== 'packages' && packageName !== "\npackages" && packageName !== "\n")
+      .map((packageName) => `${ packageName }.${ type }`);
   }
+
   /**
-   * @type {{
-   *   name: string,
-   *   version: string,
-   * }[]}
+   * @type {{release, name: string|null}[]}
    */
   const packages = args.map(arg => {
     const [name, release] = arg.split('.');
@@ -51,8 +76,9 @@ async function main() {
   });
   for (const { name, release } of packages) {
     const filePath = `../../../packages/${ name }/package.js`;
-    const code = await fs.promises.readFile(filePath, 'utf8');
-
+    const [code, err] = await getFile(filePath);
+    // if there is an error reading the file, we will skip it.
+    if (err) continue;
     for (const line of code.split(/\n/)) {
       // should only run on lines that have a version
       if (!line.includes('version')) continue;
@@ -83,6 +109,8 @@ async function main() {
       await fs.promises.writeFile(filePath, newCode);
     }
   }
+  console.log('Done!');
+  if (!args[0].startsWith('@auto')) console.log('Do not forget to update meteor-tool');
 }
 
 main();

From b61729248e0853c125b1f3f368e5e2aaaa55f8fb Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Thu, 27 Oct 2022 11:06:21 -0300
Subject: [PATCH 086/114] Meteor version to 2.8.1-beta.0 :comet:

---
 packages/ddp-client/package.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js
index 0cdc77a953..7b9eef3eb6 100644
--- a/packages/ddp-client/package.js
+++ b/packages/ddp-client/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Meteor's latency-compensated distributed data client",
-  version: '2.6.0',
+  version: '2.6.1-beta.0',
   documentation: null
 });
 

From b07df4d06c7fbaca533bc32b8e7a0bc709feda16 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 28 Oct 2022 06:28:34 -0300
Subject: [PATCH 087/114] fix: triong to make release tarballs

---
 scripts/make-release-tarballs.sh | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/scripts/make-release-tarballs.sh b/scripts/make-release-tarballs.sh
index 6b52e9c5e7..3b569e863f 100755
--- a/scripts/make-release-tarballs.sh
+++ b/scripts/make-release-tarballs.sh
@@ -15,13 +15,13 @@ echo "VERSION = $VERSION"
 git fetch origin && git checkout release/METEOR@$VERSION &&
   git reset --hard origin/$BRANCH_NAME &&
   git clean -df &&
-  ./meteor admin make-bootstrap-tarballs --target-arch os.windows.x86_64 $VERSION win64 &&
-  ./meteor admin make-bootstrap-tarballs --target-arch os.linux.x86_64 $VERSION linux64 &&
-  ./meteor admin make-bootstrap-tarballs --target-arch os.osx.x86_64 $VERSION osx &&
-  ./meteor admin make-bootstrap-tarballs --target-arch os.osx.arm64 $VERSION osx &&
   aws s3 mb s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
+  ./meteor admin make-bootstrap-tarballs --target-arch os.windows.x86_64 $VERSION win64 &&
   aws s3 cp --acl public-read win64/meteor-bootstrap-os.windows.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
+  ./meteor admin make-bootstrap-tarballs --target-arch os.linux.x86_64 $VERSION linux64 &&
   aws s3 cp --acl public-read linux64/meteor-bootstrap-os.linux.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
+  ./meteor admin make-bootstrap-tarballs --target-arch os.osx.x86_64 $VERSION osx &&
   aws s3 cp --acl public-read osx/meteor-bootstrap-os.osx.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
+  ./meteor admin make-bootstrap-tarballs --target-arch os.osx.arm64 $VERSION osx &&
   aws s3 cp --acl public-read osx/meteor-bootstrap-os.osx.arm64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
   aws s3 ls s3://com.meteor.static/packages-bootstrap/$VERSION

From 5fda7b30cdda6b8a646641bf0bbeeb6bc8e11d6f Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 28 Oct 2022 06:30:59 -0300
Subject: [PATCH 088/114] fix: orderring in tarballs script

---
 scripts/make-release-tarballs.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/make-release-tarballs.sh b/scripts/make-release-tarballs.sh
index 3b569e863f..70b90f5109 100755
--- a/scripts/make-release-tarballs.sh
+++ b/scripts/make-release-tarballs.sh
@@ -15,7 +15,6 @@ echo "VERSION = $VERSION"
 git fetch origin && git checkout release/METEOR@$VERSION &&
   git reset --hard origin/$BRANCH_NAME &&
   git clean -df &&
-  aws s3 mb s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
   ./meteor admin make-bootstrap-tarballs --target-arch os.windows.x86_64 $VERSION win64 &&
   aws s3 cp --acl public-read win64/meteor-bootstrap-os.windows.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
   ./meteor admin make-bootstrap-tarballs --target-arch os.linux.x86_64 $VERSION linux64 &&
@@ -24,4 +23,5 @@ git fetch origin && git checkout release/METEOR@$VERSION &&
   aws s3 cp --acl public-read osx/meteor-bootstrap-os.osx.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
   ./meteor admin make-bootstrap-tarballs --target-arch os.osx.arm64 $VERSION osx &&
   aws s3 cp --acl public-read osx/meteor-bootstrap-os.osx.arm64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
+  aws s3 mb s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
   aws s3 ls s3://com.meteor.static/packages-bootstrap/$VERSION

From d92bf473c2313e76e07b55af38c0938337404d67 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 28 Oct 2022 06:32:40 -0300
Subject: [PATCH 089/114] fix: string concatenation in script

---
 scripts/make-release-tarballs.sh | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/scripts/make-release-tarballs.sh b/scripts/make-release-tarballs.sh
index 70b90f5109..562b67823c 100755
--- a/scripts/make-release-tarballs.sh
+++ b/scripts/make-release-tarballs.sh
@@ -12,16 +12,16 @@ done
 echo "BRANCH_NAME = $BRANCH_NAME"
 echo "VERSION = $VERSION"
 
-git fetch origin && git checkout release/METEOR@$VERSION &&
-  git reset --hard origin/$BRANCH_NAME &&
+git fetch origin && git checkout release/METEOR@"$VERSION" &&
+  git reset --hard origin/"$BRANCH_NAME" &&
   git clean -df &&
-  ./meteor admin make-bootstrap-tarballs --target-arch os.windows.x86_64 $VERSION win64 &&
-  aws s3 cp --acl public-read win64/meteor-bootstrap-os.windows.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
-  ./meteor admin make-bootstrap-tarballs --target-arch os.linux.x86_64 $VERSION linux64 &&
-  aws s3 cp --acl public-read linux64/meteor-bootstrap-os.linux.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
-  ./meteor admin make-bootstrap-tarballs --target-arch os.osx.x86_64 $VERSION osx &&
-  aws s3 cp --acl public-read osx/meteor-bootstrap-os.osx.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
-  ./meteor admin make-bootstrap-tarballs --target-arch os.osx.arm64 $VERSION osx &&
-  aws s3 cp --acl public-read osx/meteor-bootstrap-os.osx.arm64.tar.gz s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
-  aws s3 mb s3://com.meteor.static/packages-bootstrap/$VERSION/ &&
-  aws s3 ls s3://com.meteor.static/packages-bootstrap/$VERSION
+  ./meteor admin make-bootstrap-tarballs --target-arch os.windows.x86_64 "$VERSION" win64 &&
+  aws s3 cp --acl public-read win64/meteor-bootstrap-os.windows.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/"$VERSION"/ &&
+  ./meteor admin make-bootstrap-tarballs --target-arch os.linux.x86_64 "$VERSION" linux64 &&
+  aws s3 cp --acl public-read linux64/meteor-bootstrap-os.linux.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/"$VERSION"/ &&
+  ./meteor admin make-bootstrap-tarballs --target-arch os.osx.x86_64 "$VERSION" osx &&
+  aws s3 cp --acl public-read osx/meteor-bootstrap-os.osx.x86_64.tar.gz s3://com.meteor.static/packages-bootstrap/"$VERSION"/ &&
+  ./meteor admin make-bootstrap-tarballs --target-arch os.osx.arm64 "$VERSION" osx &&
+  aws s3 cp --acl public-read osx/meteor-bootstrap-os.osx.arm64.tar.gz s3://com.meteor.static/packages-bootstrap/"$VERSION"/ &&
+  aws s3 mb s3://com.meteor.static/packages-bootstrap/"$VERSION"/ &&
+  aws s3 ls s3://com.meteor.static/packages-bootstrap/"$VERSION"

From 3c983eb0828599211ad98bd8425c583b56806218 Mon Sep 17 00:00:00 2001
From: Jan Dvorak 
Date: Wed, 2 Nov 2022 22:08:33 +0100
Subject: [PATCH 090/114] Bump to Node v14.21.0

---
 meteor                             | 2 +-
 scripts/build-dev-bundle-common.sh | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/meteor b/meteor
index dff5d789b0..29d45ea978 100755
--- a/meteor
+++ b/meteor
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-BUNDLE_VERSION=14.20.1.0
+BUNDLE_VERSION=14.21.0.0
 
 # OS Check. Put here because here is where we download the precompiled
 # bundles that are arch specific.
diff --git a/scripts/build-dev-bundle-common.sh b/scripts/build-dev-bundle-common.sh
index d7b4cfaa10..31655db57d 100644
--- a/scripts/build-dev-bundle-common.sh
+++ b/scripts/build-dev-bundle-common.sh
@@ -5,7 +5,7 @@ set -u
 
 UNAME=$(uname)
 ARCH=$(uname -m)
-NODE_VERSION=14.20.1
+NODE_VERSION=14.21.0
 MONGO_VERSION_64BIT=5.0.5
 MONGO_VERSION_32BIT=3.2.22
 NPM_VERSION=6.14.17

From ac6427bd1116354f0480421d14fe91c34f81b9eb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Po=C5=9Bpiech?= 
Date: Thu, 3 Nov 2022 14:26:45 +0100
Subject: [PATCH 091/114] limited adding assets only to server

---
 packages/accounts-base/package.js          | 2 +-
 packages/browser-policy-common/package.js  | 2 +-
 packages/check/package.js                  | 2 +-
 packages/ddp-rate-limiter/package.js       | 2 +-
 packages/ddp/package.js                    | 2 +-
 packages/ejson/package.js                  | 2 +-
 packages/email/package.js                  | 2 +-
 packages/hot-module-replacement/package.js | 2 +-
 packages/meteor/package.js                 | 2 +-
 packages/modern-browsers/package.js        | 2 +-
 packages/mongo/package.js                  | 2 +-
 packages/random/package.js                 | 2 +-
 packages/reactive-dict/package.js          | 2 +-
 packages/reactive-var/package.js           | 2 +-
 packages/server-render/package.js          | 2 +-
 packages/service-configuration/package.js  | 2 +-
 packages/session/package.js                | 2 +-
 packages/underscore/package.js             | 2 +-
 packages/webapp/package.js                 | 2 +-
 19 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js
index ed41554770..a411dcddbb 100644
--- a/packages/accounts-base/package.js
+++ b/packages/accounts-base/package.js
@@ -49,7 +49,7 @@ Package.onUse(api => {
   api.mainModule('server_main.js', 'server');
   api.mainModule('client_main.js', 'client');
 
-  api.addAssets('accounts-base.d.ts', ['client', 'server']);
+  api.addAssets('accounts-base.d.ts', 'server');
 });
 
 Package.onTest(api => {
diff --git a/packages/browser-policy-common/package.js b/packages/browser-policy-common/package.js
index 9f53f0a238..34748b2c22 100644
--- a/packages/browser-policy-common/package.js
+++ b/packages/browser-policy-common/package.js
@@ -7,5 +7,5 @@ Package.onUse(function (api) {
   api.use('webapp', 'server');
   api.addFiles('browser-policy-common.js', 'server');
   api.export('BrowserPolicy', 'server');
-  api.addAssets('browser-policy-common.d.ts', ['client', 'server']);
+  api.addAssets('browser-policy-common.d.ts', 'server');
 });
diff --git a/packages/check/package.js b/packages/check/package.js
index fa6b3a5ecd..084004fee8 100644
--- a/packages/check/package.js
+++ b/packages/check/package.js
@@ -7,7 +7,7 @@ Package.onUse(api => {
   api.use('ecmascript');
   api.use('ejson');
 
-  api.addAssets('check.d.ts', ['client', 'server']);
+  api.addAssets('check.d.ts', 'server');
 
   api.mainModule('match.js');
 
diff --git a/packages/ddp-rate-limiter/package.js b/packages/ddp-rate-limiter/package.js
index 3144f3d5ec..a692fb365a 100644
--- a/packages/ddp-rate-limiter/package.js
+++ b/packages/ddp-rate-limiter/package.js
@@ -14,7 +14,7 @@ Package.describe({
 Package.onUse(function(api) {
   api.use('rate-limit', 'server');
   api.use('ecmascript');
-  api.addAssets('ddp-rate-limiter.d.ts', ['client', 'server']);
+  api.addAssets('ddp-rate-limiter.d.ts', 'server');
   api.export('DDPRateLimiter', 'server');
   api.mainModule('ddp-rate-limiter.js', 'server');
 });
diff --git a/packages/ddp/package.js b/packages/ddp/package.js
index 108285a4d0..630a456199 100644
--- a/packages/ddp/package.js
+++ b/packages/ddp/package.js
@@ -7,7 +7,7 @@ Package.onUse(function (api) {
   api.use(['ddp-client'], ['client', 'server']);
   api.use(['ddp-server'], 'server');
 
-  api.addAssets('ddp.d.ts', ['client', 'server']);
+  api.addAssets('ddp.d.ts', 'server');
 
   api.export('DDP');
   api.export('DDPServer', 'server');
diff --git a/packages/ejson/package.js b/packages/ejson/package.js
index 7ed5099790..654f16c568 100644
--- a/packages/ejson/package.js
+++ b/packages/ejson/package.js
@@ -5,7 +5,7 @@ Package.describe({
 
 Package.onUse(function onUse(api) {
   api.use(['ecmascript', 'base64']);
-  api.addAssets('ejson.d.ts', ['client', 'server']);
+  api.addAssets('ejson.d.ts', 'server');
   api.mainModule('ejson.js');
   api.export('EJSON');
 });
diff --git a/packages/email/package.js b/packages/email/package.js
index b3f6de4894..606513eba7 100644
--- a/packages/email/package.js
+++ b/packages/email/package.js
@@ -10,7 +10,7 @@ Npm.depends({
 
 Package.onUse(function(api) {
   api.use(['ecmascript', 'logging', 'callback-hook'], 'server');
-  api.addAssets('email.d.ts', ['client', 'server']);
+  api.addAssets('email.d.ts', 'server');
   api.mainModule('email.js', 'server');
   api.export(['Email', 'EmailInternals'], 'server');
   api.export('EmailTest', 'server', { testOnly: true });
diff --git a/packages/hot-module-replacement/package.js b/packages/hot-module-replacement/package.js
index b3986feebc..9b0c1e3cef 100644
--- a/packages/hot-module-replacement/package.js
+++ b/packages/hot-module-replacement/package.js
@@ -11,7 +11,7 @@ Package.onUse(function(api) {
   api.use('meteor');
   api.use('hot-code-push', { unordered: true });
 
-  api.addAssets('hot-module-replacement.d.ts', ['client', 'server']);
+  api.addAssets('hot-module-replacement.d.ts', 'server');
 
   // Provides polyfills needed by Meteor.absoluteUrl in legacy browsers
   api.use('ecmascript-runtime-client', { weak: true });
diff --git a/packages/meteor/package.js b/packages/meteor/package.js
index 86093b59b8..992662e5df 100644
--- a/packages/meteor/package.js
+++ b/packages/meteor/package.js
@@ -55,7 +55,7 @@ Package.onUse(function (api) {
   // On Windows, it sometimes does, so we fix it for all apps and packages
   api.addFiles('flush-buffers-on-exit-in-windows.js', 'server');
 
-  api.addAssets('meteor.d.ts', ['client', 'server']);
+  api.addAssets('meteor.d.ts', 'server');
 });
 
 Package.onTest(function (api) {
diff --git a/packages/modern-browsers/package.js b/packages/modern-browsers/package.js
index a18712b61e..01cd4c954d 100644
--- a/packages/modern-browsers/package.js
+++ b/packages/modern-browsers/package.js
@@ -10,7 +10,7 @@ Package.describe({
 Package.onUse(function(api) {
   api.use('modules');
   api.mainModule('modern.js', 'server');
-  api.addAssets('modern.d.ts', ['client', 'server']);
+  api.addAssets('modern.d.ts', 'server');
 });
 
 Package.onTest(function(api) {
diff --git a/packages/mongo/package.js b/packages/mongo/package.js
index 39dd505837..00ccf9c7c0 100644
--- a/packages/mongo/package.js
+++ b/packages/mongo/package.js
@@ -82,7 +82,7 @@ Package.onUse(function (api) {
   api.addFiles('remote_collection_driver.js', 'server');
   api.addFiles('collection.js', ['client', 'server']);
   api.addFiles('connection_options.js', 'server');
-  api.addAssets('mongo.d.ts', ['client', 'server']);
+  api.addAssets('mongo.d.ts', 'server');
 });
 
 Package.onTest(function (api) {
diff --git a/packages/random/package.js b/packages/random/package.js
index 1f6dcb9231..3bafb5afde 100644
--- a/packages/random/package.js
+++ b/packages/random/package.js
@@ -8,7 +8,7 @@ Package.onUse(function (api) {
   api.export('Random');
   api.mainModule('main_client.js', 'client');
   api.mainModule('main_server.js', 'server');
-  api.addAssets('random.d.ts', ['client', 'server']);
+  api.addAssets('random.d.ts', 'server');
 });
 
 Package.onTest(function (api) {
diff --git a/packages/reactive-dict/package.js b/packages/reactive-dict/package.js
index 62a7ad8788..b5ed045e41 100644
--- a/packages/reactive-dict/package.js
+++ b/packages/reactive-dict/package.js
@@ -9,7 +9,7 @@ Package.onUse(function (api) {
   api.use(['mongo', 'reload'], { weak: true });
   api.mainModule('migration.js');
   api.export('ReactiveDict');
-  api.addAssets('reactive-dict.d.ts', ['client', 'server']);
+  api.addAssets('reactive-dict.d.ts', 'server');
 });
 
 Package.onTest(function (api) {
diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js
index e452ffe216..00b13b2cc2 100644
--- a/packages/reactive-var/package.js
+++ b/packages/reactive-var/package.js
@@ -9,5 +9,5 @@ Package.onUse(function (api) {
   api.use('tracker');
 
   api.addFiles('reactive-var.js');
-  api.addAssets('reactive-var.d.ts', ['client', 'server']);
+  api.addAssets('reactive-var.d.ts', 'server');
 });
diff --git a/packages/server-render/package.js b/packages/server-render/package.js
index 7b3dab2aaa..95e9f2bfcc 100644
--- a/packages/server-render/package.js
+++ b/packages/server-render/package.js
@@ -17,7 +17,7 @@ Package.onUse(function(api) {
   api.use("webapp");
   api.mainModule("client.js", "client", { lazy: true });
   api.mainModule("server.js", "server");
-  api.addAssets('server-render.d.ts', ['client', 'server']);
+  api.addAssets('server-render.d.ts', 'server');
 });
 
 Package.onTest(function(api) {
diff --git a/packages/service-configuration/package.js b/packages/service-configuration/package.js
index b411945e8d..10f65825bf 100644
--- a/packages/service-configuration/package.js
+++ b/packages/service-configuration/package.js
@@ -10,5 +10,5 @@ Package.onUse(function(api) {
   api.export('ServiceConfiguration');
   api.addFiles('service_configuration_common.js', ['client', 'server']);
   api.addFiles('service_configuration_server.js', 'server');
-  api.addAssets('service-configuration.d.ts', ['client', 'server']);
+  api.addAssets('service-configuration.d.ts', 'server');
 });
diff --git a/packages/session/package.js b/packages/session/package.js
index 0ef45d2cea..df54addcb8 100644
--- a/packages/session/package.js
+++ b/packages/session/package.js
@@ -13,7 +13,7 @@ Package.onUse(function (api) {
 
   api.export('Session', 'client');
   api.mainModule('session.js', 'client');
-  api.addAssets('session.d.ts', ['client', 'server']);
+  api.addAssets('session.d.ts', 'server');
 });
 
 Package.onTest(function (api) {
diff --git a/packages/underscore/package.js b/packages/underscore/package.js
index dca1b73c77..24c18c9bf4 100644
--- a/packages/underscore/package.js
+++ b/packages/underscore/package.js
@@ -28,7 +28,7 @@ Package.onUse(function (api) {
   // objects, not as arrays.  Search for looksLikeArray.
   api.addFiles(['pre.js', 'underscore.js', 'post.js']);
 
-  api.addAssets('underscore.d.ts', ['client', 'server']);
+  api.addAssets('underscore.d.ts', 'server');
 });
 
 
diff --git a/packages/webapp/package.js b/packages/webapp/package.js
index 5420188efc..d2dd15a551 100644
--- a/packages/webapp/package.js
+++ b/packages/webapp/package.js
@@ -57,7 +57,7 @@ Package.onUse(function(api) {
   api.export('WebApp', 'client');
 
   api.mainModule('webapp_cordova.js', 'web.cordova');
-  api.addAssets('webapp.d.ts', ['client', 'server']);
+  api.addAssets('webapp.d.ts', 'server');
 });
 
 Package.onTest(function(api) {

From 2df74cec40d11b2d81ddd34e4d2a5eb57163824a Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Thu, 3 Nov 2022 12:52:44 -0300
Subject: [PATCH 092/114] added docs

---
 packages/modules/module-system.png | Bin 0 -> 95033 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 packages/modules/module-system.png

diff --git a/packages/modules/module-system.png b/packages/modules/module-system.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8b82ac455cf3032baf2ab3fb964e8190ac1dfd4
GIT binary patch
literal 95033
zcmZ^K1zc3Yx;WAzhzdwAD3a3MAtl`@DJ9a~AR-~%A~~CMfN>
zIe8Rypa)e|49R_tM>+}$viDzC5Gl#0uwj=N6Jo12;J+Yb<1@yhNcT%oNb5$dy>Y8+
zf!ru*g5Tb4sL8M4ym+nlPbreS*acupRZtf`WlqS@k4eTA>=`G4*X2LC&=D~s|u$Ln0=pn
z(K4?M@KuNUWh?qT`7Uc{hy~rTu%wYJrm|r1I$hBWdk-6D17{^UV3R^EXYtz`e~~%+0YDdgBnxYw;l#cqP9;
zJEDSHF|jFI-=Su_o~<>ySSJAF7rnfDA0X5pY9AW%i`Yp;ThQ`;AoLGse1xYf`;ZNX
zq|{B`iik6u-W~s_j~4es%?G^aa&$9(9HUr4a>Ao{(fxed*x-Ig?FW+|&xM{7`^o+9?esr4j$$Mv&|&0wL8Ky2luT3lfRE8@^r2^DcM%pFZtRE6Vp}$x
zC4%i&c-r^%@6F4}$Wj(_@39CHu12#Ind}K&+*9heHGY)&iNcyI``(*=?s}1Kyu=S=
z8{VQ1q;V++Gft@6@s2*a4Gx}&-eOzG-Xp)SC_h#ts7;(s0;Z>kAyW3x>CzUfc&^V}
z^>{uJuDGh00Nl|&o;DVw&`@?N(wI(s#~}D1|HE43q*#
zYL1tMiZxz_1v@QvY?$1-ifc3OB^n|Y
zReobXj3yhZ{Pn~ANR);9epZ4+xI{$PN7@06Uu(Zq{2jZw*8mJLNh1!MaVLmB4{slZ
z(ty-AnAjev6CUAWa6Bv2R(!|0@=X14=I2`l<`U}ZTq=zfHBJ`cCv}e*9oF~+~MBws>8J-
zAiyy|3~P1MI^H#v!cupDz+w8K=rw*rs}>biE2_hJNPO1J~#t>
zrC-lMoI#b5#(`5+Ulsno^nE3qUdVVtn@jbubg4*OY1LTDqDMDGKjNEpSxU)t5nr*&
ztoQtnIp_J{O6EF>3Lk}Pql2{8aNlpf8JF_(_vjt+)$@Jxp`BHooU6L4L4o8_K|QO1
zE`fCy^B02`TKh@V+9WH)m$crr!GePPTQtHnlQd(rkyIJf3H-R!fOyGa5}WvjmQz=l
z+VHUku|}%;WbUnNl{JlxshfC{oTL0=R24~@eWSg46H$|gS7$)XwcifxDgRUTIMulF
zOwUZ`@%Q77FDa_uRSOvM)U?!eEKDq@39|@GxQM&xv_5PVYeo5D`%3#V`)d8RJ7oGz
z`+Jw3n9f(!Tl_7ZIbD)yqPU89LmoVDCqE(2PyDJq*<83IyXLo|Bbm6lHYG0{^<9fyjN@Q`2+a!+>PF
zd2!=?bB4sfUbyDI{)wdclW^m7eS86;XMFmIV(MwkgA0;x56u>x+pZUPDj6e+eix;1
zslJ(MU0LC174kjUwpz2YKZ$	%K1BWRz$&-(<{;(1(cYLB7M!`ot!Sdaj?5zkl*J
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
Date: Fri, 4 Nov 2022 09:34:35 -0300
Subject: [PATCH 093/114] Update packages/accounts-base/package-types.json

---
 packages/accounts-base/package-types.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/accounts-base/package-types.json b/packages/accounts-base/package-types.json
index e948b74664..033f6cab29 100644
--- a/packages/accounts-base/package-types.json
+++ b/packages/accounts-base/package-types.json
@@ -1,3 +1,3 @@
 {
-  "typesEntry": "__types/accounts-base.d.ts"
+  "typesEntry": "accounts-base.d.ts"
 }

From c68af6205fc8ef54585e5003a238d9faf18ee51e Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 4 Nov 2022 10:20:50 -0300
Subject: [PATCH 094/114] chore: updated the auto updater

---
 scripts/admin/update-semver/index.js | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/scripts/admin/update-semver/index.js b/scripts/admin/update-semver/index.js
index 3024508bb1..5ecd9c2e2e 100644
--- a/scripts/admin/update-semver/index.js
+++ b/scripts/admin/update-semver/index.js
@@ -60,6 +60,10 @@ async function main() {
     // ddp-common
 
     const p = await getPackages();
+    console.log('****************')
+    console.log('Will be updating the following packages:');
+    console.dir(p)
+    console.log('****************')
     const packages = p.concat(`packages/meteor-tool.${ type }`);
     args = packages
       .split('/')
@@ -88,8 +92,12 @@ async function main() {
       //   version: '1.2.3' <--- this is the line we want, we assure that it has a version in the previous if
       //});
       const [_, versionValue] = line.split(':');
-      const currentVersion = versionValue.trim().replace(',', '');
-      const semverVersion = semver.coerce(currentVersion);
+      const currentVersion = versionValue
+        .trim()
+        .replace(',', '')
+        .replace(/'/g, '')
+        .replace(/"/g, '');
+
 
       /**
        *
@@ -98,9 +106,9 @@ async function main() {
        */
       function incrementNewVersion(release) {
         if (release.includes('beta') || release.includes('rc')) {
-          return semver.inc(semverVersion, 'prerelease', release);
+          return semver.inc(currentVersion, 'prerelease', release);
         }
-        return semver.inc(semverVersion, release);
+        return semver.inc(currentVersion, release);
       }
 
       const newVersion = incrementNewVersion(release);

From dbfa7abf82463425f84cf926de2e2161ca83a391 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 4 Nov 2022 10:40:35 -0300
Subject: [PATCH 095/114] chore: added @all for updater

---
 scripts/admin/update-semver/index.js | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/scripts/admin/update-semver/index.js b/scripts/admin/update-semver/index.js
index 5ecd9c2e2e..73c4a0fce8 100644
--- a/scripts/admin/update-semver/index.js
+++ b/scripts/admin/update-semver/index.js
@@ -7,6 +7,7 @@
 const semver = require('semver');
 const fs = require('fs');
 const { exec } = require("child_process");
+const { readdir } = require("fs/promises");
 
 const runCommand = async (command) => {
   return new Promise((resolve, reject) => {
@@ -45,12 +46,23 @@ async function getFile(path) {
 
 }
 
+const getDirectories = async source =>
+  (await readdir(source, { withFileTypes: true }))
+    .filter(dirent => dirent.isDirectory())
+    .map(dirent => dirent.name);
+
 async function main() {
   /**
    * @type {string[]}
    */
   let args = process.argv.slice(2);
 
+  if (args[0].startsWith('@all')) {
+    const [_, type] = args[0].split('.');
+    const allPackages = await getDirectories('../../../packages');
+    args = allPackages.map((packageName) => `${ packageName }.${ type }`);
+  }
+
   if (args[0].startsWith('@auto')) {
     const [_, type] = args[0].split('.');
     // List of packages that for some reason are not in the diff.
@@ -92,6 +104,7 @@ async function main() {
       //   version: '1.2.3' <--- this is the line we want, we assure that it has a version in the previous if
       //});
       const [_, versionValue] = line.split(':');
+      if (!versionValue) continue;
       const currentVersion = versionValue
         .trim()
         .replace(',', '')
@@ -113,7 +126,7 @@ async function main() {
 
       const newVersion = incrementNewVersion(release);
       console.log(`Updating ${ name } from ${ currentVersion } to ${ newVersion }`);
-      const newCode = code.replace(currentVersion, "'" + newVersion + "'");
+      const newCode = code.replace(currentVersion, `${ newVersion }`);
       await fs.promises.writeFile(filePath, newCode);
     }
   }

From ab4350e3a68446f39e3d25c739a4c56a8381e8b8 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 4 Nov 2022 10:41:32 -0300
Subject: [PATCH 096/114] Meteor version to 2.8.1-beta.1 :comet:

---
 packages/accounts-base/package.js              | 2 +-
 packages/meteor-tool/package.js                | 2 +-
 packages/modules-runtime-hot/package.js        | 2 +-
 packages/modules-runtime/package.js            | 2 +-
 packages/mongo/package.js                      | 2 +-
 scripts/admin/meteor-release-experimental.json | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js
index a411dcddbb..20045b5258 100644
--- a/packages/accounts-base/package.js
+++ b/packages/accounts-base/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'A user account system',
-  version: '2.2.4',
+  version: '2.2.5-beta.0',
 });
 
 Package.onUse(api => {
diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js
index 68565fa34c..e5c8ded7c7 100644
--- a/packages/meteor-tool/package.js
+++ b/packages/meteor-tool/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'The Meteor command-line tool',
-  version: '2.8.1-beta.0',
+  version: '2.8.1-beta.1',
 });
 
 Package.includeTool();
diff --git a/packages/modules-runtime-hot/package.js b/packages/modules-runtime-hot/package.js
index 4d303badb3..e06c2b1892 100644
--- a/packages/modules-runtime-hot/package.js
+++ b/packages/modules-runtime-hot/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'modules-runtime-hot',
-  version: '0.14.1-beta.0',
+  version: '0.14.1-beta.1',
   summary: 'Patches modules-runtime to support Hot Module Replacement',
   git: 'https://github.com/benjamn/install',
   documentation: 'README.md',
diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js
index 66b80c028e..8253f2ecdd 100644
--- a/packages/modules-runtime/package.js
+++ b/packages/modules-runtime/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "modules-runtime",
-  version: '0.13.2-beta.0',
+  version: '0.13.2-beta.1',
   summary: "CommonJS module system",
   git: "https://github.com/benjamn/install",
   documentation: "README.md"
diff --git a/packages/mongo/package.js b/packages/mongo/package.js
index 0b37e4ac1b..b5a848fd14 100644
--- a/packages/mongo/package.js
+++ b/packages/mongo/package.js
@@ -9,7 +9,7 @@
 
 Package.describe({
   summary: "Adaptor for using MongoDB and Minimongo over DDP",
-  version: '1.16.1-beta.0'
+  version: '1.16.1-beta.1'
 });
 
 Npm.depends({
diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json
index 2295f3302d..d60ac53c6c 100644
--- a/scripts/admin/meteor-release-experimental.json
+++ b/scripts/admin/meteor-release-experimental.json
@@ -1,6 +1,6 @@
 {
   "track": "METEOR",
-  "version": "2.8.1-beta.0",
+  "version": "2.8.1-beta.1",
   "recommended": false,
   "official": false,
   "description": "Meteor experimental release"

From 995546f58e94e8c88d9bc335297263ce8b4e534b Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 4 Nov 2022 10:46:46 -0300
Subject: [PATCH 097/114] Meteor version to 2.8.1-beta.1 :comet:

---
 packages/accounts-base/package.js          | 2 +-
 packages/browser-policy-common/package.js  | 2 +-
 packages/browser-policy-framing/package.js | 2 +-
 packages/browser-policy/package.js         | 2 +-
 packages/check/package.js                  | 2 +-
 packages/ddp-client/package.js             | 2 +-
 packages/ddp-rate-limiter/package.js       | 2 +-
 packages/ddp/package.js                    | 2 +-
 packages/diff-sequence/package.js          | 2 +-
 packages/ecmascript/package.js             | 2 +-
 packages/ejson/package.js                  | 2 +-
 packages/email/package.js                  | 2 +-
 packages/facebook-oauth/package.js         | 2 +-
 packages/facts-ui/package.js               | 2 +-
 packages/fetch/package.js                  | 2 +-
 packages/geojson-utils/package.js          | 2 +-
 packages/hot-module-replacement/package.js | 2 +-
 packages/meteor/package.js                 | 2 +-
 packages/modern-browsers/package.js        | 2 +-
 packages/npm-mongo/package.js              | 2 +-
 packages/promise/package.js                | 2 +-
 packages/random/package.js                 | 2 +-
 packages/reactive-dict/package.js          | 2 +-
 packages/reactive-var/package.js           | 2 +-
 packages/server-render/package.js          | 2 +-
 packages/service-configuration/package.js  | 2 +-
 packages/session/package.js                | 2 +-
 packages/test-in-browser/package.js        | 2 +-
 packages/tracker/package.js                | 2 +-
 packages/twitter-oauth/package.js          | 2 +-
 packages/underscore/package.js             | 2 +-
 packages/webapp-hashing/package.js         | 2 +-
 packages/webapp/package.js                 | 2 +-
 33 files changed, 33 insertions(+), 33 deletions(-)

diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js
index 20045b5258..3627de74eb 100644
--- a/packages/accounts-base/package.js
+++ b/packages/accounts-base/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'A user account system',
-  version: '2.2.5-beta.0',
+  version: '2.2.5-beta.1',
 });
 
 Package.onUse(api => {
diff --git a/packages/browser-policy-common/package.js b/packages/browser-policy-common/package.js
index 34748b2c22..14a26977dc 100644
--- a/packages/browser-policy-common/package.js
+++ b/packages/browser-policy-common/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Common code for browser-policy packages",
-  version: "1.0.11"
+  version: "1.0.11-beta.1"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/browser-policy-framing/package.js b/packages/browser-policy-framing/package.js
index 06ebdfe2e6..22f88cec8a 100644
--- a/packages/browser-policy-framing/package.js
+++ b/packages/browser-policy-framing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Restrict which websites can frame your app",
-  version: '1.1.1-beta.0'
+  version: '1.1.1-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/browser-policy/package.js b/packages/browser-policy/package.js
index aa3ab9dd80..81ebcdb92c 100644
--- a/packages/browser-policy/package.js
+++ b/packages/browser-policy/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Configure security policies enforced by the browser",
-  version: '1.1.1-beta.0'
+  version: '1.1.1-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/check/package.js b/packages/check/package.js
index 084004fee8..930480fcbb 100644
--- a/packages/check/package.js
+++ b/packages/check/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Check whether a value matches a pattern',
-  version: '1.3.1',
+  version: '1.3.1-beta.1',
 });
 
 Package.onUse(api => {
diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js
index 7b9eef3eb6..6bd131ffd3 100644
--- a/packages/ddp-client/package.js
+++ b/packages/ddp-client/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Meteor's latency-compensated distributed data client",
-  version: '2.6.1-beta.0',
+  version: '2.6.1-beta.1',
   documentation: null
 });
 
diff --git a/packages/ddp-rate-limiter/package.js b/packages/ddp-rate-limiter/package.js
index a692fb365a..b2a63f9da3 100644
--- a/packages/ddp-rate-limiter/package.js
+++ b/packages/ddp-rate-limiter/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'ddp-rate-limiter',
-  version: '1.1.0',
+  version: '1.1.0-beta.1',
   // Brief, one-line summary of the package.
   summary: 'The DDPRateLimiter allows users to add rate limits to DDP' +
   ' methods and subscriptions.',
diff --git a/packages/ddp/package.js b/packages/ddp/package.js
index 630a456199..57d3a8f392 100644
--- a/packages/ddp/package.js
+++ b/packages/ddp/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Meteor's latency-compensated distributed data framework",
-  version: '1.4.0'
+  version: '1.4.0-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/diff-sequence/package.js b/packages/diff-sequence/package.js
index e81b548ccf..724d07f5cc 100644
--- a/packages/diff-sequence/package.js
+++ b/packages/diff-sequence/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "An implementation of a diff algorithm on arrays and objects.",
-  version: '1.1.2-beta.0',
+  version: '1.1.2-beta.1',
   documentation: null
 });
 
diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js
index a7db21c514..912d667c79 100644
--- a/packages/ecmascript/package.js
+++ b/packages/ecmascript/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'ecmascript',
-  version: '0.16.3-beta.0',
+  version: '0.16.3-beta.1',
   summary: 'Compiler plugin that supports ES2015+ in all .js files',
   documentation: 'README.md',
 });
diff --git a/packages/ejson/package.js b/packages/ejson/package.js
index 24754970e9..7bb97eaf35 100644
--- a/packages/ejson/package.js
+++ b/packages/ejson/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Extended and Extensible JSON library',
-  version: '1.1.3-beta.0'
+  version: '1.1.3-beta.1'
 });
 
 Package.onUse(function onUse(api) {
diff --git a/packages/email/package.js b/packages/email/package.js
index 606513eba7..165485bef1 100644
--- a/packages/email/package.js
+++ b/packages/email/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Send email messages',
-  version: '2.2.1',
+  version: '2.2.1-beta.1',
 });
 
 Npm.depends({
diff --git a/packages/facebook-oauth/package.js b/packages/facebook-oauth/package.js
index db269c6ef9..c743758fa8 100644
--- a/packages/facebook-oauth/package.js
+++ b/packages/facebook-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Facebook OAuth flow",
-  version: '1.11.1-beta.0'
+  version: '1.11.1-beta.1'
 });
 
 Package.onUse(api => {
diff --git a/packages/facts-ui/package.js b/packages/facts-ui/package.js
index 7267d44a8e..af39e4abbc 100644
--- a/packages/facts-ui/package.js
+++ b/packages/facts-ui/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Display internal app statistics",
-  version: '1.0.1-beta.0'
+  version: '1.0.1-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/fetch/package.js b/packages/fetch/package.js
index b56e1265b8..ff7ae07f4f 100644
--- a/packages/fetch/package.js
+++ b/packages/fetch/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "fetch",
-  version: '0.1.2-beta.0',
+  version: '0.1.2-beta.1',
   summary: "Isomorphic modern/legacy/Node polyfill for WHATWG fetch()",
   documentation: "README.md"
 });
diff --git a/packages/geojson-utils/package.js b/packages/geojson-utils/package.js
index 7bb6607532..27d9790229 100644
--- a/packages/geojson-utils/package.js
+++ b/packages/geojson-utils/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'GeoJSON utility functions (from https://github.com/maxogden/geojson-js-utils)',
-  version: '1.0.11-beta.0'
+  version: '1.0.11-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/hot-module-replacement/package.js b/packages/hot-module-replacement/package.js
index 9b0c1e3cef..e25f30ec79 100644
--- a/packages/hot-module-replacement/package.js
+++ b/packages/hot-module-replacement/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'hot-module-replacement',
-  version: '0.5.1',
+  version: '0.5.1-beta.1',
   summary: 'Update code in development without reloading the page',
   documentation: 'README.md',
   debugOnly: true,
diff --git a/packages/meteor/package.js b/packages/meteor/package.js
index 2f0a1796f8..d5a6bba164 100644
--- a/packages/meteor/package.js
+++ b/packages/meteor/package.js
@@ -2,7 +2,7 @@
 
 Package.describe({
   summary: "Core Meteor environment",
-  version: '1.10.1'
+  version: '1.10.1-beta.1'
 });
 
 Package.registerBuildPlugin({
diff --git a/packages/modern-browsers/package.js b/packages/modern-browsers/package.js
index 01cd4c954d..f036e318d4 100644
--- a/packages/modern-browsers/package.js
+++ b/packages/modern-browsers/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'modern-browsers',
-  version: '0.1.8',
+  version: '0.1.8-beta.1',
   summary:
     'API for defining the boundary between modern and legacy ' +
     'JavaScript clients',
diff --git a/packages/npm-mongo/package.js b/packages/npm-mongo/package.js
index 25a4b4ecb6..37d5a3ccfb 100644
--- a/packages/npm-mongo/package.js
+++ b/packages/npm-mongo/package.js
@@ -3,7 +3,7 @@
 
 Package.describe({
   summary: "Wrapper around the mongo npm package",
-  version: '4.11.0-beta.0',
+  version: '4.11.0-beta.1',
   documentation: null
 });
 
diff --git a/packages/promise/package.js b/packages/promise/package.js
index c0b3d613b6..1789319d61 100644
--- a/packages/promise/package.js
+++ b/packages/promise/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "promise",
-  version: "0.12.0",
+  version: "0.12.0-beta.1",
   summary: "ECMAScript 2015 Promise polyfill with Fiber support",
   git: "https://github.com/meteor/promise",
   documentation: "README.md"
diff --git a/packages/random/package.js b/packages/random/package.js
index 3bafb5afde..b31e69aed9 100644
--- a/packages/random/package.js
+++ b/packages/random/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Random number generator and utilities',
-  version: '1.2.0',
+  version: '1.2.0-beta.1',
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-dict/package.js b/packages/reactive-dict/package.js
index b5ed045e41..4feee4b9ae 100644
--- a/packages/reactive-dict/package.js
+++ b/packages/reactive-dict/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive dictionary",
-  version: '1.3.0'
+  version: '1.3.0-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js
index 00b13b2cc2..825c47f181 100644
--- a/packages/reactive-var/package.js
+++ b/packages/reactive-var/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive variable",
-  version: '1.0.11'
+  version: '1.0.11-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/server-render/package.js b/packages/server-render/package.js
index 95e9f2bfcc..ebb95e39a1 100644
--- a/packages/server-render/package.js
+++ b/packages/server-render/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "server-render",
-  version: "0.4.0",
+  version: "0.4.0-beta.1",
   summary: "Generic support for server-side rendering in Meteor apps",
   documentation: "README.md"
 });
diff --git a/packages/service-configuration/package.js b/packages/service-configuration/package.js
index 10f65825bf..bfb4d322ec 100644
--- a/packages/service-configuration/package.js
+++ b/packages/service-configuration/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Manage the configuration for third-party services',
-  version: '1.3.0',
+  version: '1.3.0-beta.1',
 });
 
 Package.onUse(function(api) {
diff --git a/packages/session/package.js b/packages/session/package.js
index df54addcb8..a4e7962d3c 100644
--- a/packages/session/package.js
+++ b/packages/session/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Session variable",
-  version: '1.2.0'
+  version: '1.2.0-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/test-in-browser/package.js b/packages/test-in-browser/package.js
index fb5e49cf72..8c8b78bea0 100644
--- a/packages/test-in-browser/package.js
+++ b/packages/test-in-browser/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Run tests interactively in the browser",
-  version: '1.3.1-beta.0',
+  version: '1.3.1-beta.1',
   documentation: null
 });
 
diff --git a/packages/tracker/package.js b/packages/tracker/package.js
index f56f16be60..3aff7eb4dc 100644
--- a/packages/tracker/package.js
+++ b/packages/tracker/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Dependency tracker to allow reactive callbacks",
-  version: "1.2.0"
+  version: "1.2.0-beta.1"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/twitter-oauth/package.js b/packages/twitter-oauth/package.js
index 27eb65c32f..a24f7f32dc 100644
--- a/packages/twitter-oauth/package.js
+++ b/packages/twitter-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Twitter OAuth flow",
-  version: '1.3.1-beta.0'
+  version: '1.3.1-beta.1'
 });
 
 Package.onUse(function(api) {
diff --git a/packages/underscore/package.js b/packages/underscore/package.js
index 24c18c9bf4..7a44847212 100644
--- a/packages/underscore/package.js
+++ b/packages/underscore/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Collection of small helpers: _.map, _.each, ...",
-  version: '1.0.10'
+  version: '1.0.10-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/webapp-hashing/package.js b/packages/webapp-hashing/package.js
index 088b184ffe..5c9e43a12d 100644
--- a/packages/webapp-hashing/package.js
+++ b/packages/webapp-hashing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Used internally by WebApp. Knows how to hash programs from manifests.",
-  version: '1.1.1-beta.0'
+  version: '1.1.1-beta.1'
 });
 
 Package.onUse(function(api) {
diff --git a/packages/webapp/package.js b/packages/webapp/package.js
index d2dd15a551..65011e6f5d 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.13.1',
+  version: '1.13.1-beta.1',
 });
 
 Npm.depends({

From a43b9649782ef7145d1a73b133880da791d0588d Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 4 Nov 2022 11:50:14 -0300
Subject: [PATCH 098/114] Meteor version to 2.8.1-beta.1 :comet:

---
 packages/check/package.js        | 2 +-
 packages/random/package.js       | 2 +-
 packages/reactive-var/package.js | 2 +-
 packages/session/package.js      | 2 +-
 packages/tracker/package.js      | 2 +-
 packages/underscore/package.js   | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/packages/check/package.js b/packages/check/package.js
index 930480fcbb..084004fee8 100644
--- a/packages/check/package.js
+++ b/packages/check/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Check whether a value matches a pattern',
-  version: '1.3.1-beta.1',
+  version: '1.3.1',
 });
 
 Package.onUse(api => {
diff --git a/packages/random/package.js b/packages/random/package.js
index b31e69aed9..3bafb5afde 100644
--- a/packages/random/package.js
+++ b/packages/random/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Random number generator and utilities',
-  version: '1.2.0-beta.1',
+  version: '1.2.0',
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js
index 825c47f181..00b13b2cc2 100644
--- a/packages/reactive-var/package.js
+++ b/packages/reactive-var/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive variable",
-  version: '1.0.11-beta.1'
+  version: '1.0.11'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/session/package.js b/packages/session/package.js
index a4e7962d3c..df54addcb8 100644
--- a/packages/session/package.js
+++ b/packages/session/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Session variable",
-  version: '1.2.0-beta.1'
+  version: '1.2.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/tracker/package.js b/packages/tracker/package.js
index 3aff7eb4dc..f56f16be60 100644
--- a/packages/tracker/package.js
+++ b/packages/tracker/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Dependency tracker to allow reactive callbacks",
-  version: "1.2.0-beta.1"
+  version: "1.2.0"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/underscore/package.js b/packages/underscore/package.js
index 7a44847212..24c18c9bf4 100644
--- a/packages/underscore/package.js
+++ b/packages/underscore/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Collection of small helpers: _.map, _.each, ...",
-  version: '1.0.10-beta.1'
+  version: '1.0.10'
 });
 
 Package.onUse(function (api) {

From 179da8bb8fcf9fe56827fc36c49801334d7559af Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 4 Nov 2022 11:54:37 -0300
Subject: [PATCH 099/114] Revert "Meteor version to 2.8.1-beta.1 :comet:"

This reverts commit a43b9649782ef7145d1a73b133880da791d0588d.
---
 packages/check/package.js        | 2 +-
 packages/random/package.js       | 2 +-
 packages/reactive-var/package.js | 2 +-
 packages/session/package.js      | 2 +-
 packages/tracker/package.js      | 2 +-
 packages/underscore/package.js   | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/packages/check/package.js b/packages/check/package.js
index 084004fee8..930480fcbb 100644
--- a/packages/check/package.js
+++ b/packages/check/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Check whether a value matches a pattern',
-  version: '1.3.1',
+  version: '1.3.1-beta.1',
 });
 
 Package.onUse(api => {
diff --git a/packages/random/package.js b/packages/random/package.js
index 3bafb5afde..b31e69aed9 100644
--- a/packages/random/package.js
+++ b/packages/random/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Random number generator and utilities',
-  version: '1.2.0',
+  version: '1.2.0-beta.1',
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js
index 00b13b2cc2..825c47f181 100644
--- a/packages/reactive-var/package.js
+++ b/packages/reactive-var/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive variable",
-  version: '1.0.11'
+  version: '1.0.11-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/session/package.js b/packages/session/package.js
index df54addcb8..a4e7962d3c 100644
--- a/packages/session/package.js
+++ b/packages/session/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Session variable",
-  version: '1.2.0'
+  version: '1.2.0-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/tracker/package.js b/packages/tracker/package.js
index f56f16be60..3aff7eb4dc 100644
--- a/packages/tracker/package.js
+++ b/packages/tracker/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Dependency tracker to allow reactive callbacks",
-  version: "1.2.0"
+  version: "1.2.0-beta.1"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/underscore/package.js b/packages/underscore/package.js
index 24c18c9bf4..7a44847212 100644
--- a/packages/underscore/package.js
+++ b/packages/underscore/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Collection of small helpers: _.map, _.each, ...",
-  version: '1.0.10'
+  version: '1.0.10-beta.1'
 });
 
 Package.onUse(function (api) {

From 31d3b2d5f41c2e9cc4e00c5079596323b28720f6 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 4 Nov 2022 12:04:40 -0300
Subject: [PATCH 100/114] Meteor version to 2.8.1-beta.1 :comet:

---
 packages/check/package.js                              |  2 +-
 packages/deprecated/jshint/.versions                   |  8 ++++----
 packages/non-core/less/.versions                       | 10 +++++-----
 packages/random/package.js                             |  2 +-
 packages/reactive-var/package.js                       |  2 +-
 packages/session/package.js                            |  2 +-
 packages/tracker/package.js                            |  2 +-
 packages/underscore/package.js                         |  2 +-
 tools/tests/apps/app-config/.meteor/versions           |  4 ++--
 tools/tests/apps/client-refresh/.meteor/versions       |  6 +++---
 .../compiler-plugin-static-html-error/.meteor/versions |  6 +++---
 .../apps/compiler-plugin-static-html/.meteor/versions  |  6 +++---
 tools/tests/apps/custom-minifier/.meteor/versions      |  6 +++---
 tools/tests/apps/dynamic-import/.meteor/packages       |  6 +++---
 tools/tests/apps/dynamic-import/.meteor/versions       | 10 +++++-----
 .../tests/apps/ecmascript-regression/.meteor/packages  |  2 +-
 .../tests/apps/ecmascript-regression/.meteor/versions  | 10 +++++-----
 tools/tests/apps/git-commit-hash/.meteor/versions      |  4 ++--
 .../apps/link-config-npm-package/.meteor/versions      |  4 ++--
 .../apps/linked-external-npm-package/.meteor/versions  |  4 ++--
 tools/tests/apps/meteor-ignore/.meteor/versions        |  4 ++--
 tools/tests/apps/modules/.meteor/packages              |  6 +++---
 tools/tests/apps/standard-app/.meteor/versions         |  6 +++---
 tools/tests/old/app-with-private/.meteor/versions      |  4 ++--
 24 files changed, 59 insertions(+), 59 deletions(-)

diff --git a/packages/check/package.js b/packages/check/package.js
index 930480fcbb..c2ab8cecd9 100644
--- a/packages/check/package.js
+++ b/packages/check/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Check whether a value matches a pattern',
-  version: '1.3.1-beta.1',
+  version: '1.3.2-beta.1',
 });
 
 Package.onUse(api => {
diff --git a/packages/deprecated/jshint/.versions b/packages/deprecated/jshint/.versions
index c5612a10eb..805d53d29e 100644
--- a/packages/deprecated/jshint/.versions
+++ b/packages/deprecated/jshint/.versions
@@ -5,7 +5,7 @@ base64@1.0.12
 binary-heap@1.0.11
 boilerplate-generator@1.7.1
 callback-hook@1.3.0
-check@1.3.1
+check@1.3.2-beta.1
 ddp@1.4.0
 ddp-client@2.4.1
 ddp-common@1.4.0
@@ -36,14 +36,14 @@ mongo-id@1.0.8
 npm-mongo@3.9.0
 ordered-dict@1.1.0
 promise@0.11.2
-random@1.2.0
+random@1.2.1-beta.1
 react-fast-refresh@0.1.1
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.0
 socket-stream-client@0.3.3
 tinytest@1.1.0
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 webapp@1.10.1
 webapp-hashing@1.1.0
diff --git a/packages/non-core/less/.versions b/packages/non-core/less/.versions
index b8dac39441..624d37670b 100644
--- a/packages/non-core/less/.versions
+++ b/packages/non-core/less/.versions
@@ -7,7 +7,7 @@ blaze@2.3.4
 boilerplate-generator@1.7.1
 caching-compiler@1.2.2
 callback-hook@1.3.1
-check@1.3.1
+check@1.3.2-beta.1
 ddp@1.4.0
 ddp-client@2.5.0
 ddp-common@1.4.0
@@ -40,16 +40,16 @@ npm-mongo@3.9.0
 observe-sequence@1.0.19
 ordered-dict@1.1.0
 promise@0.12.0
-random@1.2.0
+random@1.2.1-beta.1
 react-fast-refresh@0.1.1
-reactive-var@1.0.11
+reactive-var@1.0.12-beta.1
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.1
 socket-stream-client@0.4.0
 test-helpers@1.2.0
 tinytest@1.1.1
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 webapp@1.11.1
 webapp-hashing@1.1.0
diff --git a/packages/random/package.js b/packages/random/package.js
index b31e69aed9..083dca351b 100644
--- a/packages/random/package.js
+++ b/packages/random/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Random number generator and utilities',
-  version: '1.2.0-beta.1',
+  version: '1.2.1-beta.1',
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js
index 825c47f181..7569f084c5 100644
--- a/packages/reactive-var/package.js
+++ b/packages/reactive-var/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive variable",
-  version: '1.0.11-beta.1'
+  version: '1.0.12-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/session/package.js b/packages/session/package.js
index a4e7962d3c..58532f2810 100644
--- a/packages/session/package.js
+++ b/packages/session/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Session variable",
-  version: '1.2.0-beta.1'
+  version: '1.2.1-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/tracker/package.js b/packages/tracker/package.js
index 3aff7eb4dc..69789f0e6c 100644
--- a/packages/tracker/package.js
+++ b/packages/tracker/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Dependency tracker to allow reactive callbacks",
-  version: "1.2.0-beta.1"
+  version: "1.2.1-beta.1"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/underscore/package.js b/packages/underscore/package.js
index 7a44847212..527d7d17e9 100644
--- a/packages/underscore/package.js
+++ b/packages/underscore/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Collection of small helpers: _.map, _.each, ...",
-  version: '1.0.10-beta.1'
+  version: '1.0.11-beta.1'
 });
 
 Package.onUse(function (api) {
diff --git a/tools/tests/apps/app-config/.meteor/versions b/tools/tests/apps/app-config/.meteor/versions
index 23b1d17616..741cf5b27c 100644
--- a/tools/tests/apps/app-config/.meteor/versions
+++ b/tools/tests/apps/app-config/.meteor/versions
@@ -57,8 +57,8 @@ standard-minifier-css@1.4.1
 standard-minifier-js@2.3.2
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 url@1.2.0
 webapp@1.5.0
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/client-refresh/.meteor/versions b/tools/tests/apps/client-refresh/.meteor/versions
index 087c94fa51..dfd474adf1 100644
--- a/tools/tests/apps/client-refresh/.meteor/versions
+++ b/tools/tests/apps/client-refresh/.meteor/versions
@@ -7,7 +7,7 @@ boilerplate-generator@1.6.0
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 callback-hook@1.1.0
-check@1.3.1
+check@1.3.2-beta.1
 ddp@1.4.0
 ddp-client@2.3.3
 ddp-common@1.4.0
@@ -47,8 +47,8 @@ standard-minifier-js@2.4.1
 static-html@1.2.2
 templating-tools@1.1.2
 test-package@0.0.1
-tracker@1.2.0
+tracker@1.2.1-beta.1
 typescript@3.5.2-beta182.17
-underscore@1.0.10
+underscore@1.0.11-beta.1
 webapp@1.7.4
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/compiler-plugin-static-html-error/.meteor/versions b/tools/tests/apps/compiler-plugin-static-html-error/.meteor/versions
index 2112029aa3..c0e1bc65a8 100644
--- a/tools/tests/apps/compiler-plugin-static-html-error/.meteor/versions
+++ b/tools/tests/apps/compiler-plugin-static-html-error/.meteor/versions
@@ -7,7 +7,7 @@ boilerplate-generator@1.6.0
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 callback-hook@1.1.0
-check@1.3.1
+check@1.3.2-beta.1
 ddp@1.4.0
 ddp-client@2.3.3
 ddp-common@1.4.0
@@ -49,7 +49,7 @@ standard-minifier-css@1.5.3
 standard-minifier-js@2.4.1
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 webapp@1.7.4
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/compiler-plugin-static-html/.meteor/versions b/tools/tests/apps/compiler-plugin-static-html/.meteor/versions
index 2112029aa3..c0e1bc65a8 100644
--- a/tools/tests/apps/compiler-plugin-static-html/.meteor/versions
+++ b/tools/tests/apps/compiler-plugin-static-html/.meteor/versions
@@ -7,7 +7,7 @@ boilerplate-generator@1.6.0
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 callback-hook@1.1.0
-check@1.3.1
+check@1.3.2-beta.1
 ddp@1.4.0
 ddp-client@2.3.3
 ddp-common@1.4.0
@@ -49,7 +49,7 @@ standard-minifier-css@1.5.3
 standard-minifier-js@2.4.1
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 webapp@1.7.4
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/custom-minifier/.meteor/versions b/tools/tests/apps/custom-minifier/.meteor/versions
index 0aacfc62db..6f55d66e80 100644
--- a/tools/tests/apps/custom-minifier/.meteor/versions
+++ b/tools/tests/apps/custom-minifier/.meteor/versions
@@ -7,7 +7,7 @@ boilerplate-generator@1.6.0
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 callback-hook@1.2.0
-check@1.3.1
+check@1.3.2-beta.1
 custom-minifier@0.0.1
 ddp@1.4.0
 ddp-client@2.3.3
@@ -45,7 +45,7 @@ socket-stream-client@0.2.2
 spacebars-compiler@1.1.3
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 webapp@1.7.5
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/dynamic-import/.meteor/packages b/tools/tests/apps/dynamic-import/.meteor/packages
index b74a849e52..e75977188d 100644
--- a/tools/tests/apps/dynamic-import/.meteor/packages
+++ b/tools/tests/apps/dynamic-import/.meteor/packages
@@ -8,8 +8,8 @@ meteor-base@1.4.0             # Packages every Meteor app needs to have
 mobile-experience@1.1.0       # Packages for a great mobile UX
 mongo@1.9.0                   # The database Meteor supports right now
 blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views
-reactive-var@1.0.11            # Reactive variable for tracker
-tracker@1.2.0                 # Meteor's client-side reactive programming library
+reactive-var@1.0.12-beta.1            # Reactive variable for tracker
+tracker@1.2.1-beta.1                 # Meteor's client-side reactive programming library
 
 standard-minifier-css@1.6.0   # CSS minifier run for production mode
 standard-minifier-js@2.6.0    # JS minifier run for production mode
@@ -23,6 +23,6 @@ dynamic-import@0.5.1
 lazy-test-package
 helper-package
 user:colon-name
-underscore@1.0.10
+underscore@1.0.11-beta.1
 fetch@0.1.1
 jquery
diff --git a/tools/tests/apps/dynamic-import/.meteor/versions b/tools/tests/apps/dynamic-import/.meteor/versions
index a99df3012b..3872664234 100644
--- a/tools/tests/apps/dynamic-import/.meteor/versions
+++ b/tools/tests/apps/dynamic-import/.meteor/versions
@@ -12,7 +12,7 @@ boilerplate-generator@1.7.0
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 callback-hook@1.3.0
-check@1.3.1
+check@1.3.2-beta.1
 coffeescript@2.4.1
 coffeescript-compiler@2.4.1
 ddp@1.4.0
@@ -60,8 +60,8 @@ npm-mongo@3.7.0
 observe-sequence@1.0.16
 ordered-dict@1.1.0
 promise@0.11.2
-random@1.2.0
-reactive-var@1.0.11
+random@1.2.1-beta.1
+reactive-var@1.0.12-beta.1
 reload@1.3.0
 retry@1.1.0
 routepolicy@1.1.0
@@ -75,9 +75,9 @@ templating@1.3.2
 templating-compiler@1.3.3
 templating-runtime@1.3.2
 templating-tools@1.1.2
-tracker@1.2.0
+tracker@1.2.1-beta.1
 ui@1.0.13
-underscore@1.0.10
+underscore@1.0.11-beta.1
 user:colon-name@0.0.1
 webapp@1.9.0
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/ecmascript-regression/.meteor/packages b/tools/tests/apps/ecmascript-regression/.meteor/packages
index ab27ff6225..5dc670f631 100644
--- a/tools/tests/apps/ecmascript-regression/.meteor/packages
+++ b/tools/tests/apps/ecmascript-regression/.meteor/packages
@@ -7,7 +7,7 @@
 meteor-base@1.5.1             # Packages every Meteor app needs to have
 mobile-experience@1.1.0       # Packages for a great mobile UX
 mongo@1.13.0                   # The database Meteor supports right now
-reactive-var@1.0.11            # Reactive variable for tracker
+reactive-var@1.0.12-beta.1            # Reactive variable for tracker
 
 standard-minifier-css@1.7.4   # CSS minifier run for production mode
 standard-minifier-js@2.7.0    # JS minifier run for production mode
diff --git a/tools/tests/apps/ecmascript-regression/.meteor/versions b/tools/tests/apps/ecmascript-regression/.meteor/versions
index de86973195..697b4d7acc 100644
--- a/tools/tests/apps/ecmascript-regression/.meteor/versions
+++ b/tools/tests/apps/ecmascript-regression/.meteor/versions
@@ -10,7 +10,7 @@ boilerplate-generator@1.7.1
 caching-compiler@1.2.2
 caching-html-compiler@1.2.1
 callback-hook@1.4.0
-check@1.3.1
+check@1.3.2-beta.1
 ddp@1.4.0
 ddp-client@2.5.0
 ddp-common@1.4.0
@@ -56,10 +56,10 @@ mongo-id@1.0.8
 npm-mongo@3.9.1
 ordered-dict@1.1.0
 promise@0.12.0
-random@1.2.0
+random@1.2.1-beta.1
 react-fast-refresh@0.1.1
 react-meteor-data@2.3.3
-reactive-var@1.0.11
+reactive-var@1.0.12-beta.1
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.1
@@ -70,9 +70,9 @@ standard-minifier-css@1.7.4
 standard-minifier-js@2.7.1
 static-html@1.3.2
 templating-tools@1.2.1
-tracker@1.2.0
+tracker@1.2.1-beta.1
 typescript@4.3.5
-underscore@1.0.10
+underscore@1.0.11-beta.1
 url@1.3.2
 webapp@1.12.0
 webapp-hashing@1.1.0
diff --git a/tools/tests/apps/git-commit-hash/.meteor/versions b/tools/tests/apps/git-commit-hash/.meteor/versions
index a10ed1d9c8..fb9d3c8a07 100644
--- a/tools/tests/apps/git-commit-hash/.meteor/versions
+++ b/tools/tests/apps/git-commit-hash/.meteor/versions
@@ -33,7 +33,7 @@ standard-minifier-css@1.5.2
 standard-minifier-js@2.4.0
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 webapp@1.7.3-beta181.16
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/link-config-npm-package/.meteor/versions b/tools/tests/apps/link-config-npm-package/.meteor/versions
index 91816ff622..4df92e6329 100644
--- a/tools/tests/apps/link-config-npm-package/.meteor/versions
+++ b/tools/tests/apps/link-config-npm-package/.meteor/versions
@@ -33,7 +33,7 @@ standard-minifier-css@1.4.1
 standard-minifier-js@2.4.0-rc171.6
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 webapp@1.7.0-rc171.6
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/linked-external-npm-package/.meteor/versions b/tools/tests/apps/linked-external-npm-package/.meteor/versions
index 91816ff622..4df92e6329 100644
--- a/tools/tests/apps/linked-external-npm-package/.meteor/versions
+++ b/tools/tests/apps/linked-external-npm-package/.meteor/versions
@@ -33,7 +33,7 @@ standard-minifier-css@1.4.1
 standard-minifier-js@2.4.0-rc171.6
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 webapp@1.7.0-rc171.6
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/meteor-ignore/.meteor/versions b/tools/tests/apps/meteor-ignore/.meteor/versions
index 2a0c9c4a0e..d0550519a5 100644
--- a/tools/tests/apps/meteor-ignore/.meteor/versions
+++ b/tools/tests/apps/meteor-ignore/.meteor/versions
@@ -47,7 +47,7 @@ npm-mongo@2.2.30
 ordered-dict@1.0.9
 promise@0.9.0
 random@1.0.10
-reactive-var@1.0.11
+reactive-var@1.0.12-beta.1
 reload@1.1.11
 retry@1.0.9
 routepolicy@1.0.12
@@ -58,7 +58,7 @@ standard-minifier-js@2.1.1
 static-html@1.2.2
 templating-tools@1.1.2
 tracker@1.1.3
-underscore@1.0.10
+underscore@1.0.11-beta.1
 url@1.1.0
 webapp@1.3.19
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/modules/.meteor/packages b/tools/tests/apps/modules/.meteor/packages
index 2f92a7e262..a8cbf16ab4 100644
--- a/tools/tests/apps/modules/.meteor/packages
+++ b/tools/tests/apps/modules/.meteor/packages
@@ -8,9 +8,9 @@ meteor-base@1.4.0             # Packages every Meteor app needs to have
 mobile-experience@1.1.0       # Packages for a great mobile UX
 mongo@1.9.0                   # The database Meteor supports right now
 blaze-html-templates    # Compile .html files into Meteor Blaze views
-session@1.2.0                 # Client-side reactive dictionary for your app
+session@1.2.1-beta.1                 # Client-side reactive dictionary for your app
 jquery                        # Helpful client-side library
-tracker@1.2.0                 # Meteor's client-side reactive programming library
+tracker@1.2.1-beta.1                 # Meteor's client-side reactive programming library
 
 es5-shim@4.8.0                # ECMAScript 5 compatibility for older browsers.
 ecmascript@0.14.2              # Enable ECMAScript2015+ syntax in app code
@@ -23,7 +23,7 @@ client-only-ecmascript
 modules-test-plugin
 shell-server@0.5.0
 dynamic-import@0.5.1
-underscore@1.0.10
+underscore@1.0.11-beta.1
 import-local-json-module
 akryum:vue-component
 dummy-compiler
diff --git a/tools/tests/apps/standard-app/.meteor/versions b/tools/tests/apps/standard-app/.meteor/versions
index a574733bd2..563d1ca0f3 100644
--- a/tools/tests/apps/standard-app/.meteor/versions
+++ b/tools/tests/apps/standard-app/.meteor/versions
@@ -6,7 +6,7 @@ base64@1.0.11
 binary-heap@1.0.11
 boilerplate-generator@1.6.0
 callback-hook@1.1.0
-check@1.3.1
+check@1.3.2-beta.1
 ddp@1.4.0
 ddp-client@2.3.3
 ddp-common@1.4.0
@@ -49,7 +49,7 @@ shell-server@0.4.0
 socket-stream-client@0.2.2
 standard-minifier-css@1.5.2
 standard-minifier-js@2.4.0
-tracker@1.2.0
-underscore@1.0.10
+tracker@1.2.1-beta.1
+underscore@1.0.11-beta.1
 webapp@1.7.2
 webapp-hashing@1.0.9
diff --git a/tools/tests/old/app-with-private/.meteor/versions b/tools/tests/old/app-with-private/.meteor/versions
index 4a33deb24f..d3261ace0f 100644
--- a/tools/tests/old/app-with-private/.meteor/versions
+++ b/tools/tests/old/app-with-private/.meteor/versions
@@ -47,7 +47,7 @@ npm-mongo@2.2.33
 ordered-dict@1.0.9
 promise@0.10.0
 random@1.0.10
-reactive-var@1.0.11
+reactive-var@1.0.12-beta.1
 reload@1.1.11
 retry@1.0.9
 routepolicy@1.0.12
@@ -58,7 +58,7 @@ standard-minifier-js@2.2.1
 static-html@1.2.2
 templating-tools@1.1.2
 tracker@1.1.3
-underscore@1.0.10
+underscore@1.0.11-beta.1
 url@1.1.0
 webapp@1.4.0
 webapp-hashing@1.0.9

From 2cd00980a6b622ce85d90dfa22e25a4af27b7ce7 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Mon, 7 Nov 2022 15:59:33 -0300
Subject: [PATCH 101/114] feat: bumps dev-bundle

---
 meteor | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meteor b/meteor
index 29d45ea978..0779da7ba2 100755
--- a/meteor
+++ b/meteor
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-BUNDLE_VERSION=14.21.0.0
+BUNDLE_VERSION=14.21.1.0
 
 # OS Check. Put here because here is where we download the precompiled
 # bundles that are arch specific.

From 4adfd637e30a8694d64e216a20480b8d0d363c2a Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Mon, 7 Nov 2022 15:59:36 -0300
Subject: [PATCH 102/114] feat: bumps dev-bundle

---
 scripts/build-dev-bundle-common.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/build-dev-bundle-common.sh b/scripts/build-dev-bundle-common.sh
index 31655db57d..ef6013c4e5 100644
--- a/scripts/build-dev-bundle-common.sh
+++ b/scripts/build-dev-bundle-common.sh
@@ -5,7 +5,7 @@ set -u
 
 UNAME=$(uname)
 ARCH=$(uname -m)
-NODE_VERSION=14.21.0
+NODE_VERSION=14.21.1
 MONGO_VERSION_64BIT=5.0.5
 MONGO_VERSION_32BIT=3.2.22
 NPM_VERSION=6.14.17

From 9afbdc7e75397c1eddbb5f9bcb8724250e09872e Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Mon, 7 Nov 2022 17:05:39 -0300
Subject: [PATCH 103/114] Meteor version to 2.8.1-beta.2 :comet:

---
 packages/accounts-base/package.js                      |  2 +-
 packages/browser-policy-common/package.js              |  2 +-
 packages/browser-policy-framing/package.js             |  2 +-
 packages/browser-policy/package.js                     |  2 +-
 packages/check/package.js                              |  2 +-
 packages/ddp-client/package.js                         |  2 +-
 packages/ddp-rate-limiter/package.js                   |  2 +-
 packages/ddp/package.js                                |  2 +-
 packages/deprecated/jshint/.versions                   |  8 ++++----
 packages/diff-sequence/package.js                      |  2 +-
 packages/ecmascript/package.js                         |  2 +-
 packages/ejson/package.js                              |  2 +-
 packages/email/package.js                              |  2 +-
 packages/facebook-oauth/package.js                     |  2 +-
 packages/facts-ui/package.js                           |  2 +-
 packages/fetch/package.js                              |  2 +-
 packages/geojson-utils/package.js                      |  2 +-
 packages/hot-module-replacement/package.js             |  2 +-
 packages/meteor-tool/package.js                        |  2 +-
 packages/meteor/package.js                             |  2 +-
 packages/modern-browsers/package.js                    |  2 +-
 packages/modules-runtime-hot/package.js                |  2 +-
 packages/modules-runtime/package.js                    |  2 +-
 packages/mongo/package.js                              |  2 +-
 packages/non-core/less/.versions                       | 10 +++++-----
 packages/npm-mongo/package.js                          |  2 +-
 .../package-version-parser-tests.js                    |  2 +-
 packages/promise/package.js                            |  2 +-
 packages/random/package.js                             |  2 +-
 packages/reactive-dict/package.js                      |  2 +-
 packages/reactive-var/package.js                       |  2 +-
 packages/server-render/package.js                      |  2 +-
 packages/service-configuration/package.js              |  2 +-
 packages/session/package.js                            |  2 +-
 packages/test-in-browser/package.js                    |  2 +-
 packages/tracker/package.js                            |  2 +-
 packages/twitter-oauth/package.js                      |  2 +-
 packages/underscore/package.js                         |  2 +-
 packages/webapp-hashing/package.js                     |  2 +-
 packages/webapp/package.js                             |  2 +-
 scripts/admin/meteor-release-experimental.json         |  2 +-
 41 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js
index 3627de74eb..99b70c06ed 100644
--- a/packages/accounts-base/package.js
+++ b/packages/accounts-base/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'A user account system',
-  version: '2.2.5-beta.1',
+  version: '2.2.5-beta.2',
 });
 
 Package.onUse(api => {
diff --git a/packages/browser-policy-common/package.js b/packages/browser-policy-common/package.js
index 14a26977dc..8a06781697 100644
--- a/packages/browser-policy-common/package.js
+++ b/packages/browser-policy-common/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Common code for browser-policy packages",
-  version: "1.0.11-beta.1"
+  version: "1.0.11-beta.2"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/browser-policy-framing/package.js b/packages/browser-policy-framing/package.js
index 22f88cec8a..9670b17861 100644
--- a/packages/browser-policy-framing/package.js
+++ b/packages/browser-policy-framing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Restrict which websites can frame your app",
-  version: '1.1.1-beta.1'
+  version: '1.1.1-beta.2'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/browser-policy/package.js b/packages/browser-policy/package.js
index 81ebcdb92c..0b68e0ce8b 100644
--- a/packages/browser-policy/package.js
+++ b/packages/browser-policy/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Configure security policies enforced by the browser",
-  version: '1.1.1-beta.1'
+  version: '1.1.1-beta.2'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/check/package.js b/packages/check/package.js
index c2ab8cecd9..4462fad3e2 100644
--- a/packages/check/package.js
+++ b/packages/check/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Check whether a value matches a pattern',
-  version: '1.3.2-beta.1',
+  version: '1.3.2-beta.2',
 });
 
 Package.onUse(api => {
diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js
index 6bd131ffd3..3de1122c5d 100644
--- a/packages/ddp-client/package.js
+++ b/packages/ddp-client/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Meteor's latency-compensated distributed data client",
-  version: '2.6.1-beta.1',
+  version: '2.6.1-beta.2',
   documentation: null
 });
 
diff --git a/packages/ddp-rate-limiter/package.js b/packages/ddp-rate-limiter/package.js
index b2a63f9da3..87c68ae5e5 100644
--- a/packages/ddp-rate-limiter/package.js
+++ b/packages/ddp-rate-limiter/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'ddp-rate-limiter',
-  version: '1.1.0-beta.1',
+  version: '1.1.0-beta.2',
   // Brief, one-line summary of the package.
   summary: 'The DDPRateLimiter allows users to add rate limits to DDP' +
   ' methods and subscriptions.',
diff --git a/packages/ddp/package.js b/packages/ddp/package.js
index 57d3a8f392..d60c7fc16b 100644
--- a/packages/ddp/package.js
+++ b/packages/ddp/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Meteor's latency-compensated distributed data framework",
-  version: '1.4.0-beta.1'
+  version: '1.4.0-beta.2'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/deprecated/jshint/.versions b/packages/deprecated/jshint/.versions
index 805d53d29e..e7a3a229fa 100644
--- a/packages/deprecated/jshint/.versions
+++ b/packages/deprecated/jshint/.versions
@@ -5,7 +5,7 @@ base64@1.0.12
 binary-heap@1.0.11
 boilerplate-generator@1.7.1
 callback-hook@1.3.0
-check@1.3.2-beta.1
+check@1.3.2-beta.2
 ddp@1.4.0
 ddp-client@2.4.1
 ddp-common@1.4.0
@@ -36,14 +36,14 @@ mongo-id@1.0.8
 npm-mongo@3.9.0
 ordered-dict@1.1.0
 promise@0.11.2
-random@1.2.1-beta.1
+random@1.2.1-beta.2
 react-fast-refresh@0.1.1
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.0
 socket-stream-client@0.3.3
 tinytest@1.1.0
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1-beta.2
+underscore@1.0.11-beta.2
 webapp@1.10.1
 webapp-hashing@1.1.0
diff --git a/packages/diff-sequence/package.js b/packages/diff-sequence/package.js
index 724d07f5cc..0c8507666d 100644
--- a/packages/diff-sequence/package.js
+++ b/packages/diff-sequence/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "An implementation of a diff algorithm on arrays and objects.",
-  version: '1.1.2-beta.1',
+  version: '1.1.2-beta.2',
   documentation: null
 });
 
diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js
index 912d667c79..4d9014ddf2 100644
--- a/packages/ecmascript/package.js
+++ b/packages/ecmascript/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'ecmascript',
-  version: '0.16.3-beta.1',
+  version: '0.16.3-beta.2',
   summary: 'Compiler plugin that supports ES2015+ in all .js files',
   documentation: 'README.md',
 });
diff --git a/packages/ejson/package.js b/packages/ejson/package.js
index 7bb97eaf35..e746971d1e 100644
--- a/packages/ejson/package.js
+++ b/packages/ejson/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Extended and Extensible JSON library',
-  version: '1.1.3-beta.1'
+  version: '1.1.3-beta.2'
 });
 
 Package.onUse(function onUse(api) {
diff --git a/packages/email/package.js b/packages/email/package.js
index 165485bef1..9a8d92ece4 100644
--- a/packages/email/package.js
+++ b/packages/email/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Send email messages',
-  version: '2.2.1-beta.1',
+  version: '2.2.1-beta.2',
 });
 
 Npm.depends({
diff --git a/packages/facebook-oauth/package.js b/packages/facebook-oauth/package.js
index c743758fa8..c1f4dad023 100644
--- a/packages/facebook-oauth/package.js
+++ b/packages/facebook-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Facebook OAuth flow",
-  version: '1.11.1-beta.1'
+  version: '1.11.1-beta.2'
 });
 
 Package.onUse(api => {
diff --git a/packages/facts-ui/package.js b/packages/facts-ui/package.js
index af39e4abbc..41299598ba 100644
--- a/packages/facts-ui/package.js
+++ b/packages/facts-ui/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Display internal app statistics",
-  version: '1.0.1-beta.1'
+  version: '1.0.1-beta.2'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/fetch/package.js b/packages/fetch/package.js
index ff7ae07f4f..a7312b518d 100644
--- a/packages/fetch/package.js
+++ b/packages/fetch/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "fetch",
-  version: '0.1.2-beta.1',
+  version: '0.1.2-beta.2',
   summary: "Isomorphic modern/legacy/Node polyfill for WHATWG fetch()",
   documentation: "README.md"
 });
diff --git a/packages/geojson-utils/package.js b/packages/geojson-utils/package.js
index 27d9790229..4a56aee6f9 100644
--- a/packages/geojson-utils/package.js
+++ b/packages/geojson-utils/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'GeoJSON utility functions (from https://github.com/maxogden/geojson-js-utils)',
-  version: '1.0.11-beta.1'
+  version: '1.0.11-beta.2'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/hot-module-replacement/package.js b/packages/hot-module-replacement/package.js
index e25f30ec79..f46568e38f 100644
--- a/packages/hot-module-replacement/package.js
+++ b/packages/hot-module-replacement/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'hot-module-replacement',
-  version: '0.5.1-beta.1',
+  version: '0.5.1-beta.2',
   summary: 'Update code in development without reloading the page',
   documentation: 'README.md',
   debugOnly: true,
diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js
index e5c8ded7c7..84c8bd7041 100644
--- a/packages/meteor-tool/package.js
+++ b/packages/meteor-tool/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'The Meteor command-line tool',
-  version: '2.8.1-beta.1',
+  version: '2.8.1-beta.2',
 });
 
 Package.includeTool();
diff --git a/packages/meteor/package.js b/packages/meteor/package.js
index d5a6bba164..4cf2423190 100644
--- a/packages/meteor/package.js
+++ b/packages/meteor/package.js
@@ -2,7 +2,7 @@
 
 Package.describe({
   summary: "Core Meteor environment",
-  version: '1.10.1-beta.1'
+  version: '1.10.1-beta.2'
 });
 
 Package.registerBuildPlugin({
diff --git a/packages/modern-browsers/package.js b/packages/modern-browsers/package.js
index f036e318d4..157d6ed62a 100644
--- a/packages/modern-browsers/package.js
+++ b/packages/modern-browsers/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'modern-browsers',
-  version: '0.1.8-beta.1',
+  version: '0.1.8-beta.2',
   summary:
     'API for defining the boundary between modern and legacy ' +
     'JavaScript clients',
diff --git a/packages/modules-runtime-hot/package.js b/packages/modules-runtime-hot/package.js
index e06c2b1892..4ea5c471c1 100644
--- a/packages/modules-runtime-hot/package.js
+++ b/packages/modules-runtime-hot/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'modules-runtime-hot',
-  version: '0.14.1-beta.1',
+  version: '0.14.1-beta.2',
   summary: 'Patches modules-runtime to support Hot Module Replacement',
   git: 'https://github.com/benjamn/install',
   documentation: 'README.md',
diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js
index 8253f2ecdd..93c7fe58ca 100644
--- a/packages/modules-runtime/package.js
+++ b/packages/modules-runtime/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "modules-runtime",
-  version: '0.13.2-beta.1',
+  version: '0.13.2-beta.2',
   summary: "CommonJS module system",
   git: "https://github.com/benjamn/install",
   documentation: "README.md"
diff --git a/packages/mongo/package.js b/packages/mongo/package.js
index b5a848fd14..2020a960be 100644
--- a/packages/mongo/package.js
+++ b/packages/mongo/package.js
@@ -9,7 +9,7 @@
 
 Package.describe({
   summary: "Adaptor for using MongoDB and Minimongo over DDP",
-  version: '1.16.1-beta.1'
+  version: '1.16.1-beta.2'
 });
 
 Npm.depends({
diff --git a/packages/non-core/less/.versions b/packages/non-core/less/.versions
index 624d37670b..35cdc2ddcd 100644
--- a/packages/non-core/less/.versions
+++ b/packages/non-core/less/.versions
@@ -7,7 +7,7 @@ blaze@2.3.4
 boilerplate-generator@1.7.1
 caching-compiler@1.2.2
 callback-hook@1.3.1
-check@1.3.2-beta.1
+check@1.3.2-beta.2
 ddp@1.4.0
 ddp-client@2.5.0
 ddp-common@1.4.0
@@ -40,16 +40,16 @@ npm-mongo@3.9.0
 observe-sequence@1.0.19
 ordered-dict@1.1.0
 promise@0.12.0
-random@1.2.1-beta.1
+random@1.2.1-beta.2
 react-fast-refresh@0.1.1
-reactive-var@1.0.12-beta.1
+reactive-var@1.0.12-beta.2
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.1
 socket-stream-client@0.4.0
 test-helpers@1.2.0
 tinytest@1.1.1
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1-beta.2
+underscore@1.0.11-beta.2
 webapp@1.11.1
 webapp-hashing@1.1.0
diff --git a/packages/npm-mongo/package.js b/packages/npm-mongo/package.js
index 37d5a3ccfb..42205159b3 100644
--- a/packages/npm-mongo/package.js
+++ b/packages/npm-mongo/package.js
@@ -3,7 +3,7 @@
 
 Package.describe({
   summary: "Wrapper around the mongo npm package",
-  version: '4.11.0-beta.1',
+  version: '4.11.0-beta.2',
   documentation: null
 });
 
diff --git a/packages/package-version-parser/package-version-parser-tests.js b/packages/package-version-parser/package-version-parser-tests.js
index 855dc56057..8d24d28da5 100644
--- a/packages/package-version-parser/package-version-parser-tests.js
+++ b/packages/package-version-parser/package-version-parser-tests.js
@@ -434,7 +434,7 @@ Tinytest.add(
     compare("1.0.0-alpha.1", "1.0.0-alpha.beta", "<");
     compare("1.0.0-alpha.beta", "1.0.0-beta", "<");
     compare("1.0.0-beta", "1.0.0-beta.2", "<");
-    compare("1.0.0-beta.2", "1.0.0-beta.11", "<");
+    compare("1.0.0-beta.2", "1.0.0-beta.21", "<");
     compare("1.0.0-beta.11", "1.0.0-rc.1", "<");
     compare("1.0.0-rc.1", "1.0.0", "<");
 
diff --git a/packages/promise/package.js b/packages/promise/package.js
index 1789319d61..1d86c5aa5b 100644
--- a/packages/promise/package.js
+++ b/packages/promise/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "promise",
-  version: "0.12.0-beta.1",
+  version: "0.12.0-beta.2",
   summary: "ECMAScript 2015 Promise polyfill with Fiber support",
   git: "https://github.com/meteor/promise",
   documentation: "README.md"
diff --git a/packages/random/package.js b/packages/random/package.js
index 083dca351b..448a18f0b6 100644
--- a/packages/random/package.js
+++ b/packages/random/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Random number generator and utilities',
-  version: '1.2.1-beta.1',
+  version: '1.2.1-beta.2',
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-dict/package.js b/packages/reactive-dict/package.js
index 4feee4b9ae..717766700c 100644
--- a/packages/reactive-dict/package.js
+++ b/packages/reactive-dict/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive dictionary",
-  version: '1.3.0-beta.1'
+  version: '1.3.0-beta.2'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js
index 7569f084c5..95a1c5e8ec 100644
--- a/packages/reactive-var/package.js
+++ b/packages/reactive-var/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive variable",
-  version: '1.0.12-beta.1'
+  version: '1.0.12-beta.2'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/server-render/package.js b/packages/server-render/package.js
index ebb95e39a1..a48445c25a 100644
--- a/packages/server-render/package.js
+++ b/packages/server-render/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "server-render",
-  version: "0.4.0-beta.1",
+  version: "0.4.0-beta.2",
   summary: "Generic support for server-side rendering in Meteor apps",
   documentation: "README.md"
 });
diff --git a/packages/service-configuration/package.js b/packages/service-configuration/package.js
index bfb4d322ec..8011eccece 100644
--- a/packages/service-configuration/package.js
+++ b/packages/service-configuration/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Manage the configuration for third-party services',
-  version: '1.3.0-beta.1',
+  version: '1.3.0-beta.2',
 });
 
 Package.onUse(function(api) {
diff --git a/packages/session/package.js b/packages/session/package.js
index 58532f2810..d01f20a09a 100644
--- a/packages/session/package.js
+++ b/packages/session/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Session variable",
-  version: '1.2.1-beta.1'
+  version: '1.2.1-beta.2'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/test-in-browser/package.js b/packages/test-in-browser/package.js
index 8c8b78bea0..7c808fe28a 100644
--- a/packages/test-in-browser/package.js
+++ b/packages/test-in-browser/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Run tests interactively in the browser",
-  version: '1.3.1-beta.1',
+  version: '1.3.1-beta.2',
   documentation: null
 });
 
diff --git a/packages/tracker/package.js b/packages/tracker/package.js
index 69789f0e6c..9e121e160b 100644
--- a/packages/tracker/package.js
+++ b/packages/tracker/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Dependency tracker to allow reactive callbacks",
-  version: "1.2.1-beta.1"
+  version: "1.2.1-beta.2"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/twitter-oauth/package.js b/packages/twitter-oauth/package.js
index a24f7f32dc..f41a001d16 100644
--- a/packages/twitter-oauth/package.js
+++ b/packages/twitter-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Twitter OAuth flow",
-  version: '1.3.1-beta.1'
+  version: '1.3.1-beta.2'
 });
 
 Package.onUse(function(api) {
diff --git a/packages/underscore/package.js b/packages/underscore/package.js
index 527d7d17e9..09cf595668 100644
--- a/packages/underscore/package.js
+++ b/packages/underscore/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Collection of small helpers: _.map, _.each, ...",
-  version: '1.0.11-beta.1'
+  version: '1.0.11-beta.2'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/webapp-hashing/package.js b/packages/webapp-hashing/package.js
index 5c9e43a12d..f4920fe468 100644
--- a/packages/webapp-hashing/package.js
+++ b/packages/webapp-hashing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Used internally by WebApp. Knows how to hash programs from manifests.",
-  version: '1.1.1-beta.1'
+  version: '1.1.1-beta.2'
 });
 
 Package.onUse(function(api) {
diff --git a/packages/webapp/package.js b/packages/webapp/package.js
index 65011e6f5d..9b04cc8cac 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.13.1-beta.1',
+  version: '1.13.1-beta.2',
 });
 
 Npm.depends({
diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json
index d60ac53c6c..93ccc8d124 100644
--- a/scripts/admin/meteor-release-experimental.json
+++ b/scripts/admin/meteor-release-experimental.json
@@ -1,6 +1,6 @@
 {
   "track": "METEOR",
-  "version": "2.8.1-beta.1",
+  "version": "2.8.1-beta.2",
   "recommended": false,
   "official": false,
   "description": "Meteor experimental release"

From 9ddb1eb06a3932dfd44211ffae8d7eaba748a6bd Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Thu, 10 Nov 2022 10:18:33 -0300
Subject: [PATCH 104/114] Meteor version to 2.8.1-rc.0 :comet:

---
 packages/accounts-base/package.js                      |  2 +-
 packages/browser-policy-common/package.js              |  2 +-
 packages/browser-policy-framing/package.js             |  2 +-
 packages/browser-policy/package.js                     |  2 +-
 packages/check/package.js                              |  2 +-
 packages/ddp-client/package.js                         |  2 +-
 packages/ddp-rate-limiter/package.js                   |  2 +-
 packages/ddp/package.js                                |  2 +-
 packages/deprecated/jshint/.versions                   |  8 ++++----
 packages/diff-sequence/package.js                      |  2 +-
 packages/ecmascript/package.js                         |  2 +-
 packages/ejson/package.js                              |  2 +-
 packages/email/package.js                              |  2 +-
 packages/facebook-oauth/package.js                     |  2 +-
 packages/facts-ui/package.js                           |  2 +-
 packages/fetch/package.js                              |  2 +-
 packages/geojson-utils/package.js                      |  2 +-
 packages/hot-module-replacement/package.js             |  2 +-
 packages/meteor-tool/package.js                        |  2 +-
 packages/meteor/package.js                             |  2 +-
 packages/modern-browsers/package.js                    |  2 +-
 packages/modules-runtime-hot/package.js                |  2 +-
 packages/modules-runtime/package.js                    |  2 +-
 packages/mongo/package.js                              |  2 +-
 packages/non-core/less/.versions                       | 10 +++++-----
 packages/npm-mongo/package.js                          |  2 +-
 .../package-version-parser-tests.js                    |  2 +-
 packages/promise/package.js                            |  2 +-
 packages/random/package.js                             |  2 +-
 packages/reactive-dict/package.js                      |  2 +-
 packages/reactive-var/package.js                       |  2 +-
 packages/server-render/package.js                      |  2 +-
 packages/service-configuration/package.js              |  2 +-
 packages/session/package.js                            |  2 +-
 packages/test-in-browser/package.js                    |  2 +-
 packages/tracker/package.js                            |  2 +-
 packages/twitter-oauth/package.js                      |  2 +-
 packages/underscore/package.js                         |  2 +-
 packages/webapp-hashing/package.js                     |  2 +-
 packages/webapp/package.js                             |  2 +-
 scripts/admin/meteor-release-experimental.json         |  2 +-
 41 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js
index 99b70c06ed..7077a6fee6 100644
--- a/packages/accounts-base/package.js
+++ b/packages/accounts-base/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'A user account system',
-  version: '2.2.5-beta.2',
+  version: '2.2.5-rc.0',
 });
 
 Package.onUse(api => {
diff --git a/packages/browser-policy-common/package.js b/packages/browser-policy-common/package.js
index 8a06781697..6c14aefb43 100644
--- a/packages/browser-policy-common/package.js
+++ b/packages/browser-policy-common/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Common code for browser-policy packages",
-  version: "1.0.11-beta.2"
+  version: "1.0.11-rc.0"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/browser-policy-framing/package.js b/packages/browser-policy-framing/package.js
index 9670b17861..6ccaea89b5 100644
--- a/packages/browser-policy-framing/package.js
+++ b/packages/browser-policy-framing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Restrict which websites can frame your app",
-  version: '1.1.1-beta.2'
+  version: '1.1.1-rc.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/browser-policy/package.js b/packages/browser-policy/package.js
index 0b68e0ce8b..ea68128e8b 100644
--- a/packages/browser-policy/package.js
+++ b/packages/browser-policy/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Configure security policies enforced by the browser",
-  version: '1.1.1-beta.2'
+  version: '1.1.1-rc.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/check/package.js b/packages/check/package.js
index 4462fad3e2..de01eab25b 100644
--- a/packages/check/package.js
+++ b/packages/check/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Check whether a value matches a pattern',
-  version: '1.3.2-beta.2',
+  version: '1.3.2-rc.0',
 });
 
 Package.onUse(api => {
diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js
index 3de1122c5d..8c3a48db98 100644
--- a/packages/ddp-client/package.js
+++ b/packages/ddp-client/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Meteor's latency-compensated distributed data client",
-  version: '2.6.1-beta.2',
+  version: '2.6.1-rc.0',
   documentation: null
 });
 
diff --git a/packages/ddp-rate-limiter/package.js b/packages/ddp-rate-limiter/package.js
index 87c68ae5e5..06f3991082 100644
--- a/packages/ddp-rate-limiter/package.js
+++ b/packages/ddp-rate-limiter/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'ddp-rate-limiter',
-  version: '1.1.0-beta.2',
+  version: '1.1.0-rc.0',
   // Brief, one-line summary of the package.
   summary: 'The DDPRateLimiter allows users to add rate limits to DDP' +
   ' methods and subscriptions.',
diff --git a/packages/ddp/package.js b/packages/ddp/package.js
index d60c7fc16b..1f33786986 100644
--- a/packages/ddp/package.js
+++ b/packages/ddp/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Meteor's latency-compensated distributed data framework",
-  version: '1.4.0-beta.2'
+  version: '1.4.0-rc.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/deprecated/jshint/.versions b/packages/deprecated/jshint/.versions
index e7a3a229fa..e29bb428bd 100644
--- a/packages/deprecated/jshint/.versions
+++ b/packages/deprecated/jshint/.versions
@@ -5,7 +5,7 @@ base64@1.0.12
 binary-heap@1.0.11
 boilerplate-generator@1.7.1
 callback-hook@1.3.0
-check@1.3.2-beta.2
+check@1.3.2-rc.0
 ddp@1.4.0
 ddp-client@2.4.1
 ddp-common@1.4.0
@@ -36,14 +36,14 @@ mongo-id@1.0.8
 npm-mongo@3.9.0
 ordered-dict@1.1.0
 promise@0.11.2
-random@1.2.1-beta.2
+random@1.2.1-rc.0
 react-fast-refresh@0.1.1
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.0
 socket-stream-client@0.3.3
 tinytest@1.1.0
-tracker@1.2.1-beta.2
-underscore@1.0.11-beta.2
+tracker@1.2.1-rc.0
+underscore@1.0.11-rc.0
 webapp@1.10.1
 webapp-hashing@1.1.0
diff --git a/packages/diff-sequence/package.js b/packages/diff-sequence/package.js
index 0c8507666d..063b7b0fbe 100644
--- a/packages/diff-sequence/package.js
+++ b/packages/diff-sequence/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "An implementation of a diff algorithm on arrays and objects.",
-  version: '1.1.2-beta.2',
+  version: '1.1.2-rc.0',
   documentation: null
 });
 
diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js
index 4d9014ddf2..18dc04f858 100644
--- a/packages/ecmascript/package.js
+++ b/packages/ecmascript/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'ecmascript',
-  version: '0.16.3-beta.2',
+  version: '0.16.3-rc.0',
   summary: 'Compiler plugin that supports ES2015+ in all .js files',
   documentation: 'README.md',
 });
diff --git a/packages/ejson/package.js b/packages/ejson/package.js
index e746971d1e..2a1edd9b94 100644
--- a/packages/ejson/package.js
+++ b/packages/ejson/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Extended and Extensible JSON library',
-  version: '1.1.3-beta.2'
+  version: '1.1.3-rc.0'
 });
 
 Package.onUse(function onUse(api) {
diff --git a/packages/email/package.js b/packages/email/package.js
index 9a8d92ece4..6b486b0c40 100644
--- a/packages/email/package.js
+++ b/packages/email/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Send email messages',
-  version: '2.2.1-beta.2',
+  version: '2.2.1-rc.0',
 });
 
 Npm.depends({
diff --git a/packages/facebook-oauth/package.js b/packages/facebook-oauth/package.js
index c1f4dad023..0b74b97cab 100644
--- a/packages/facebook-oauth/package.js
+++ b/packages/facebook-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Facebook OAuth flow",
-  version: '1.11.1-beta.2'
+  version: '1.11.1-rc.0'
 });
 
 Package.onUse(api => {
diff --git a/packages/facts-ui/package.js b/packages/facts-ui/package.js
index 41299598ba..f0ef32f5bf 100644
--- a/packages/facts-ui/package.js
+++ b/packages/facts-ui/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Display internal app statistics",
-  version: '1.0.1-beta.2'
+  version: '1.0.1-rc.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/fetch/package.js b/packages/fetch/package.js
index a7312b518d..a54555be07 100644
--- a/packages/fetch/package.js
+++ b/packages/fetch/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "fetch",
-  version: '0.1.2-beta.2',
+  version: '0.1.2-rc.0',
   summary: "Isomorphic modern/legacy/Node polyfill for WHATWG fetch()",
   documentation: "README.md"
 });
diff --git a/packages/geojson-utils/package.js b/packages/geojson-utils/package.js
index 4a56aee6f9..156ba4c54b 100644
--- a/packages/geojson-utils/package.js
+++ b/packages/geojson-utils/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'GeoJSON utility functions (from https://github.com/maxogden/geojson-js-utils)',
-  version: '1.0.11-beta.2'
+  version: '1.0.11-rc.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/hot-module-replacement/package.js b/packages/hot-module-replacement/package.js
index f46568e38f..b269173f92 100644
--- a/packages/hot-module-replacement/package.js
+++ b/packages/hot-module-replacement/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'hot-module-replacement',
-  version: '0.5.1-beta.2',
+  version: '0.5.1-rc.0',
   summary: 'Update code in development without reloading the page',
   documentation: 'README.md',
   debugOnly: true,
diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js
index 84c8bd7041..70b5c56a00 100644
--- a/packages/meteor-tool/package.js
+++ b/packages/meteor-tool/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'The Meteor command-line tool',
-  version: '2.8.1-beta.2',
+  version: '2.8.1-rc.0',
 });
 
 Package.includeTool();
diff --git a/packages/meteor/package.js b/packages/meteor/package.js
index 4cf2423190..9e63b16844 100644
--- a/packages/meteor/package.js
+++ b/packages/meteor/package.js
@@ -2,7 +2,7 @@
 
 Package.describe({
   summary: "Core Meteor environment",
-  version: '1.10.1-beta.2'
+  version: '1.10.1-rc.0'
 });
 
 Package.registerBuildPlugin({
diff --git a/packages/modern-browsers/package.js b/packages/modern-browsers/package.js
index 157d6ed62a..98dc758315 100644
--- a/packages/modern-browsers/package.js
+++ b/packages/modern-browsers/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'modern-browsers',
-  version: '0.1.8-beta.2',
+  version: '0.1.8-rc.0',
   summary:
     'API for defining the boundary between modern and legacy ' +
     'JavaScript clients',
diff --git a/packages/modules-runtime-hot/package.js b/packages/modules-runtime-hot/package.js
index 4ea5c471c1..b22e874a96 100644
--- a/packages/modules-runtime-hot/package.js
+++ b/packages/modules-runtime-hot/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'modules-runtime-hot',
-  version: '0.14.1-beta.2',
+  version: '0.14.1-rc.0',
   summary: 'Patches modules-runtime to support Hot Module Replacement',
   git: 'https://github.com/benjamn/install',
   documentation: 'README.md',
diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js
index 93c7fe58ca..046d129f60 100644
--- a/packages/modules-runtime/package.js
+++ b/packages/modules-runtime/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "modules-runtime",
-  version: '0.13.2-beta.2',
+  version: '0.13.2-rc.0',
   summary: "CommonJS module system",
   git: "https://github.com/benjamn/install",
   documentation: "README.md"
diff --git a/packages/mongo/package.js b/packages/mongo/package.js
index 2020a960be..ba7744a1ca 100644
--- a/packages/mongo/package.js
+++ b/packages/mongo/package.js
@@ -9,7 +9,7 @@
 
 Package.describe({
   summary: "Adaptor for using MongoDB and Minimongo over DDP",
-  version: '1.16.1-beta.2'
+  version: '1.16.1-rc.0'
 });
 
 Npm.depends({
diff --git a/packages/non-core/less/.versions b/packages/non-core/less/.versions
index 35cdc2ddcd..fee8b829eb 100644
--- a/packages/non-core/less/.versions
+++ b/packages/non-core/less/.versions
@@ -7,7 +7,7 @@ blaze@2.3.4
 boilerplate-generator@1.7.1
 caching-compiler@1.2.2
 callback-hook@1.3.1
-check@1.3.2-beta.2
+check@1.3.2-rc.0
 ddp@1.4.0
 ddp-client@2.5.0
 ddp-common@1.4.0
@@ -40,16 +40,16 @@ npm-mongo@3.9.0
 observe-sequence@1.0.19
 ordered-dict@1.1.0
 promise@0.12.0
-random@1.2.1-beta.2
+random@1.2.1-rc.0
 react-fast-refresh@0.1.1
-reactive-var@1.0.12-beta.2
+reactive-var@1.0.12-rc.0
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.1
 socket-stream-client@0.4.0
 test-helpers@1.2.0
 tinytest@1.1.1
-tracker@1.2.1-beta.2
-underscore@1.0.11-beta.2
+tracker@1.2.1-rc.0
+underscore@1.0.11-rc.0
 webapp@1.11.1
 webapp-hashing@1.1.0
diff --git a/packages/npm-mongo/package.js b/packages/npm-mongo/package.js
index 42205159b3..3f4f649765 100644
--- a/packages/npm-mongo/package.js
+++ b/packages/npm-mongo/package.js
@@ -3,7 +3,7 @@
 
 Package.describe({
   summary: "Wrapper around the mongo npm package",
-  version: '4.11.0-beta.2',
+  version: '4.11.0-rc.0',
   documentation: null
 });
 
diff --git a/packages/package-version-parser/package-version-parser-tests.js b/packages/package-version-parser/package-version-parser-tests.js
index 8d24d28da5..855dc56057 100644
--- a/packages/package-version-parser/package-version-parser-tests.js
+++ b/packages/package-version-parser/package-version-parser-tests.js
@@ -434,7 +434,7 @@ Tinytest.add(
     compare("1.0.0-alpha.1", "1.0.0-alpha.beta", "<");
     compare("1.0.0-alpha.beta", "1.0.0-beta", "<");
     compare("1.0.0-beta", "1.0.0-beta.2", "<");
-    compare("1.0.0-beta.2", "1.0.0-beta.21", "<");
+    compare("1.0.0-beta.2", "1.0.0-beta.11", "<");
     compare("1.0.0-beta.11", "1.0.0-rc.1", "<");
     compare("1.0.0-rc.1", "1.0.0", "<");
 
diff --git a/packages/promise/package.js b/packages/promise/package.js
index 1d86c5aa5b..8737ce08f7 100644
--- a/packages/promise/package.js
+++ b/packages/promise/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "promise",
-  version: "0.12.0-beta.2",
+  version: "0.12.0-rc.0",
   summary: "ECMAScript 2015 Promise polyfill with Fiber support",
   git: "https://github.com/meteor/promise",
   documentation: "README.md"
diff --git a/packages/random/package.js b/packages/random/package.js
index 448a18f0b6..a2a3d0e582 100644
--- a/packages/random/package.js
+++ b/packages/random/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Random number generator and utilities',
-  version: '1.2.1-beta.2',
+  version: '1.2.1-rc.0',
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-dict/package.js b/packages/reactive-dict/package.js
index 717766700c..1d26e65e19 100644
--- a/packages/reactive-dict/package.js
+++ b/packages/reactive-dict/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive dictionary",
-  version: '1.3.0-beta.2'
+  version: '1.3.0-rc.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js
index 95a1c5e8ec..13e99f65ff 100644
--- a/packages/reactive-var/package.js
+++ b/packages/reactive-var/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive variable",
-  version: '1.0.12-beta.2'
+  version: '1.0.12-rc.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/server-render/package.js b/packages/server-render/package.js
index a48445c25a..628349b6f2 100644
--- a/packages/server-render/package.js
+++ b/packages/server-render/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "server-render",
-  version: "0.4.0-beta.2",
+  version: "0.4.0-rc.0",
   summary: "Generic support for server-side rendering in Meteor apps",
   documentation: "README.md"
 });
diff --git a/packages/service-configuration/package.js b/packages/service-configuration/package.js
index 8011eccece..c8e0ec8db1 100644
--- a/packages/service-configuration/package.js
+++ b/packages/service-configuration/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Manage the configuration for third-party services',
-  version: '1.3.0-beta.2',
+  version: '1.3.0-rc.0',
 });
 
 Package.onUse(function(api) {
diff --git a/packages/session/package.js b/packages/session/package.js
index d01f20a09a..f1e006a278 100644
--- a/packages/session/package.js
+++ b/packages/session/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Session variable",
-  version: '1.2.1-beta.2'
+  version: '1.2.1-rc.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/test-in-browser/package.js b/packages/test-in-browser/package.js
index 7c808fe28a..187a13565a 100644
--- a/packages/test-in-browser/package.js
+++ b/packages/test-in-browser/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Run tests interactively in the browser",
-  version: '1.3.1-beta.2',
+  version: '1.3.1-rc.0',
   documentation: null
 });
 
diff --git a/packages/tracker/package.js b/packages/tracker/package.js
index 9e121e160b..c98009b0de 100644
--- a/packages/tracker/package.js
+++ b/packages/tracker/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Dependency tracker to allow reactive callbacks",
-  version: "1.2.1-beta.2"
+  version: "1.2.1-rc.0"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/twitter-oauth/package.js b/packages/twitter-oauth/package.js
index f41a001d16..187616cefe 100644
--- a/packages/twitter-oauth/package.js
+++ b/packages/twitter-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Twitter OAuth flow",
-  version: '1.3.1-beta.2'
+  version: '1.3.1-rc.0'
 });
 
 Package.onUse(function(api) {
diff --git a/packages/underscore/package.js b/packages/underscore/package.js
index 09cf595668..06492153d1 100644
--- a/packages/underscore/package.js
+++ b/packages/underscore/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Collection of small helpers: _.map, _.each, ...",
-  version: '1.0.11-beta.2'
+  version: '1.0.11-rc.0'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/webapp-hashing/package.js b/packages/webapp-hashing/package.js
index f4920fe468..f9ced1e9fb 100644
--- a/packages/webapp-hashing/package.js
+++ b/packages/webapp-hashing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Used internally by WebApp. Knows how to hash programs from manifests.",
-  version: '1.1.1-beta.2'
+  version: '1.1.1-rc.0'
 });
 
 Package.onUse(function(api) {
diff --git a/packages/webapp/package.js b/packages/webapp/package.js
index 9b04cc8cac..a9fceaef96 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.13.1-beta.2',
+  version: '1.13.1-rc.0',
 });
 
 Npm.depends({
diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json
index 93ccc8d124..e475269aa6 100644
--- a/scripts/admin/meteor-release-experimental.json
+++ b/scripts/admin/meteor-release-experimental.json
@@ -1,6 +1,6 @@
 {
   "track": "METEOR",
-  "version": "2.8.1-beta.2",
+  "version": "2.8.1-rc.0",
   "recommended": false,
   "official": false,
   "description": "Meteor experimental release"

From e01cef46bc63f48a3ed5d90a22327b194bbb80c6 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 11 Nov 2022 11:21:42 -0300
Subject: [PATCH 105/114] docs: added highlights

---
 docs/history.md | 83 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 56 insertions(+), 27 deletions(-)

diff --git a/docs/history.md b/docs/history.md
index 984577f49e..37c7a07fca 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -2,16 +2,45 @@
 
 #### Highlights
 
+- modernize tools/run-updater.js by [afrokick](https://github.com/afrokick)
+- feat(error message): Especifing error message when cross-boundary by [Grubba27](https://github.com/Grubba27)
+- Type definitions for core packages by [piotrpospiech](https://github.com/piotrpospiech)
+- Add https proxy support to meteor-installer by [heschong](https://github.com/heschong)
+- Fix case insensitive lookup resource overuse by [ToyboxZach](https://github.com/ToyboxZach)
+- Update default Facebook API to v15 and fix local changelog by [StorytellerCZ](https://github.com/StorytellerCZ)
+- Bump to Node v14.21.0 by [StorytellerCZ](https://github.com/StorytellerCZ)
+- Use true mongo binary types by [znewsham](https://github.com/znewsham)
+- Add docs for Accounts.registerLoginHandler by [shivam1646](https://github.com/shivam1646)
+- Updated MongoDB driver to 4.11 by [radekmie](https://github.com/radekmie)
+- Show port in restart message by [harryadel](https://github.com/harryadel)
+- The rest of type definitions for core packages by [piotrpospiech](https://github.com/piotrpospiech)
+- Removing underscore in packages by [harryadel](https://github.com/harryadel):
+  - [twitter-oauth] Remove underscore 
+  - [test-in-browser] Remove underscore 
+  - [webapp-hashing] Remove underscore 
+  - [browser-policy] Remove underscore 
+  - [ecmascript] Remove underscore 
+  - [browser-policy-framing] Remove underscore 
+  - [diff-sequence] Remove underscore 
+  - [facts-ui] Remove underscore
+  - [geojson-utils] Remove underscore 
+
 #### Breaking Changes
 
+N/A
+
 #### Migration Steps
 
+_In case you want types in your app using the core packages types/zodern:types (now you do have the option)_
+
+1. Remove `@types/meteor` package
+2. Install [`zodern:types`](https://github.com/zodern/meteor-types) package
+3. Follow [installation guide for the Meteor Apps](https://github.com/zodern/meteor-types#meteor-apps) to update
+
 #### Meteor Version Release
 * `facebook-oauth@1.12.0`
   - Updated default version of Facebook GraphAPI to v15
 
-
-
 ## v2.8, 2022-10-19
 
 #### Highlights
@@ -3924,9 +3953,9 @@ N/A
 
 > Note: With this version of Reify, `import` declarations are compiled to
 `module.watch(require(id), ...)` instead of `module.importSync(id, ...)`
-or the older `module.import(id, ...)`. The behavior of the compiled code
-should be the same as before, but the details seemed different enough to
-warrant a note.
+> or the older `module.import(id, ...)`. The behavior of the compiled code
+> should be the same as before, but the details seemed different enough to
+> warrant a note.
 
 * The `install` npm package has been upgraded to version 0.10.1.
 
@@ -4270,15 +4299,15 @@ https://github.com/meteor/meteor/commit/0cbd25111d1249a61ca7adce23fad5215408c821
   are once again constrained by the current Meteor release.
 
 > Before Meteor 1.4, the current release dictated the exact version of
-every installed core package, which meant newer core packages could not
-be installed without publishing a new Meteor release. In order to
-support incremental development of core packages, Meteor 1.4 removed all
-release-based constraints on core package versions
+> every installed core package, which meant newer core packages could not
+> be installed without publishing a new Meteor release. In order to
+> support incremental development of core packages, Meteor 1.4 removed all
+> release-based constraints on core package versions
 ([#7084](https://github.com/meteor/meteor/pull/7084)). Now, in Meteor
-1.4.3, core package versions must remain patch-compatible with the
-versions they had when the Meteor release was published. This middle
-ground restores meaning to Meteor releases, yet still permits patch
-updates to core packages.
+> 1.4.3, core package versions must remain patch-compatible with the
+> versions they had when the Meteor release was published. This middle
+> ground restores meaning to Meteor releases, yet still permits patch
+> updates to core packages.
 
 * The `cordova-lib` npm package has been updated to 6.4.0, along with
   cordova-android (6.1.1) and cordova-ios (4.3.0), and various plugins.
@@ -4368,11 +4397,11 @@ updates to core packages.
   change was deemed too significant for this release.
 
 > Note: The decision to revert the above change was made late in the
-Meteor 1.4.2.4 release process, before it was ever recommended but too
-late in the process to avoid the additional increment of the version number.
-See [#8311](https://github.com/meteor/meteor/pull/8311) for additional
-information. This change will still be released in an upcoming version
-of Meteor with a more seamless upgrade.
+> Meteor 1.4.2.4 release process, before it was ever recommended but too
+> late in the process to avoid the additional increment of the version number.
+> See [#8311](https://github.com/meteor/meteor/pull/8311) for additional
+> information. This change will still be released in an upcoming version
+> of Meteor with a more seamless upgrade.
 
 ## v1.4.2.4, 2017-02-02
 
@@ -4381,7 +4410,7 @@ of Meteor with a more seamless upgrade.
 * The `npm` npm package has been upgraded from version 3.10.9 to 4.1.2.
 
 > Note: This change was later deemed too substantial for a point release
-and was reverted in Meteor 1.4.2.7.
+> and was reverted in Meteor 1.4.2.7.
 
 * Fix for [Issue #8136](https://github.com/meteor/meteor/issues/8136).
 
@@ -4408,9 +4437,9 @@ and was reverted in Meteor 1.4.2.7.
 
 > Note: Meteor 1.4.2.2 was finalized before
 [#8045](https://github.com/meteor/meteor/pull/8045) was merged, but
-those changes were [deemed important
+> those changes were [deemed important
 enough](https://github.com/meteor/meteor/pull/8044#issuecomment-260913739)
-to skip recommending 1.4.2.2 and instead immediately release 1.4.2.3.
+> to skip recommending 1.4.2.2 and instead immediately release 1.4.2.3.
 
 ## v1.4.2.2, 2016-11-15
 
@@ -4497,10 +4526,10 @@ to skip recommending 1.4.2.2 and instead immediately release 1.4.2.3.
   See https://github.com/meteor/meteor/pull/7668 for more details.
 
 > Note: the `METEOR_PROFILE` environment variable now provides data for
-server startup time as well as build time, which should make it easier
-to tell which of your packages are responsible for slow startup times.
-Please include the output of `METEOR_PROFILE=10 meteor run` with any
-GitHub issue about rebuild performance.
+> server startup time as well as build time, which should make it easier
+> to tell which of your packages are responsible for slow startup times.
+> Please include the output of `METEOR_PROFILE=10 meteor run` with any
+> GitHub issue about rebuild performance.
 
 * `npm` has been upgraded to version 3.10.9.
 
@@ -5077,8 +5106,8 @@ GitHub issue about rebuild performance.
 ## v1.3.2.4, 2016-04-20
 
 > Meteor 1.3.2.4 was published because publishing 1.3.2.3 failed in an
-unrecoverable way. Meteor 1.3.2.4 contains no additional changes beyond
-the changes in 1.3.2.3.
+> unrecoverable way. Meteor 1.3.2.4 contains no additional changes beyond
+> the changes in 1.3.2.3.
 
 ## v1.3.2.3, 2016-04-20
 

From 35024bf7309914b6d527dae150d617e9e6b34909 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 11 Nov 2022 11:48:32 -0300
Subject: [PATCH 106/114] docs: wip on history.md

---
 docs/history.md | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/docs/history.md b/docs/history.md
index 37c7a07fca..4ba3fe9f91 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -13,6 +13,7 @@
 - Add docs for Accounts.registerLoginHandler by [shivam1646](https://github.com/shivam1646)
 - Updated MongoDB driver to 4.11 by [radekmie](https://github.com/radekmie)
 - Show port in restart message by [harryadel](https://github.com/harryadel)
+- In the client, don't wait if the stub doesn't return a promise by [denihs](https://github.com/denihs)
 - The rest of type definitions for core packages by [piotrpospiech](https://github.com/piotrpospiech)
 - Removing underscore in packages by [harryadel](https://github.com/harryadel):
   - [twitter-oauth] Remove underscore 
@@ -38,6 +39,31 @@ _In case you want types in your app using the core packages types/zodern:types (
 3. Follow [installation guide for the Meteor Apps](https://github.com/zodern/meteor-types#meteor-apps) to update
 
 #### Meteor Version Release
+
+* `accounts-base@2.2.5`
+  - added types for package.
+* `browser-policy@1.1.1`
+  - adjusted package tests.
+* `browser-policy-common@1.0.12`
+  - added types for package.
+* `browser-policy-framing@1.1.1`
+  - removed underscore.
+* `check@1.3.2`
+  - added types for package.
+* `ddp@1.4.0`
+  - added types for package.
+* `ddp-client@2.6.1`
+  - In the client, don't wait if the stub doesn't return a promise.
+* `ddp-rate-limiter@1.1.1`
+  - added types for package.
+* `diff-sequence@1.1.2`
+  - removed underscore.
+* `ecmascript@0.16.3`
+  - removed underscore.
+* `ejson@1.1.3`
+  - added types for package. 
+* `ejson@2.2.2`
+  - added types for package.
 * `facebook-oauth@1.12.0`
   - Updated default version of Facebook GraphAPI to v15
 

From e56cb57afa17d55b28aa6a853a44acd5595010cc Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 11 Nov 2022 16:32:10 -0300
Subject: [PATCH 107/114] docs: finished listing packages

---
 docs/history.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/docs/history.md b/docs/history.md
index 4ba3fe9f91..25b02c6213 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -66,6 +66,53 @@ _In case you want types in your app using the core packages types/zodern:types (
   - added types for package.
 * `facebook-oauth@1.12.0`
   - Updated default version of Facebook GraphAPI to v15
+* `facts-ui@1.0.1`
+  - removed underscore.
+* `fetch@0.1.2`
+  - added types for package.
+* `geojson-utils@1.0.11`
+  - removed underscore.
+* `hot-module-replacement@0.5.2`
+  - added types for package.
+* `meteor@1.10.2`
+  - added types for package.
+* `modern-browsers@0.1.9`
+  - added types for package.
+* `modules-runtime@0.13.2`
+  - added accurate error messages.
+* `modules-runtime-hot@0.14.1`
+  - added accurate error messages.
+* `mongo@1.16.1`
+  - added types for package.
+  - added true mongo binary
+* `npm-mongo@4.11.0`
+  - updated npm mongo version to match npm one.
+* `promise@0.13.0`
+  - added types for package.
+* `random@1.2.1`
+  - added types for package.
+* `reactive-dict@1.3.1`
+  - added types for package.
+* `reactive-dict@1.0.12`
+  - added types for package.
+* `server-render@0.4.1`
+  - added types for package.
+* `service-configuration@1.3.1`
+  - added types for package.
+* `session@1.2.1`
+  - added types for package.
+* `test-in-browser@1.3.1`
+  - removed underscore.
+* `tracker@1.2.1`
+  - added types for package.
+* `twitter-oauth@1.3.1`
+  - removed underscore.
+* `underscore@1.0.11`
+  - added types for package.
+* `webapp@1.13.2`
+  - added types for package.
+* `webapp-hashing@1.1.1`
+  - added types for package.
 
 ## v2.8, 2022-10-19
 

From 3f3b929d1b18cf9e7df0301a9cbf4bb3f59c792b Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Fri, 11 Nov 2022 17:08:04 -0300
Subject: [PATCH 108/114] docs: added adding core types section

---
 docs/_config.yml                |  1 +
 docs/source/using-core-types.md | 39 +++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 docs/source/using-core-types.md

diff --git a/docs/_config.yml b/docs/_config.yml
index 78db90b0a2..7a70499147 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -86,6 +86,7 @@ sidebar_categories:
   Command Line:
     - commandline
     - environment-variables
+    - using-core-types
   Troubleshooting:
     - expired-certificate
     - windows
diff --git a/docs/source/using-core-types.md b/docs/source/using-core-types.md
new file mode 100644
index 0000000000..89ac1636af
--- /dev/null
+++ b/docs/source/using-core-types.md
@@ -0,0 +1,39 @@
+---
+title: Using Core Types
+description: Using core types with zodern:types
+---
+
+For MeteorJS in its version 2.8.1 we have introduced to our core packages an integration with the [zodern:types](https://github.com/zodern/meteor-types) package. 
+This package allows you to use the TypeScript types for the Meteor core packages in your TypeScript code or JavaScript code. 
+in order to use the types you need to install the package by running the command:
+
+```bash
+meteor add zodern:types
+```
+
+And add the following line to your `tsconfig.json` file (if you do not have one, create one and add the code bellow):
+
+```json
+{
+  "compilerOptions": {
+    "preserveSymlinks": true,
+    "paths": {
+      "meteor/*": [
+        "node_modules/@types/meteor/*",
+        ".meteor/local/types/packages.d.ts"
+      ]
+    }
+  }
+}
+```
+
+then run the command:
+
+```bash
+meteor lint
+```
+
+this will create a file within your .meteor folder that will have your types for the core packages.
+You can continue to use your code as you did before, but now you can use the types for the core packages even if you are in JavaScript.
+
+for more information about the package please visit the [zodern:types](https://github.com/zodern/meteor-types).

From 36d64af64d97d4fe2c238a26aa3015f64b812aa7 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Mon, 14 Nov 2022 08:20:31 -0300
Subject: [PATCH 109/114] Meteor version to 2.8.1 :comet:

---
 npm-packages/meteor-installer/package.json |  2 +-
 packages/accounts-base/package.js          |  2 +-
 packages/browser-policy-common/package.js  |  2 +-
 packages/browser-policy-framing/package.js |  2 +-
 packages/browser-policy/package.js         |  2 +-
 packages/check/package.js                  |  2 +-
 packages/ddp-client/package.js             |  2 +-
 packages/ddp-rate-limiter/package.js       |  2 +-
 packages/ddp/package.js                    |  2 +-
 packages/deprecated/jshint/.versions       |  8 ++++----
 packages/diff-sequence/package.js          |  2 +-
 packages/ecmascript/package.js             |  2 +-
 packages/ejson/package.js                  |  2 +-
 packages/email/package.js                  |  2 +-
 packages/facebook-oauth/package.js         |  2 +-
 packages/facts-ui/package.js               |  2 +-
 packages/fetch/package.js                  |  2 +-
 packages/geojson-utils/package.js          |  2 +-
 packages/hot-module-replacement/package.js |  2 +-
 packages/meteor-tool/package.js            |  2 +-
 packages/meteor/package.js                 |  2 +-
 packages/modern-browsers/package.js        |  2 +-
 packages/modules-runtime-hot/package.js    |  2 +-
 packages/modules-runtime/package.js        |  2 +-
 packages/mongo/package.js                  |  2 +-
 packages/non-core/less/.versions           | 10 +++++-----
 packages/npm-mongo/package.js              |  2 +-
 packages/promise/package.js                |  2 +-
 packages/random/package.js                 |  2 +-
 packages/reactive-dict/package.js          |  2 +-
 packages/reactive-var/package.js           |  2 +-
 packages/server-render/package.js          |  2 +-
 packages/service-configuration/package.js  |  2 +-
 packages/session/package.js                |  2 +-
 packages/test-in-browser/package.js        |  2 +-
 packages/tracker/package.js                |  2 +-
 packages/twitter-oauth/package.js          |  2 +-
 packages/underscore/package.js             |  2 +-
 packages/webapp-hashing/package.js         |  2 +-
 packages/webapp/package.js                 |  2 +-
 scripts/admin/meteor-release-official.json |  2 +-
 41 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/npm-packages/meteor-installer/package.json b/npm-packages/meteor-installer/package.json
index d7a6b90863..34f8eb8224 100644
--- a/npm-packages/meteor-installer/package.json
+++ b/npm-packages/meteor-installer/package.json
@@ -1,6 +1,6 @@
 {
   "name": "meteor",
-  "version": "2.8.0",
+  "version": "2.8.1",
   "description": "Install Meteor",
   "main": "install.js",
   "scripts": {
diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js
index 7077a6fee6..90f03e6b50 100644
--- a/packages/accounts-base/package.js
+++ b/packages/accounts-base/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'A user account system',
-  version: '2.2.5-rc.0',
+  version: '2.2.5',
 });
 
 Package.onUse(api => {
diff --git a/packages/browser-policy-common/package.js b/packages/browser-policy-common/package.js
index 6c14aefb43..d3a1888984 100644
--- a/packages/browser-policy-common/package.js
+++ b/packages/browser-policy-common/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Common code for browser-policy packages",
-  version: "1.0.11-rc.0"
+  version: "1.0.12"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/browser-policy-framing/package.js b/packages/browser-policy-framing/package.js
index 6ccaea89b5..1135346dd5 100644
--- a/packages/browser-policy-framing/package.js
+++ b/packages/browser-policy-framing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Restrict which websites can frame your app",
-  version: '1.1.1-rc.0'
+  version: '1.1.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/browser-policy/package.js b/packages/browser-policy/package.js
index ea68128e8b..bbab788e76 100644
--- a/packages/browser-policy/package.js
+++ b/packages/browser-policy/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Configure security policies enforced by the browser",
-  version: '1.1.1-rc.0'
+  version: '1.1.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/check/package.js b/packages/check/package.js
index de01eab25b..7505e58b51 100644
--- a/packages/check/package.js
+++ b/packages/check/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Check whether a value matches a pattern',
-  version: '1.3.2-rc.0',
+  version: '1.3.2',
 });
 
 Package.onUse(api => {
diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js
index 8c3a48db98..5a0b31737f 100644
--- a/packages/ddp-client/package.js
+++ b/packages/ddp-client/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Meteor's latency-compensated distributed data client",
-  version: '2.6.1-rc.0',
+  version: '2.6.1',
   documentation: null
 });
 
diff --git a/packages/ddp-rate-limiter/package.js b/packages/ddp-rate-limiter/package.js
index 06f3991082..c39e26c462 100644
--- a/packages/ddp-rate-limiter/package.js
+++ b/packages/ddp-rate-limiter/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'ddp-rate-limiter',
-  version: '1.1.0-rc.0',
+  version: '1.1.1',
   // Brief, one-line summary of the package.
   summary: 'The DDPRateLimiter allows users to add rate limits to DDP' +
   ' methods and subscriptions.',
diff --git a/packages/ddp/package.js b/packages/ddp/package.js
index 1f33786986..bf92eed179 100644
--- a/packages/ddp/package.js
+++ b/packages/ddp/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Meteor's latency-compensated distributed data framework",
-  version: '1.4.0-rc.0'
+  version: '1.4.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/deprecated/jshint/.versions b/packages/deprecated/jshint/.versions
index e29bb428bd..2560991c2d 100644
--- a/packages/deprecated/jshint/.versions
+++ b/packages/deprecated/jshint/.versions
@@ -5,7 +5,7 @@ base64@1.0.12
 binary-heap@1.0.11
 boilerplate-generator@1.7.1
 callback-hook@1.3.0
-check@1.3.2-rc.0
+check@1.3.2
 ddp@1.4.0
 ddp-client@2.4.1
 ddp-common@1.4.0
@@ -36,14 +36,14 @@ mongo-id@1.0.8
 npm-mongo@3.9.0
 ordered-dict@1.1.0
 promise@0.11.2
-random@1.2.1-rc.0
+random@1.2.1
 react-fast-refresh@0.1.1
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.0
 socket-stream-client@0.3.3
 tinytest@1.1.0
-tracker@1.2.1-rc.0
-underscore@1.0.11-rc.0
+tracker@1.2.1
+underscore@1.0.11
 webapp@1.10.1
 webapp-hashing@1.1.0
diff --git a/packages/diff-sequence/package.js b/packages/diff-sequence/package.js
index 063b7b0fbe..8c63436265 100644
--- a/packages/diff-sequence/package.js
+++ b/packages/diff-sequence/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "An implementation of a diff algorithm on arrays and objects.",
-  version: '1.1.2-rc.0',
+  version: '1.1.2',
   documentation: null
 });
 
diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js
index 18dc04f858..adb2b73436 100644
--- a/packages/ecmascript/package.js
+++ b/packages/ecmascript/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'ecmascript',
-  version: '0.16.3-rc.0',
+  version: '0.16.3',
   summary: 'Compiler plugin that supports ES2015+ in all .js files',
   documentation: 'README.md',
 });
diff --git a/packages/ejson/package.js b/packages/ejson/package.js
index 2a1edd9b94..8003d75acf 100644
--- a/packages/ejson/package.js
+++ b/packages/ejson/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Extended and Extensible JSON library',
-  version: '1.1.3-rc.0'
+  version: '1.1.3'
 });
 
 Package.onUse(function onUse(api) {
diff --git a/packages/email/package.js b/packages/email/package.js
index 6b486b0c40..326bad392a 100644
--- a/packages/email/package.js
+++ b/packages/email/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Send email messages',
-  version: '2.2.1-rc.0',
+  version: '2.2.2',
 });
 
 Npm.depends({
diff --git a/packages/facebook-oauth/package.js b/packages/facebook-oauth/package.js
index 0b74b97cab..5df363643a 100644
--- a/packages/facebook-oauth/package.js
+++ b/packages/facebook-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Facebook OAuth flow",
-  version: '1.11.1-rc.0'
+  version: '1.11.1'
 });
 
 Package.onUse(api => {
diff --git a/packages/facts-ui/package.js b/packages/facts-ui/package.js
index f0ef32f5bf..4a40b24089 100644
--- a/packages/facts-ui/package.js
+++ b/packages/facts-ui/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Display internal app statistics",
-  version: '1.0.1-rc.0'
+  version: '1.0.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/fetch/package.js b/packages/fetch/package.js
index a54555be07..5648235dac 100644
--- a/packages/fetch/package.js
+++ b/packages/fetch/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "fetch",
-  version: '0.1.2-rc.0',
+  version: '0.1.2',
   summary: "Isomorphic modern/legacy/Node polyfill for WHATWG fetch()",
   documentation: "README.md"
 });
diff --git a/packages/geojson-utils/package.js b/packages/geojson-utils/package.js
index 156ba4c54b..4dc3e82de0 100644
--- a/packages/geojson-utils/package.js
+++ b/packages/geojson-utils/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'GeoJSON utility functions (from https://github.com/maxogden/geojson-js-utils)',
-  version: '1.0.11-rc.0'
+  version: '1.0.11'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/hot-module-replacement/package.js b/packages/hot-module-replacement/package.js
index b269173f92..c3f3e3c3af 100644
--- a/packages/hot-module-replacement/package.js
+++ b/packages/hot-module-replacement/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'hot-module-replacement',
-  version: '0.5.1-rc.0',
+  version: '0.5.2',
   summary: 'Update code in development without reloading the page',
   documentation: 'README.md',
   debugOnly: true,
diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js
index 70b5c56a00..b28bbf6643 100644
--- a/packages/meteor-tool/package.js
+++ b/packages/meteor-tool/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'The Meteor command-line tool',
-  version: '2.8.1-rc.0',
+  version: '2.8.1',
 });
 
 Package.includeTool();
diff --git a/packages/meteor/package.js b/packages/meteor/package.js
index 9e63b16844..930478dc07 100644
--- a/packages/meteor/package.js
+++ b/packages/meteor/package.js
@@ -2,7 +2,7 @@
 
 Package.describe({
   summary: "Core Meteor environment",
-  version: '1.10.1-rc.0'
+  version: '1.10.2'
 });
 
 Package.registerBuildPlugin({
diff --git a/packages/modern-browsers/package.js b/packages/modern-browsers/package.js
index 98dc758315..7ca4b6d41c 100644
--- a/packages/modern-browsers/package.js
+++ b/packages/modern-browsers/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'modern-browsers',
-  version: '0.1.8-rc.0',
+  version: '0.1.9',
   summary:
     'API for defining the boundary between modern and legacy ' +
     'JavaScript clients',
diff --git a/packages/modules-runtime-hot/package.js b/packages/modules-runtime-hot/package.js
index b22e874a96..2ba683b96d 100644
--- a/packages/modules-runtime-hot/package.js
+++ b/packages/modules-runtime-hot/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: 'modules-runtime-hot',
-  version: '0.14.1-rc.0',
+  version: '0.14.1',
   summary: 'Patches modules-runtime to support Hot Module Replacement',
   git: 'https://github.com/benjamn/install',
   documentation: 'README.md',
diff --git a/packages/modules-runtime/package.js b/packages/modules-runtime/package.js
index 046d129f60..4e124aaacb 100644
--- a/packages/modules-runtime/package.js
+++ b/packages/modules-runtime/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "modules-runtime",
-  version: '0.13.2-rc.0',
+  version: '0.13.1',
   summary: "CommonJS module system",
   git: "https://github.com/benjamn/install",
   documentation: "README.md"
diff --git a/packages/mongo/package.js b/packages/mongo/package.js
index ba7744a1ca..31ef5d4b77 100644
--- a/packages/mongo/package.js
+++ b/packages/mongo/package.js
@@ -9,7 +9,7 @@
 
 Package.describe({
   summary: "Adaptor for using MongoDB and Minimongo over DDP",
-  version: '1.16.1-rc.0'
+  version: '1.16.1'
 });
 
 Npm.depends({
diff --git a/packages/non-core/less/.versions b/packages/non-core/less/.versions
index fee8b829eb..703024e52f 100644
--- a/packages/non-core/less/.versions
+++ b/packages/non-core/less/.versions
@@ -7,7 +7,7 @@ blaze@2.3.4
 boilerplate-generator@1.7.1
 caching-compiler@1.2.2
 callback-hook@1.3.1
-check@1.3.2-rc.0
+check@1.3.2
 ddp@1.4.0
 ddp-client@2.5.0
 ddp-common@1.4.0
@@ -40,16 +40,16 @@ npm-mongo@3.9.0
 observe-sequence@1.0.19
 ordered-dict@1.1.0
 promise@0.12.0
-random@1.2.1-rc.0
+random@1.2.1
 react-fast-refresh@0.1.1
-reactive-var@1.0.12-rc.0
+reactive-var@1.0.12
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.1
 socket-stream-client@0.4.0
 test-helpers@1.2.0
 tinytest@1.1.1
-tracker@1.2.1-rc.0
-underscore@1.0.11-rc.0
+tracker@1.2.1
+underscore@1.0.11
 webapp@1.11.1
 webapp-hashing@1.1.0
diff --git a/packages/npm-mongo/package.js b/packages/npm-mongo/package.js
index 3f4f649765..63696bf272 100644
--- a/packages/npm-mongo/package.js
+++ b/packages/npm-mongo/package.js
@@ -3,7 +3,7 @@
 
 Package.describe({
   summary: "Wrapper around the mongo npm package",
-  version: '4.11.0-rc.0',
+  version: '4.11.0',
   documentation: null
 });
 
diff --git a/packages/promise/package.js b/packages/promise/package.js
index 8737ce08f7..181ef21b3b 100644
--- a/packages/promise/package.js
+++ b/packages/promise/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "promise",
-  version: "0.12.0-rc.0",
+  version: "0.12.1",
   summary: "ECMAScript 2015 Promise polyfill with Fiber support",
   git: "https://github.com/meteor/promise",
   documentation: "README.md"
diff --git a/packages/random/package.js b/packages/random/package.js
index a2a3d0e582..f6d9b6aae9 100644
--- a/packages/random/package.js
+++ b/packages/random/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Random number generator and utilities',
-  version: '1.2.1-rc.0',
+  version: '1.2.1',
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-dict/package.js b/packages/reactive-dict/package.js
index 1d26e65e19..9fe4681c54 100644
--- a/packages/reactive-dict/package.js
+++ b/packages/reactive-dict/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive dictionary",
-  version: '1.3.0-rc.0'
+  version: '1.3.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/reactive-var/package.js b/packages/reactive-var/package.js
index 13e99f65ff..05d1b1a194 100644
--- a/packages/reactive-var/package.js
+++ b/packages/reactive-var/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Reactive variable",
-  version: '1.0.12-rc.0'
+  version: '1.0.12'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/server-render/package.js b/packages/server-render/package.js
index 628349b6f2..01be2f4b65 100644
--- a/packages/server-render/package.js
+++ b/packages/server-render/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   name: "server-render",
-  version: "0.4.0-rc.0",
+  version: "0.4.1",
   summary: "Generic support for server-side rendering in Meteor apps",
   documentation: "README.md"
 });
diff --git a/packages/service-configuration/package.js b/packages/service-configuration/package.js
index c8e0ec8db1..a3042eb333 100644
--- a/packages/service-configuration/package.js
+++ b/packages/service-configuration/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: 'Manage the configuration for third-party services',
-  version: '1.3.0-rc.0',
+  version: '1.3.1',
 });
 
 Package.onUse(function(api) {
diff --git a/packages/session/package.js b/packages/session/package.js
index f1e006a278..30f5529638 100644
--- a/packages/session/package.js
+++ b/packages/session/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Session variable",
-  version: '1.2.1-rc.0'
+  version: '1.2.1'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/test-in-browser/package.js b/packages/test-in-browser/package.js
index 187a13565a..a090172f76 100644
--- a/packages/test-in-browser/package.js
+++ b/packages/test-in-browser/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Run tests interactively in the browser",
-  version: '1.3.1-rc.0',
+  version: '1.3.1',
   documentation: null
 });
 
diff --git a/packages/tracker/package.js b/packages/tracker/package.js
index c98009b0de..4448d88383 100644
--- a/packages/tracker/package.js
+++ b/packages/tracker/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Dependency tracker to allow reactive callbacks",
-  version: "1.2.1-rc.0"
+  version: "1.2.1"
 });
 
 Package.onUse(function (api) {
diff --git a/packages/twitter-oauth/package.js b/packages/twitter-oauth/package.js
index 187616cefe..6a8bd6793b 100644
--- a/packages/twitter-oauth/package.js
+++ b/packages/twitter-oauth/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Twitter OAuth flow",
-  version: '1.3.1-rc.0'
+  version: '1.3.1'
 });
 
 Package.onUse(function(api) {
diff --git a/packages/underscore/package.js b/packages/underscore/package.js
index 06492153d1..58525754ed 100644
--- a/packages/underscore/package.js
+++ b/packages/underscore/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Collection of small helpers: _.map, _.each, ...",
-  version: '1.0.11-rc.0'
+  version: '1.0.11'
 });
 
 Package.onUse(function (api) {
diff --git a/packages/webapp-hashing/package.js b/packages/webapp-hashing/package.js
index f9ced1e9fb..12e2eac59c 100644
--- a/packages/webapp-hashing/package.js
+++ b/packages/webapp-hashing/package.js
@@ -1,6 +1,6 @@
 Package.describe({
   summary: "Used internally by WebApp. Knows how to hash programs from manifests.",
-  version: '1.1.1-rc.0'
+  version: '1.1.1'
 });
 
 Package.onUse(function(api) {
diff --git a/packages/webapp/package.js b/packages/webapp/package.js
index a9fceaef96..56e920fea2 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.13.1-rc.0',
+  version: '1.13.2',
 });
 
 Npm.depends({
diff --git a/scripts/admin/meteor-release-official.json b/scripts/admin/meteor-release-official.json
index 41230791aa..b49fccf05e 100644
--- a/scripts/admin/meteor-release-official.json
+++ b/scripts/admin/meteor-release-official.json
@@ -1,6 +1,6 @@
 {
   "track": "METEOR",
-  "version": "2.8.0",
+  "version": "2.8.1",
   "recommended": false,
   "official": true,
   "description": "The Official Meteor Distribution"

From 9cd95dc67a746a89f1dd3bc33356c9e8c1595f7d Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Mon, 14 Nov 2022 20:19:08 -0300
Subject: [PATCH 110/114] fix: docs date

---
 docs/history.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/history.md b/docs/history.md
index 25b02c6213..5295d1e9be 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -1,4 +1,4 @@
-## 2.8.1, Unreleased
+## 2.8.1, 2022-11-14
 
 #### Highlights
 

From 7c6c9c1a43746d91b9b8342e11bcf656ce17e666 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Mon, 14 Nov 2022 20:19:25 -0300
Subject: [PATCH 111/114] fix: adjusted docs typo

---
 docs/history.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/history.md b/docs/history.md
index 5295d1e9be..724ece077c 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -8,7 +8,7 @@
 - Add https proxy support to meteor-installer by [heschong](https://github.com/heschong)
 - Fix case insensitive lookup resource overuse by [ToyboxZach](https://github.com/ToyboxZach)
 - Update default Facebook API to v15 and fix local changelog by [StorytellerCZ](https://github.com/StorytellerCZ)
-- Bump to Node v14.21.0 by [StorytellerCZ](https://github.com/StorytellerCZ)
+- Bump to Node v14.21.1 by [StorytellerCZ](https://github.com/StorytellerCZ)
 - Use true mongo binary types by [znewsham](https://github.com/znewsham)
 - Add docs for Accounts.registerLoginHandler by [shivam1646](https://github.com/shivam1646)
 - Updated MongoDB driver to 4.11 by [radekmie](https://github.com/radekmie)

From b6af49e5855f9c820ec1874cc68269eed6330c4f Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Mon, 14 Nov 2022 20:19:39 -0300
Subject: [PATCH 112/114] fix: revert on packages versions

---
 tools/tests/apps/app-config/.meteor/versions           |  4 ++--
 tools/tests/apps/client-refresh/.meteor/versions       |  2 +-
 .../compiler-plugin-static-html-error/.meteor/versions |  6 +++---
 .../apps/compiler-plugin-static-html/.meteor/versions  |  6 +++---
 tools/tests/apps/custom-minifier/.meteor/versions      |  6 +++---
 tools/tests/apps/dynamic-import/.meteor/packages       |  6 +++---
 .../tests/apps/ecmascript-regression/.meteor/packages  |  2 +-
 .../tests/apps/ecmascript-regression/.meteor/versions  | 10 +++++-----
 tools/tests/apps/git-commit-hash/.meteor/versions      |  4 ++--
 .../apps/link-config-npm-package/.meteor/versions      |  4 ++--
 .../apps/linked-external-npm-package/.meteor/versions  |  4 ++--
 tools/tests/apps/meteor-ignore/.meteor/versions        |  4 ++--
 tools/tests/apps/modules/.meteor/packages              |  6 +++---
 tools/tests/apps/standard-app/.meteor/versions         |  6 +++---
 14 files changed, 35 insertions(+), 35 deletions(-)

diff --git a/tools/tests/apps/app-config/.meteor/versions b/tools/tests/apps/app-config/.meteor/versions
index 741cf5b27c..e53282cd8f 100644
--- a/tools/tests/apps/app-config/.meteor/versions
+++ b/tools/tests/apps/app-config/.meteor/versions
@@ -57,8 +57,8 @@ standard-minifier-css@1.4.1
 standard-minifier-js@2.3.2
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1
+underscore@1.0.11
 url@1.2.0
 webapp@1.5.0
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/client-refresh/.meteor/versions b/tools/tests/apps/client-refresh/.meteor/versions
index dfd474adf1..eef8816483 100644
--- a/tools/tests/apps/client-refresh/.meteor/versions
+++ b/tools/tests/apps/client-refresh/.meteor/versions
@@ -7,7 +7,7 @@ boilerplate-generator@1.6.0
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 callback-hook@1.1.0
-check@1.3.2-beta.1
+check@1.3.2
 ddp@1.4.0
 ddp-client@2.3.3
 ddp-common@1.4.0
diff --git a/tools/tests/apps/compiler-plugin-static-html-error/.meteor/versions b/tools/tests/apps/compiler-plugin-static-html-error/.meteor/versions
index c0e1bc65a8..ea9c18baf2 100644
--- a/tools/tests/apps/compiler-plugin-static-html-error/.meteor/versions
+++ b/tools/tests/apps/compiler-plugin-static-html-error/.meteor/versions
@@ -7,7 +7,7 @@ boilerplate-generator@1.6.0
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 callback-hook@1.1.0
-check@1.3.2-beta.1
+check@1.3.2
 ddp@1.4.0
 ddp-client@2.3.3
 ddp-common@1.4.0
@@ -49,7 +49,7 @@ standard-minifier-css@1.5.3
 standard-minifier-js@2.4.1
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1
+underscore@1.0.11
 webapp@1.7.4
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/compiler-plugin-static-html/.meteor/versions b/tools/tests/apps/compiler-plugin-static-html/.meteor/versions
index c0e1bc65a8..ea9c18baf2 100644
--- a/tools/tests/apps/compiler-plugin-static-html/.meteor/versions
+++ b/tools/tests/apps/compiler-plugin-static-html/.meteor/versions
@@ -7,7 +7,7 @@ boilerplate-generator@1.6.0
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 callback-hook@1.1.0
-check@1.3.2-beta.1
+check@1.3.2
 ddp@1.4.0
 ddp-client@2.3.3
 ddp-common@1.4.0
@@ -49,7 +49,7 @@ standard-minifier-css@1.5.3
 standard-minifier-js@2.4.1
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1
+underscore@1.0.11
 webapp@1.7.4
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/custom-minifier/.meteor/versions b/tools/tests/apps/custom-minifier/.meteor/versions
index 6f55d66e80..99e0fc7d2b 100644
--- a/tools/tests/apps/custom-minifier/.meteor/versions
+++ b/tools/tests/apps/custom-minifier/.meteor/versions
@@ -7,7 +7,7 @@ boilerplate-generator@1.6.0
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 callback-hook@1.2.0
-check@1.3.2-beta.1
+check@1.3.2
 custom-minifier@0.0.1
 ddp@1.4.0
 ddp-client@2.3.3
@@ -45,7 +45,7 @@ socket-stream-client@0.2.2
 spacebars-compiler@1.1.3
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1
+underscore@1.0.11
 webapp@1.7.5
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/dynamic-import/.meteor/packages b/tools/tests/apps/dynamic-import/.meteor/packages
index e75977188d..1570f6c394 100644
--- a/tools/tests/apps/dynamic-import/.meteor/packages
+++ b/tools/tests/apps/dynamic-import/.meteor/packages
@@ -8,8 +8,8 @@ meteor-base@1.4.0             # Packages every Meteor app needs to have
 mobile-experience@1.1.0       # Packages for a great mobile UX
 mongo@1.9.0                   # The database Meteor supports right now
 blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views
-reactive-var@1.0.12-beta.1            # Reactive variable for tracker
-tracker@1.2.1-beta.1                 # Meteor's client-side reactive programming library
+reactive-var@1.0.12          # Reactive variable for tracker
+tracker@1.2.1               # Meteor's client-side reactive programming library
 
 standard-minifier-css@1.6.0   # CSS minifier run for production mode
 standard-minifier-js@2.6.0    # JS minifier run for production mode
@@ -23,6 +23,6 @@ dynamic-import@0.5.1
 lazy-test-package
 helper-package
 user:colon-name
-underscore@1.0.11-beta.1
+underscore@1.0.11
 fetch@0.1.1
 jquery
diff --git a/tools/tests/apps/ecmascript-regression/.meteor/packages b/tools/tests/apps/ecmascript-regression/.meteor/packages
index 5dc670f631..59cfdb5807 100644
--- a/tools/tests/apps/ecmascript-regression/.meteor/packages
+++ b/tools/tests/apps/ecmascript-regression/.meteor/packages
@@ -7,7 +7,7 @@
 meteor-base@1.5.1             # Packages every Meteor app needs to have
 mobile-experience@1.1.0       # Packages for a great mobile UX
 mongo@1.13.0                   # The database Meteor supports right now
-reactive-var@1.0.12-beta.1            # Reactive variable for tracker
+reactive-var@1.0.12          # Reactive variable for tracker
 
 standard-minifier-css@1.7.4   # CSS minifier run for production mode
 standard-minifier-js@2.7.0    # JS minifier run for production mode
diff --git a/tools/tests/apps/ecmascript-regression/.meteor/versions b/tools/tests/apps/ecmascript-regression/.meteor/versions
index 697b4d7acc..d5985967e1 100644
--- a/tools/tests/apps/ecmascript-regression/.meteor/versions
+++ b/tools/tests/apps/ecmascript-regression/.meteor/versions
@@ -10,7 +10,7 @@ boilerplate-generator@1.7.1
 caching-compiler@1.2.2
 caching-html-compiler@1.2.1
 callback-hook@1.4.0
-check@1.3.2-beta.1
+check@1.3.2
 ddp@1.4.0
 ddp-client@2.5.0
 ddp-common@1.4.0
@@ -56,10 +56,10 @@ mongo-id@1.0.8
 npm-mongo@3.9.1
 ordered-dict@1.1.0
 promise@0.12.0
-random@1.2.1-beta.1
+random@1.2.1
 react-fast-refresh@0.1.1
 react-meteor-data@2.3.3
-reactive-var@1.0.12-beta.1
+reactive-var@1.0.12
 reload@1.3.1
 retry@1.1.0
 routepolicy@1.1.1
@@ -70,9 +70,9 @@ standard-minifier-css@1.7.4
 standard-minifier-js@2.7.1
 static-html@1.3.2
 templating-tools@1.2.1
-tracker@1.2.1-beta.1
+tracker@1.2.1
 typescript@4.3.5
-underscore@1.0.11-beta.1
+underscore@1.0.11
 url@1.3.2
 webapp@1.12.0
 webapp-hashing@1.1.0
diff --git a/tools/tests/apps/git-commit-hash/.meteor/versions b/tools/tests/apps/git-commit-hash/.meteor/versions
index fb9d3c8a07..91b9af05b0 100644
--- a/tools/tests/apps/git-commit-hash/.meteor/versions
+++ b/tools/tests/apps/git-commit-hash/.meteor/versions
@@ -33,7 +33,7 @@ standard-minifier-css@1.5.2
 standard-minifier-js@2.4.0
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1
+underscore@1.0.11
 webapp@1.7.3-beta181.16
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/link-config-npm-package/.meteor/versions b/tools/tests/apps/link-config-npm-package/.meteor/versions
index 4df92e6329..38888c802f 100644
--- a/tools/tests/apps/link-config-npm-package/.meteor/versions
+++ b/tools/tests/apps/link-config-npm-package/.meteor/versions
@@ -33,7 +33,7 @@ standard-minifier-css@1.4.1
 standard-minifier-js@2.4.0-rc171.6
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1
+underscore@1.0.11
 webapp@1.7.0-rc171.6
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/linked-external-npm-package/.meteor/versions b/tools/tests/apps/linked-external-npm-package/.meteor/versions
index 4df92e6329..38888c802f 100644
--- a/tools/tests/apps/linked-external-npm-package/.meteor/versions
+++ b/tools/tests/apps/linked-external-npm-package/.meteor/versions
@@ -33,7 +33,7 @@ standard-minifier-css@1.4.1
 standard-minifier-js@2.4.0-rc171.6
 static-html@1.2.2
 templating-tools@1.1.2
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1
+underscore@1.0.11
 webapp@1.7.0-rc171.6
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/meteor-ignore/.meteor/versions b/tools/tests/apps/meteor-ignore/.meteor/versions
index d0550519a5..22056f661d 100644
--- a/tools/tests/apps/meteor-ignore/.meteor/versions
+++ b/tools/tests/apps/meteor-ignore/.meteor/versions
@@ -47,7 +47,7 @@ npm-mongo@2.2.30
 ordered-dict@1.0.9
 promise@0.9.0
 random@1.0.10
-reactive-var@1.0.12-beta.1
+reactive-var@1.0.12
 reload@1.1.11
 retry@1.0.9
 routepolicy@1.0.12
@@ -58,7 +58,7 @@ standard-minifier-js@2.1.1
 static-html@1.2.2
 templating-tools@1.1.2
 tracker@1.1.3
-underscore@1.0.11-beta.1
+underscore@1.0.11
 url@1.1.0
 webapp@1.3.19
 webapp-hashing@1.0.9
diff --git a/tools/tests/apps/modules/.meteor/packages b/tools/tests/apps/modules/.meteor/packages
index a8cbf16ab4..f139c0b7a7 100644
--- a/tools/tests/apps/modules/.meteor/packages
+++ b/tools/tests/apps/modules/.meteor/packages
@@ -8,9 +8,9 @@ meteor-base@1.4.0             # Packages every Meteor app needs to have
 mobile-experience@1.1.0       # Packages for a great mobile UX
 mongo@1.9.0                   # The database Meteor supports right now
 blaze-html-templates    # Compile .html files into Meteor Blaze views
-session@1.2.1-beta.1                 # Client-side reactive dictionary for your app
+session@1.2.1               # Client-side reactive dictionary for your app
 jquery                        # Helpful client-side library
-tracker@1.2.1-beta.1                 # Meteor's client-side reactive programming library
+tracker@1.2.1             # Meteor's client-side reactive programming library
 
 es5-shim@4.8.0                # ECMAScript 5 compatibility for older browsers.
 ecmascript@0.14.2              # Enable ECMAScript2015+ syntax in app code
@@ -23,7 +23,7 @@ client-only-ecmascript
 modules-test-plugin
 shell-server@0.5.0
 dynamic-import@0.5.1
-underscore@1.0.11-beta.1
+underscore@1.0.11
 import-local-json-module
 akryum:vue-component
 dummy-compiler
diff --git a/tools/tests/apps/standard-app/.meteor/versions b/tools/tests/apps/standard-app/.meteor/versions
index 563d1ca0f3..521ac34984 100644
--- a/tools/tests/apps/standard-app/.meteor/versions
+++ b/tools/tests/apps/standard-app/.meteor/versions
@@ -6,7 +6,7 @@ base64@1.0.11
 binary-heap@1.0.11
 boilerplate-generator@1.6.0
 callback-hook@1.1.0
-check@1.3.2-beta.1
+check@1.3.2
 ddp@1.4.0
 ddp-client@2.3.3
 ddp-common@1.4.0
@@ -49,7 +49,7 @@ shell-server@0.4.0
 socket-stream-client@0.2.2
 standard-minifier-css@1.5.2
 standard-minifier-js@2.4.0
-tracker@1.2.1-beta.1
-underscore@1.0.11-beta.1
+tracker@1.2.1
+underscore@1.0.11
 webapp@1.7.2
 webapp-hashing@1.0.9

From 59664f9cbc535e0023ebabb02ce27a66aadcf210 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Wed, 16 Nov 2022 09:45:12 -0300
Subject: [PATCH 113/114] chore: bump version in sintaller

---
 npm-packages/meteor-installer/config.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/npm-packages/meteor-installer/config.js b/npm-packages/meteor-installer/config.js
index 9b13c21c20..676cf07665 100644
--- a/npm-packages/meteor-installer/config.js
+++ b/npm-packages/meteor-installer/config.js
@@ -1,7 +1,7 @@
 const path = require('path');
 const os = require('os');
 
-const METEOR_LATEST_VERSION = '2.8.0';
+const METEOR_LATEST_VERSION = '2.8.1';
 const sudoUser = process.env.SUDO_USER || '';
 function isRoot() {
   return process.getuid && process.getuid() === 0;

From 309feef7887c0b06cede1d5c8b9fb6c762a158c3 Mon Sep 17 00:00:00 2001
From: Gabriel Grubba 
Date: Thu, 17 Nov 2022 12:54:36 -0300
Subject: [PATCH 114/114] chore: updated meteor deps

---
 npm-packages/meteor-installer/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/npm-packages/meteor-installer/README.md b/npm-packages/meteor-installer/README.md
index b240fe71b2..0fb3ca6f33 100644
--- a/npm-packages/meteor-installer/README.md
+++ b/npm-packages/meteor-installer/README.md
@@ -14,6 +14,7 @@ npm install -g meteor
 
 | NPM Package | Meteor Official Release |
 |-------------|-------------------------|
+| 2.8.1       | 2.8.1                   |
 | 2.8.0       | 2.8.0                   |
 | 2.7.5       | 2.7.3                   |
 | 2.7.4       | 2.7.3                   |