From 55a6e3e5260161931e09bbb0777fb31fe7c97be3 Mon Sep 17 00:00:00 2001 From: zodern Date: Fri, 17 Mar 2023 14:33:59 -0500 Subject: [PATCH 01/37] Fix testing in puppeteer --- tools/tool-testing/clients/puppeteer/index.js | 25 +++++++++++++++---- tools/tool-testing/sandbox.js | 2 +- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/tools/tool-testing/clients/puppeteer/index.js b/tools/tool-testing/clients/puppeteer/index.js index a01c2af53f..ba0d71f515 100644 --- a/tools/tool-testing/clients/puppeteer/index.js +++ b/tools/tool-testing/clients/puppeteer/index.js @@ -10,21 +10,33 @@ export default class PuppeteerClient extends Client { constructor(options) { super(options); - enterJob( + this.name = 'Puppeteer'; + this.initialized = false; + } + + async init () { + await enterJob( { title: 'Installing Puppeteer in Meteor tool' }, () => { - ensureDependencies(NPM_DEPENDENCIES); + return ensureDependencies(NPM_DEPENDENCIES); } ); this.npmPackageExports = require('puppeteer'); + this.initialized = true; + } - this.name = 'Puppeteer'; + _checkInitialized() { + if (!this.initialized) { + throw new Error('PuppeteerClient not initialized'); + } } async connect() { + this._checkInitialized(); + // Note for Travis and CircleCI to run sandbox must be turned off. // From a security perspective this is not ideal, in the future would be worthwhile // to configure to include only for CI based setups @@ -41,7 +53,10 @@ export default class PuppeteerClient extends Client { this.browser = null; } - static pushClients(clients, appConfig) { - clients.push(new PuppeteerClient(appConfig)); + static async pushClients(clients, appConfig) { + let client = new PuppeteerClient(appConfig); + await client.init(); + + clients.push(client); } } diff --git a/tools/tool-testing/sandbox.js b/tools/tool-testing/sandbox.js index 2a1b8efa3d..86e012c5a8 100644 --- a/tools/tool-testing/sandbox.js +++ b/tools/tool-testing/sandbox.js @@ -136,7 +136,7 @@ export default class Sandbox { } if (clientOptions.puppeteer) { - PuppeteerClient.pushClients(this.clients, appConfig); + await PuppeteerClient.pushClients(this.clients, appConfig); } if (clientOptions.browserstack && BrowserStackClient.prerequisitesMet()) { From 488162498caea956b81069e568b3a23f54bd964a Mon Sep 17 00:00:00 2001 From: zodern Date: Fri, 17 Mar 2023 14:34:14 -0500 Subject: [PATCH 02/37] Fix waiting for prepare-app to finish --- tools/tool-testing/sandbox.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/tool-testing/sandbox.js b/tools/tool-testing/sandbox.js index 86e012c5a8..73515313b8 100644 --- a/tools/tool-testing/sandbox.js +++ b/tools/tool-testing/sandbox.js @@ -212,14 +212,14 @@ export default class Sandbox { // Prepare the app (ie, build or download packages). We give this a nice // long timeout, which allows the next command to not need a bloated // timeout. (meteor create does this anyway.) - this.cd(to, () => { + await this.cd(to, async () => { const run = this.run("--prepare-app"); // XXX Can we cache the output of running this once somewhere, so that // multiple calls to createApp with the same template get the same cache? // This is a little tricky because isopack-buildinfo.json uses absolute // paths. run.waitSecs(120); - run.expectExit(0); + await run.expectExit(0); }); } From f3f84196dfcbc35d907ae34821ff9e2cef4c0970 Mon Sep 17 00:00:00 2001 From: zodern Date: Fri, 17 Mar 2023 15:20:10 -0500 Subject: [PATCH 03/37] Use a version of jshint in tests that is compatible with Meteor 3 --- tools/tests/apps/linting-app/packages/my-package/.versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tests/apps/linting-app/packages/my-package/.versions b/tools/tests/apps/linting-app/packages/my-package/.versions index 4d5b302742..586f1ff70a 100644 --- a/tools/tests/apps/linting-app/packages/my-package/.versions +++ b/tools/tests/apps/linting-app/packages/my-package/.versions @@ -1,4 +1,4 @@ -jshint@0.0.1 +jshint@1.1.8 linter-plugin@1.0.0 meteor@1.1.6 my-package@0.0.0 From 7383717db05618d83d6dff9d3bab16d97b70a029 Mon Sep 17 00:00:00 2001 From: zodern Date: Fri, 17 Mar 2023 19:32:16 -0500 Subject: [PATCH 04/37] Fix creating self test catalog --- tools/tool-testing/sandbox.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/tool-testing/sandbox.js b/tools/tool-testing/sandbox.js index 73515313b8..e8ea8431c5 100644 --- a/tools/tool-testing/sandbox.js +++ b/tools/tool-testing/sandbox.js @@ -516,7 +516,7 @@ async function setUpBuiltPackageTropohouse() { } const tropohouse = new Tropohouse(builtPackageTropohouseDir); - tropohouseLocalCatalog = newSelfTestCatalog(); + tropohouseLocalCatalog = await newSelfTestCatalog(); const versions = {}; for (const packageName of tropohouseLocalCatalog.getAllNonTestPackageNames()) { versions[packageName] = @@ -585,16 +585,16 @@ const ROOT_PACKAGES_TO_BUILD_IN_SANDBOX = [ "typescript", ]; -function newSelfTestCatalog() { +async function newSelfTestCatalog() { if (! files.inCheckout()) { throw Error("Only can build packages from a checkout"); } const catalogLocal = require('../packaging/catalog/catalog-local.js'); const selfTestCatalog = new catalogLocal.LocalCatalog; - const messages = capture( + const messages = await capture( { title: "scanning local core packages" }, - () => { + async () => { const packagesDir = files.pathJoin(files.getCurrentToolsDir(), 'packages'); @@ -603,7 +603,7 @@ function newSelfTestCatalog() { // packages. One side effect of this: we really really expect them to all // build, and we're fine with dying if they don't (there's no worries // about needing to springboard). - selfTestCatalog.initialize({ + await selfTestCatalog.initialize({ localPackageSearchDirs: [ packagesDir, files.pathJoin(packagesDir, "non-core"), From fe34245f58012eb9a467e04d9f1c6949c74f493d Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 17:41:06 -0300 Subject: [PATCH 05/37] updated the checkings for cursor --- packages/minimongo/cursor.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/minimongo/cursor.js b/packages/minimongo/cursor.js index 12ede3aa69..d811538271 100644 --- a/packages/minimongo/cursor.js +++ b/packages/minimongo/cursor.js @@ -363,8 +363,12 @@ export default class Cursor { // before we leave the observe. const isReadyPromise = this.collection._observeQueue.drain(); - if (Meteor.isClient) handle.isReady = true; - else isReadyPromise.then(() => (handle.isReady = true)); + if ( + Meteor.isClient || + this.collection.constructor.name === 'LocalCollection' // Unamed collections + ) { + handle.isReady = true; + } else isReadyPromise.then(() => (handle.isReady = true)); handle.isReadyPromise = Meteor.isClient ? Promise.resolve() From 82a51c23462c4af50033e809a15785c97775f33f Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 17:41:27 -0300 Subject: [PATCH 06/37] updated validation for suppressed --- packages/minimongo/local_collection.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/minimongo/local_collection.js b/packages/minimongo/local_collection.js index 47e6a9647d..6cd412fd68 100644 --- a/packages/minimongo/local_collection.js +++ b/packages/minimongo/local_collection.js @@ -1651,11 +1651,11 @@ LocalCollection._observeFromObserveChanges = (cursor, observeCallbacks) => { { nonMutatingCallbacks: true }); // If needed, re-enable callbacks as soon as the initial batch is ready. - if (suppressed) { + if (Meteor.isServer && suppressed) { handle.isReadyPromise.then(() => { suppressed = false; }); - } + } else suppressed = false; return handle; }; From 6c5d5e74c6c9dfd8811c9569fc465b515416489a Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 17:41:38 -0300 Subject: [PATCH 07/37] added test for suppress --- packages/minimongo/minimongo_tests_client.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/minimongo/minimongo_tests_client.js b/packages/minimongo/minimongo_tests_client.js index cf7135c0b2..c5bb399676 100644 --- a/packages/minimongo/minimongo_tests_client.js +++ b/packages/minimongo/minimongo_tests_client.js @@ -3781,10 +3781,10 @@ Tinytest.add('minimongo - fetch in observe', test => { const coll = new LocalCollection; let callbackInvoked = false; const observe = coll.find().observeChanges({ - async added(id, fields) { + added(id, fields) { callbackInvoked = true; test.equal(fields, { foo: 1 }); - const doc = await coll.findOne({ foo: 1 }); + const doc = coll.findOne({ foo: 1 }); test.isTrue(doc); test.equal(doc.foo, 1); }, @@ -3800,6 +3800,22 @@ Tinytest.add('minimongo - fetch in observe', test => { computation.stop(); }); +Tinytest.add("minimongo - supress_initial option", (test) => { + const coll = new LocalCollection(); + let runs = 0; + + Tracker.autorun(() => { + coll.find({}).observe( + { _suppress_initial: true }, + { } + ); + runs += 1; + }); + coll.insert({}); + test.equal(runs, 2); +}); + + // See #2254 Tinytest.add('minimongo - fine-grained reactivity of observe with fields projection', test => { const X = new LocalCollection; From 5106dbd010a0e9cd564be3ccca3368fe4c4be393 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 17:52:59 -0300 Subject: [PATCH 08/37] updated eslint --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fd16128033..6a77006ddf 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "no-console": "off", "camelcase": "warn", "consistent-return": "off", - "quotes": "warn", + "quotes": ["error", "single", { "allowTemplateLiterals": true }], "no-shadow": [ "error", { From 70071e0ac195e6e94d9945cf17fea0f2ec4007b0 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 17:53:12 -0300 Subject: [PATCH 09/37] updated eslint --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6a77006ddf..35c08a799b 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "no-console": "off", "camelcase": "warn", "consistent-return": "off", - "quotes": ["error", "single", { "allowTemplateLiterals": true }], + "quotes": ["warn", "single", { "allowTemplateLiterals": true }], "no-shadow": [ "error", { From 09b3a06eac1366129e3c83a7e94c48a9c04d0afe Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 17:53:27 -0300 Subject: [PATCH 10/37] addresssing comments for cursos --- packages/minimongo/cursor.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/minimongo/cursor.js b/packages/minimongo/cursor.js index d811538271..5952c5fe8e 100644 --- a/packages/minimongo/cursor.js +++ b/packages/minimongo/cursor.js @@ -363,12 +363,11 @@ export default class Cursor { // before we leave the observe. const isReadyPromise = this.collection._observeQueue.drain(); - if ( - Meteor.isClient || - this.collection.constructor.name === 'LocalCollection' // Unamed collections - ) { - handle.isReady = true; - } else isReadyPromise.then(() => (handle.isReady = true)); + const isLocalCollection = + Meteor.isClient || this.collection.constructor.name === 'LocalCollection'; // Unamed collections + + if (isLocalCollection) handle.isReady = true; + else isReadyPromise.then(() => (handle.isReady = true)); handle.isReadyPromise = Meteor.isClient ? Promise.resolve() From 676a6254e3c6a26abd1a5aae908bd0f1eadf196a Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 17:53:39 -0300 Subject: [PATCH 11/37] adressing comments for local_collection --- packages/minimongo/local_collection.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/minimongo/local_collection.js b/packages/minimongo/local_collection.js index 6cd412fd68..d66fbea93b 100644 --- a/packages/minimongo/local_collection.js +++ b/packages/minimongo/local_collection.js @@ -1651,11 +1651,8 @@ LocalCollection._observeFromObserveChanges = (cursor, observeCallbacks) => { { nonMutatingCallbacks: true }); // If needed, re-enable callbacks as soon as the initial batch is ready. - if (Meteor.isServer && suppressed) { - handle.isReadyPromise.then(() => { - suppressed = false; - }); - } else suppressed = false; + if (handle.isReady) suppressed = false; + else handle.isReadyPromise.then(() => (suppressed = false)); return handle; }; From 2f056d9cf690b4c782ed12fb6c4523bfa9b1f37f Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 17:59:33 -0300 Subject: [PATCH 12/37] Revert "adressing comments for local_collection" This reverts commit 676a6254e3c6a26abd1a5aae908bd0f1eadf196a. --- packages/minimongo/local_collection.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/minimongo/local_collection.js b/packages/minimongo/local_collection.js index d66fbea93b..6cd412fd68 100644 --- a/packages/minimongo/local_collection.js +++ b/packages/minimongo/local_collection.js @@ -1651,8 +1651,11 @@ LocalCollection._observeFromObserveChanges = (cursor, observeCallbacks) => { { nonMutatingCallbacks: true }); // If needed, re-enable callbacks as soon as the initial batch is ready. - if (handle.isReady) suppressed = false; - else handle.isReadyPromise.then(() => (suppressed = false)); + if (Meteor.isServer && suppressed) { + handle.isReadyPromise.then(() => { + suppressed = false; + }); + } else suppressed = false; return handle; }; From 363d9ef97c71205941990cd65ce028c566f105d3 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 18:05:43 -0300 Subject: [PATCH 13/37] Revert "Revert "adressing comments for local_collection"" This reverts commit 2f056d9cf690b4c782ed12fb6c4523bfa9b1f37f. --- packages/minimongo/local_collection.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/minimongo/local_collection.js b/packages/minimongo/local_collection.js index 6cd412fd68..d66fbea93b 100644 --- a/packages/minimongo/local_collection.js +++ b/packages/minimongo/local_collection.js @@ -1651,11 +1651,8 @@ LocalCollection._observeFromObserveChanges = (cursor, observeCallbacks) => { { nonMutatingCallbacks: true }); // If needed, re-enable callbacks as soon as the initial batch is ready. - if (Meteor.isServer && suppressed) { - handle.isReadyPromise.then(() => { - suppressed = false; - }); - } else suppressed = false; + if (handle.isReady) suppressed = false; + else handle.isReadyPromise.then(() => (suppressed = false)); return handle; }; From 757541528069fd9d3ec2bf15bb9f282b70c48fcd Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 18:06:31 -0300 Subject: [PATCH 14/37] tests: updating tests for reactivity --- packages/minimongo/minimongo_tests_client.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/minimongo/minimongo_tests_client.js b/packages/minimongo/minimongo_tests_client.js index c5bb399676..abee7ad4c6 100644 --- a/packages/minimongo/minimongo_tests_client.js +++ b/packages/minimongo/minimongo_tests_client.js @@ -3800,18 +3800,18 @@ Tinytest.add('minimongo - fetch in observe', test => { computation.stop(); }); -Tinytest.add("minimongo - supress_initial option", (test) => { +Tinytest.add("minimongo - simple reactivity", (test) => { const coll = new LocalCollection(); let runs = 0; Tracker.autorun(() => { - coll.find({}).observe( - { _suppress_initial: true }, - { } - ); runs += 1; + coll.find().fetch() }); - coll.insert({}); + + coll.insert({ _id: "test" }); + Tracker.flush(); + // runs should now be 2 test.equal(runs, 2); }); From 3dfee22ca8bf5b0047a90b1cec6465e7cb767200 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 27 Mar 2023 18:10:52 -0300 Subject: [PATCH 15/37] added changelog about minimongo --- docs/generators/changelog/versions/3.0.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/generators/changelog/versions/3.0.md b/docs/generators/changelog/versions/3.0.md index bb49d4dfa6..aa9e0275f3 100644 --- a/docs/generators/changelog/versions/3.0.md +++ b/docs/generators/changelog/versions/3.0.md @@ -83,6 +83,14 @@ * `minifier-css`: - `minifyCss` is now async. +* `minimongo@get-version`: + TODO: add this aswell to the minimongo docs + - `cursor.observe` now returns `isReady` and `isReadyPromise` wich indicates + if the cursor is ready and if the callbacks are have been called. + If you only use it in the `Client` or as a `LocalCollection` things have not + changed. + + * `webapp`: - `WebAppInternals.getBoilerplate` is now async. - Changed engine from connect to express and changed api naming to match express. See below: From b963764c9f3240cedee147d06a4a5508b52149ce Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Tue, 28 Mar 2023 10:00:24 -0300 Subject: [PATCH 16/37] updated how handle is dealt --- packages/minimongo/cursor.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/minimongo/cursor.js b/packages/minimongo/cursor.js index 5952c5fe8e..321f4afc7b 100644 --- a/packages/minimongo/cursor.js +++ b/packages/minimongo/cursor.js @@ -361,17 +361,15 @@ export default class Cursor { // run the observe callbacks resulting from the initial contents // before we leave the observe. - const isReadyPromise = this.collection._observeQueue.drain(); + const drainResult = this.collection._observeQueue.drain(); - const isLocalCollection = - Meteor.isClient || this.collection.constructor.name === 'LocalCollection'; // Unamed collections - - if (isLocalCollection) handle.isReady = true; - else isReadyPromise.then(() => (handle.isReady = true)); - - handle.isReadyPromise = Meteor.isClient - ? Promise.resolve() - : isReadyPromise; + if (drainResult instanceof Promise) { + handle.isReadyPromise = drainResult; + drainResult.then(() => (handle.isReady = true)); + } else { + handle.isReady = true; + handle.isReadyPromise = Promise.resolve(); + } return handle; } From e88b84093ee7a27a82e90e897fc5eaeaffdd0ecd Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Tue, 28 Mar 2023 10:00:44 -0300 Subject: [PATCH 17/37] turned forEachAsync into forEach --- packages/minimongo/cursor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/minimongo/cursor.js b/packages/minimongo/cursor.js index 321f4afc7b..eedb89988d 100644 --- a/packages/minimongo/cursor.js +++ b/packages/minimongo/cursor.js @@ -333,7 +333,7 @@ export default class Cursor { } // it means it's an id map if (query.results?.size?.()) { - query.results.forEachAsync(handler); + query.results.forEach(handler); } } From 56a83bd73636d8aa6491d77b2d1848919e543e4d Mon Sep 17 00:00:00 2001 From: filipenevola Date: Tue, 28 Mar 2023 09:52:13 -0400 Subject: [PATCH 18/37] Updates 3.0.md temp readme with more async methods and changes --- docs/generators/changelog/versions/3.0.md | 209 ++++++++++++---------- 1 file changed, 117 insertions(+), 92 deletions(-) diff --git a/docs/generators/changelog/versions/3.0.md b/docs/generators/changelog/versions/3.0.md index bb49d4dfa6..4bf2a0c9ae 100644 --- a/docs/generators/changelog/versions/3.0.md +++ b/docs/generators/changelog/versions/3.0.md @@ -1,125 +1,150 @@ - - ## v3.0, TBD ### Highlights #### Breaking Changes -* `webapp`: - - These methods are now async: - - `WebAppInternals.reloadClientPrograms()` - - `WebAppInternals.pauseClient()` - - `WebAppInternals.generateClientProgram()` - - `WebAppInternals.generateBoilerplate()` - - `WebAppInternals.setInlineScriptsAllowed()` - - `WebAppInternals.enableSubresourceIntegrity()` - - `WebAppInternals.setBundledJsCssUrlRewriteHook()` - - `WebAppInternals.setBundledJsCssPrefix()` +- `webapp`: -* `email`: - - `Email.send` is no longer available. Use `Email.sendAsync` instead. + - These methods are now async: + - `WebAppInternals.reloadClientPrograms()` + - `WebAppInternals.pauseClient()` + - `WebAppInternals.generateClientProgram()` + - `WebAppInternals.generateBoilerplate()` + - `WebAppInternals.setInlineScriptsAllowed()` + - `WebAppInternals.enableSubresourceIntegrity()` + - `WebAppInternals.setBundledJsCssUrlRewriteHook()` + - `WebAppInternals.setBundledJsCssPrefix()` -* `accounts-2fa`: - - Some methods are now async. See below: - - `Accounts._is2faEnabledForUser` - - `(Meteor Method) - generate2faActivationQrCode` - - `(Meteor Method) - enableUser2fa` - - `(Meteor Method) - disableUser2fa` - - `(Meteor Method) - has2faEnabled` +- `email`: -* `accounts-base`: - **TODO** - - `methods.removeOtherTokens` is now async - - `Accounts.destroyToken` is now async + - `Email.send` is no longer available. Use `Email.sendAsync` instead. -* `accounts-password`: - - Some server methods are now async: - - `Accounts.sendResetPasswordEmail` - - `Accounts.sendEnrollmentEmail` - - `Accounts.sendVerificationEmail` - - `Accounts.addEmail` - - `Accounts.removeEmail` - - `Accounts.verifyEmail` - - `Accounts.createUserVerifyingEmail` - - `Accounts.createUser` - - `Accounts.generateVerificationToken` - - `Accounts.generateResetToken` - - `Accounts.forgotPassword` - - `Accounts.setPassword` - - `Accounts.changePassword` - - `Accounts.setUsername` - - `Accounts.findUserByEmail` - - `Accounts.findUserByUsername` +- `accounts-2fa`: -* `accounts-passwordless`: - - `Accounts.sendLoginTokenEmail` is now async + - Some methods are now async. See below: + - `Accounts._is2faEnabledForUser` + - `(Meteor Method) - generate2faActivationQrCode` + - `(Meteor Method) - enableUser2fa` + - `(Meteor Method) - disableUser2fa` + - `(Meteor Method) - has2faEnabled` -* `boilerplate-generator`: - - `toHTML` is no longer available (it was already deprecated). Use `toHTMLStream` instead. +- `accounts-base`: -* `ddp`: -- Added method `Meteor.isAsyncCall` that can be used to check if the current method call is async or not. + - `methods.removeOtherTokens` is now async + - `Accounts.destroyToken` is now async -* `oauth`: - - `_endOfPopupResponseTemplate` and `_endOfRedirectResponseTemplate` are no longer a property but now a function that returns a promise of the same value as before - - the following server methods are now async: - - `OAuth._renderOauthResults` - - `OAuth._endOfLoginResponse` - - `OAuth.renderEndOfLoginResponse` - - `OAuth._storePendingCredential` - - `OAuth._retrievePendingCredential` - - `ensureConfigured` - - `_cleanStaleResults` +- `accounts-password`: -* `oauth1`: - - the following server methods are now async: - - `OAuth._storeRequestToken` - - `OAuth._retrieveRequestToken` + - Some server methods are now async: + - `Accounts.sendResetPasswordEmail` + - `Accounts.sendEnrollmentEmail` + - `Accounts.sendVerificationEmail` + - `Accounts.addEmail` + - `Accounts.removeEmail` + - `Accounts.verifyEmail` + - `Accounts.createUserVerifyingEmail` + - `Accounts.createUser` + - `Accounts.generateVerificationToken` + - `Accounts.generateResetToken` + - `Accounts.forgotPassword` + - `Accounts.setPassword` + - `Accounts.changePassword` + - `Accounts.setUsername` + - `Accounts.findUserByEmail` + - `Accounts.findUserByUsername` -* `oauth2`: - - `OAuth._requestHandlers['2']` is now async. +- `accounts-passwordless`: -* `minifier-css`: - - `minifyCss` is now async. + - `Accounts.sendLoginTokenEmail` is now async -* `webapp`: - - `WebAppInternals.getBoilerplate` is now async. - - Changed engine from connect to express and changed api naming to match express. See below: - - `WebApp.connectHandlers.use(middleware)` is now `WebApp.expressHandlers.use(middleware)` - - `WebApp.rawConnectHandlers.use(middleware)` is now `WebApp.rawExpressHandlers.use(middleware)` - - `WebApp.connectApp` is now `WebApp.expressApp` +- `boilerplate-generator`: -#### Internal API changes + - `toHTML` is no longer available (it was already deprecated). Use `toHTMLStream` instead. +- `ddp`: -#### Migration Steps + - Added method `Meteor.isAsyncCall` that can be used to check if the current method call is async or not. -You can follow in [here](https://guide.meteor.com/3.0-migration.html). +- `oauth`: -#### Meteor Version Release + - `_endOfPopupResponseTemplate` and `_endOfRedirectResponseTemplate` are no longer a property but now a function that returns a promise of the same value as before + - the following server methods are now async: + - `OAuth._renderOauthResults` + - `OAuth._endOfLoginResponse` + - `OAuth.renderEndOfLoginResponse` + - `OAuth._storePendingCredential` + - `OAuth._retrievePendingCredential` + - `ensureConfigured` + - `_cleanStaleResults` -#### Special thanks to +- `oauth1`: -For making this great framework even better!ifier-css`: -- `minifyCss` is now async. + - the following server methods are now async: + - `OAuth._storeRequestToken` + - `OAuth._retrieveRequestToken` -* `webapp`: - - `WebAppInternals.getBoilerplate` is now async. - - Changed engine from connect to express and changed api naming to match express. See below: - - `WebApp.connectHandlers.use(middleware)` is now `WebApp.expressHandlers.use(middleware)` - - `WebApp.rawConnectHandlers.use(middleware)` is now `WebApp.rawExpressHandlers.use(middleware)` - - `WebApp.connectApp` is now `WebApp.expressApp` +- `oauth2`: -#### Internal API changes + - `OAuth._requestHandlers['2']` is now async. +- `minifier-css`: -#### Migration Steps + - `minifyCss` is now async. -You can follow in [here](https://guide.meteor.com/3.0-migration.html). +- `webapp`: + - `WebAppInternals.getBoilerplate` is now async. + - Changed engine from connect to express and changed api naming to match express. See below: + - `WebApp.connectHandlers.use(middleware)` is now `WebApp.expressHandlers.use(middleware)` + - `WebApp.rawConnectHandlers.use(middleware)` is now `WebApp.rawExpressHandlers.use(middleware)` + - `WebApp.connectApp` is now `WebApp.expressApp` -#### Meteor Version Release +#### New Public API -#### Special thanks to +- `accounts-base`: (2.9+) + - `Meteor.userAsync()` -For making this great framework even better! +- `callback-hook`:forEachAsync + - `forEachAsync` + +- `ddp-server`: (2.8+) + - `Meteor.callAsync()` + +- `minifier-css`: (2.9+) + - `CssTools.minifyCssAsync()` + +- `mongo`: + + - `Mongo.Collection`: (2.8+) + - `createCappedCollectionAsync` + - `createIndexAsync` + - `dropCollectionAsync` + - `dropIndexAsync` + - `findOneAsync` + - `insertAsync` + - `removeAsync` + - `updateAsync` + - `upsertAsync` + - `Collection.Cursor`: (2.8+) + - `countAsync` + - `fetchAsync` + - `forEachAsync` + - `mapAsync` + - `[Symbol.asyncIterator]` so this code should work: + ```js + for await (const document of collection.find(query, options)) /* ... */ + ``` + +#### Internal API changes + +`accounts-base`: + +- `_attemptLogin` +- `_loginMethod` +- `_runLoginHandlers` + +#### New Internal API + +`accounts-password`: + +- `Accounts._checkPasswordAsync` From ad9da6e70af18999243b73c584debe5c7c0d3aea Mon Sep 17 00:00:00 2001 From: zodern Date: Thu, 30 Mar 2023 15:36:40 -0500 Subject: [PATCH 19/37] Add top level await tests --- npm-packages/meteor-babel/package.json | 2 +- .../modules/.npm/package/npm-shrinkwrap.json | 2 +- packages/modules/package.js | 2 +- .../top-level-await-order/.meteor/.gitignore | 1 + .../top-level-await-order/.meteor/packages | 16 ++++ .../top-level-await-order/.meteor/release | 1 + tools/tests/apps/top-level-await-order/a.js | 7 ++ tools/tests/apps/top-level-await-order/b.js | 7 ++ .../tests/apps/top-level-await-order/main.js | 18 +++++ .../top-level-await-order/package-lock.json | 20 +++++ .../apps/top-level-await-order/package.json | 19 +++++ .../packages/build-plugin/package.js | 19 +++++ .../build-plugin/plugin-without-meteor.js | 1 + .../packages/build-plugin/plugin.js | 7 ++ .../packages/lazy-package/main.js | 4 + .../packages/lazy-package/package.js | 4 + .../packages/package-1/a.js | 6 ++ .../packages/package-1/b.js | 6 ++ .../packages/package-1/package.js | 5 ++ .../packages/package-2/a.js | 10 +++ .../packages/package-2/b.js | 4 + .../packages/package-2/package.js | 4 + .../packages/print/client.js | 14 ++++ .../packages/print/package.js | 6 ++ .../packages/print/server.js | 8 ++ .../packages/sync-package/package.js | 4 + .../packages/sync-package/sync.js | 4 + tools/tests/top-level-await.js | 73 +++++++++++++++++++ 28 files changed, 271 insertions(+), 3 deletions(-) create mode 100644 tools/tests/apps/top-level-await-order/.meteor/.gitignore create mode 100644 tools/tests/apps/top-level-await-order/.meteor/packages create mode 100644 tools/tests/apps/top-level-await-order/.meteor/release create mode 100644 tools/tests/apps/top-level-await-order/a.js create mode 100644 tools/tests/apps/top-level-await-order/b.js create mode 100644 tools/tests/apps/top-level-await-order/main.js create mode 100644 tools/tests/apps/top-level-await-order/package-lock.json create mode 100644 tools/tests/apps/top-level-await-order/package.json create mode 100644 tools/tests/apps/top-level-await-order/packages/build-plugin/package.js create mode 100644 tools/tests/apps/top-level-await-order/packages/build-plugin/plugin-without-meteor.js create mode 100644 tools/tests/apps/top-level-await-order/packages/build-plugin/plugin.js create mode 100644 tools/tests/apps/top-level-await-order/packages/lazy-package/main.js create mode 100644 tools/tests/apps/top-level-await-order/packages/lazy-package/package.js create mode 100644 tools/tests/apps/top-level-await-order/packages/package-1/a.js create mode 100644 tools/tests/apps/top-level-await-order/packages/package-1/b.js create mode 100644 tools/tests/apps/top-level-await-order/packages/package-1/package.js create mode 100644 tools/tests/apps/top-level-await-order/packages/package-2/a.js create mode 100644 tools/tests/apps/top-level-await-order/packages/package-2/b.js create mode 100644 tools/tests/apps/top-level-await-order/packages/package-2/package.js create mode 100644 tools/tests/apps/top-level-await-order/packages/print/client.js create mode 100644 tools/tests/apps/top-level-await-order/packages/print/package.js create mode 100644 tools/tests/apps/top-level-await-order/packages/print/server.js create mode 100644 tools/tests/apps/top-level-await-order/packages/sync-package/package.js create mode 100644 tools/tests/apps/top-level-await-order/packages/sync-package/sync.js create mode 100644 tools/tests/top-level-await.js diff --git a/npm-packages/meteor-babel/package.json b/npm-packages/meteor-babel/package.json index a51fb51c0b..1eb19d3b16 100644 --- a/npm-packages/meteor-babel/package.json +++ b/npm-packages/meteor-babel/package.json @@ -41,7 +41,7 @@ "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.0", "@babel/types": "^7.17.0", - "@meteorjs/reify": "https://github.com/meteor/reify/tarball/ee36898798645097948258eb9106dd0af60cec64", + "@meteorjs/reify": "https://github.com/meteor/reify/tarball/78134aa90d8a17ddf6848c0964080f1e0afd1e08", "babel-preset-meteor": "^7.10.0", "babel-preset-minify": "^0.5.1", "convert-source-map": "^1.6.0", diff --git a/packages/modules/.npm/package/npm-shrinkwrap.json b/packages/modules/.npm/package/npm-shrinkwrap.json index 24bd280e74..76b8819d98 100644 --- a/packages/modules/.npm/package/npm-shrinkwrap.json +++ b/packages/modules/.npm/package/npm-shrinkwrap.json @@ -2,7 +2,7 @@ "lockfileVersion": 1, "dependencies": { "@meteorjs/reify": { - "version": "git+https://github.com/meteor/reify.git#ee36898798645097948258eb9106dd0af60cec64" + "version": "git+https://github.com/meteor/reify.git#78134aa90d8a17ddf6848c0964080f1e0afd1e08" }, "@types/estree": { "version": "1.0.0", diff --git a/packages/modules/package.js b/packages/modules/package.js index 56d7abbeec..157640a3ed 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -6,7 +6,7 @@ Package.describe({ }); Npm.depends({ - "@meteorjs/reify": "git+https://github.com/meteor/reify.git#ee36898798645097948258eb9106dd0af60cec64", + "@meteorjs/reify": "git+https://github.com/meteor/reify.git#78134aa90d8a17ddf6848c0964080f1e0afd1e08", "meteor-babel-helpers": "0.0.3", }); diff --git a/tools/tests/apps/top-level-await-order/.meteor/.gitignore b/tools/tests/apps/top-level-await-order/.meteor/.gitignore new file mode 100644 index 0000000000..4083037423 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/.meteor/.gitignore @@ -0,0 +1 @@ +local diff --git a/tools/tests/apps/top-level-await-order/.meteor/packages b/tools/tests/apps/top-level-await-order/.meteor/packages new file mode 100644 index 0000000000..d464d9bcce --- /dev/null +++ b/tools/tests/apps/top-level-await-order/.meteor/packages @@ -0,0 +1,16 @@ +# Meteor packages used by this project, one per line. +# Check this file (and the other files in this directory) into your repository. +# +# 'meteor add' and 'meteor remove' will edit this file for you, +# but you can also edit it by hand. +print +meteor-base # Packages every Meteor app needs to have + +ecmascript # Enable ECMAScript2015+ syntax in app code +build-plugin +webapp +sync-package +package-1 +package-2 +lazy-package +standard-minifier-js diff --git a/tools/tests/apps/top-level-await-order/.meteor/release b/tools/tests/apps/top-level-await-order/.meteor/release new file mode 100644 index 0000000000..621e94f0ec --- /dev/null +++ b/tools/tests/apps/top-level-await-order/.meteor/release @@ -0,0 +1 @@ +none diff --git a/tools/tests/apps/top-level-await-order/a.js b/tools/tests/apps/top-level-await-order/a.js new file mode 100644 index 0000000000..e4280581c0 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/a.js @@ -0,0 +1,7 @@ +console.log('app a.js - before'); +await 0 +console.log('app a.js - after'); + +Promise.resolve().then(() => { + console.log('app a.js - later'); +}); diff --git a/tools/tests/apps/top-level-await-order/b.js b/tools/tests/apps/top-level-await-order/b.js new file mode 100644 index 0000000000..4fee51e67f --- /dev/null +++ b/tools/tests/apps/top-level-await-order/b.js @@ -0,0 +1,7 @@ +console.log('app b.js - before'); +await 0 +console.log('app b.js - after'); + +Promise.resolve().then(() => { + console.log('app b.js - later'); +}); diff --git a/tools/tests/apps/top-level-await-order/main.js b/tools/tests/apps/top-level-await-order/main.js new file mode 100644 index 0000000000..02a21c741a --- /dev/null +++ b/tools/tests/apps/top-level-await-order/main.js @@ -0,0 +1,18 @@ +import './a.js'; +import './b.js'; + +Meteor.startup(() => { + console.log('entry - startup'); +}); + +console.log('entry - before'); +await 0 +console.log('entry - after'); + +Promise.resolve().then(() => console.log('entry - later')); + +require('meteor/lazy-package').then(({ value }) => { + console.log(`lazy package value ${value}`); +}); + +console.log(`package 2 value ${require('meteor/package-2').value}`); diff --git a/tools/tests/apps/top-level-await-order/package-lock.json b/tools/tests/apps/top-level-await-order/package-lock.json new file mode 100644 index 0000000000..9cb28d1257 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/package-lock.json @@ -0,0 +1,20 @@ +{ + "name": "watch-used-files", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/runtime": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", + "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + } + } +} diff --git a/tools/tests/apps/top-level-await-order/package.json b/tools/tests/apps/top-level-await-order/package.json new file mode 100644 index 0000000000..68217c940f --- /dev/null +++ b/tools/tests/apps/top-level-await-order/package.json @@ -0,0 +1,19 @@ +{ + "name": "top-level-await", + "private": true, + "scripts": { + "start": "meteor run", + "test": "meteor test --once --driver-package meteortesting:mocha", + "test-app": "TEST_WATCH=1 meteor test --full-app --driver-package meteortesting:mocha", + "visualize": "meteor --production --extra-packages bundle-visualizer" + }, + "dependencies": { + "@babel/runtime": "^7.15.3" + }, + "meteor": { + "mainModule": { + "client": "main.js", + "server": "main.js" + } + } +} diff --git a/tools/tests/apps/top-level-await-order/packages/build-plugin/package.js b/tools/tests/apps/top-level-await-order/packages/build-plugin/package.js new file mode 100644 index 0000000000..38be10db6c --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/build-plugin/package.js @@ -0,0 +1,19 @@ +Package.describe({ + name: 'build-plugin', +}); + +Package.registerBuildPlugin({ + name: 'build-plugin', + use: ['meteor', 'ecmascript'], + sources: ['plugin.js'] +}); + +Package.registerBuildPlugin({ + name: 'build-plugin-no-meteor', + use: [], + sources: ['plugin-without-meteor.js'] +}); + +Package.onUse((api) => { + api.use('isobuild:compiler-plugin@1.0.0') +}) diff --git a/tools/tests/apps/top-level-await-order/packages/build-plugin/plugin-without-meteor.js b/tools/tests/apps/top-level-await-order/packages/build-plugin/plugin-without-meteor.js new file mode 100644 index 0000000000..bfb81b9e84 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/build-plugin/plugin-without-meteor.js @@ -0,0 +1 @@ +console.log('plugin without Meteor'); diff --git a/tools/tests/apps/top-level-await-order/packages/build-plugin/plugin.js b/tools/tests/apps/top-level-await-order/packages/build-plugin/plugin.js new file mode 100644 index 0000000000..fc61808833 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/build-plugin/plugin.js @@ -0,0 +1,7 @@ +Meteor.startup(() => { + console.log('plugin - startup'); +}); +console.log('plugin - before'); +await 0 +console.log('plugin - after'); +Promise.resolve().then(() => console.log('plugin - later')); diff --git a/tools/tests/apps/top-level-await-order/packages/lazy-package/main.js b/tools/tests/apps/top-level-await-order/packages/lazy-package/main.js new file mode 100644 index 0000000000..6860556a59 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/lazy-package/main.js @@ -0,0 +1,4 @@ +console.log('lazy package'); +await 0; +console.log('after lazy'); +export const value = 10; diff --git a/tools/tests/apps/top-level-await-order/packages/lazy-package/package.js b/tools/tests/apps/top-level-await-order/packages/lazy-package/package.js new file mode 100644 index 0000000000..47afa9516c --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/lazy-package/package.js @@ -0,0 +1,4 @@ +Package.onUse((api) => { + api.use('ecmascript'); + api.mainModule('main.js', ['client', 'server'], { lazy: true}); +}); diff --git a/tools/tests/apps/top-level-await-order/packages/package-1/a.js b/tools/tests/apps/top-level-await-order/packages/package-1/a.js new file mode 100644 index 0000000000..5d2f07ad62 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/package-1/a.js @@ -0,0 +1,6 @@ +console.log('package 1 - a before'); +await 0; +console.log('package 1 - a after'); +Promise.resolve().then(() => { + console.log('package 1 - a later'); +}); diff --git a/tools/tests/apps/top-level-await-order/packages/package-1/b.js b/tools/tests/apps/top-level-await-order/packages/package-1/b.js new file mode 100644 index 0000000000..e4d08802e5 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/package-1/b.js @@ -0,0 +1,6 @@ +console.log('package 1 - b before'); +await 0; +console.log('package 1 - b after'); +Promise.resolve().then(() => { + console.log('package 1 - b later'); +}); diff --git a/tools/tests/apps/top-level-await-order/packages/package-1/package.js b/tools/tests/apps/top-level-await-order/packages/package-1/package.js new file mode 100644 index 0000000000..9ec5d73a03 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/package-1/package.js @@ -0,0 +1,5 @@ +Package.onUse((api) => { + api.use('ecmascript'); + api.addFiles('b.js'); + api.mainModule('a.js'); +}); diff --git a/tools/tests/apps/top-level-await-order/packages/package-2/a.js b/tools/tests/apps/top-level-await-order/packages/package-2/a.js new file mode 100644 index 0000000000..6765e0236d --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/package-2/a.js @@ -0,0 +1,10 @@ +import './b.js'; + +console.log('package 2 - a before'); +await 0; +console.log('package 2 - a after'); +Promise.resolve().then(() => { + console.log('package 2 - a later'); +}); + +export const value = 6; diff --git a/tools/tests/apps/top-level-await-order/packages/package-2/b.js b/tools/tests/apps/top-level-await-order/packages/package-2/b.js new file mode 100644 index 0000000000..7124e1bcb7 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/package-2/b.js @@ -0,0 +1,4 @@ +console.log('package 2 - b'); +Promise.resolve().then(() => { + console.log('package 2 - b later'); +}); diff --git a/tools/tests/apps/top-level-await-order/packages/package-2/package.js b/tools/tests/apps/top-level-await-order/packages/package-2/package.js new file mode 100644 index 0000000000..1afded3e49 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/package-2/package.js @@ -0,0 +1,4 @@ +Package.onUse((api) => { + api.use('ecmascript'); + api.mainModule('a.js'); +}); diff --git a/tools/tests/apps/top-level-await-order/packages/print/client.js b/tools/tests/apps/top-level-await-order/packages/print/client.js new file mode 100644 index 0000000000..9fe03d0b7c --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/print/client.js @@ -0,0 +1,14 @@ +// Wait for Meteor package to load +let logs = []; +let oldLog = console.log; +console.log = function (message) { + logs.push(message); + oldLog.apply(this, arguments); +} + +Meteor.startup(() => { + // run after all startup hooks + setTimeout(() => { + Meteor.call('print', logs); + }); +}); diff --git a/tools/tests/apps/top-level-await-order/packages/print/package.js b/tools/tests/apps/top-level-await-order/packages/print/package.js new file mode 100644 index 0000000000..ff14dbdd0b --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/print/package.js @@ -0,0 +1,6 @@ +Package.onUse((api) => { + api.use('meteor'); + api.use('ddp'); + api.addFiles('client.js', 'client'); + api.addFiles('server.js', 'server'); +}); diff --git a/tools/tests/apps/top-level-await-order/packages/print/server.js b/tools/tests/apps/top-level-await-order/packages/print/server.js new file mode 100644 index 0000000000..08e2999346 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/print/server.js @@ -0,0 +1,8 @@ +// Wait for Meteor package to load +Meteor.methods({ + print(logs) { + logs.forEach(message => { + console.log('[client]', message); + }); + } +}); diff --git a/tools/tests/apps/top-level-await-order/packages/sync-package/package.js b/tools/tests/apps/top-level-await-order/packages/sync-package/package.js new file mode 100644 index 0000000000..3db798482e --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/sync-package/package.js @@ -0,0 +1,4 @@ +Package.onUse((api) => { + api.use('ecmascript'); + api.addFiles('sync.js'); +}); diff --git a/tools/tests/apps/top-level-await-order/packages/sync-package/sync.js b/tools/tests/apps/top-level-await-order/packages/sync-package/sync.js new file mode 100644 index 0000000000..39da15ccd2 --- /dev/null +++ b/tools/tests/apps/top-level-await-order/packages/sync-package/sync.js @@ -0,0 +1,4 @@ +console.log('package sync'); +Promise.resolve().then(() => { + console.log('package sync - later'); +}); diff --git a/tools/tests/top-level-await.js b/tools/tests/top-level-await.js new file mode 100644 index 0000000000..b2deb6ca11 --- /dev/null +++ b/tools/tests/top-level-await.js @@ -0,0 +1,73 @@ +import * as selftest from '../tool-testing/selftest.js'; + + +selftest.define("xxxx top level await - order", async function (options) { + const s = new selftest.Sandbox({ + clients: options.clients + }); + s.set('METEOR_ENABLE_CLIENT_TOP_LEVEL_AWAIT', 'true'); + await s.init(); + + await s.createApp("myapp", "top-level-await-order"); + s.cd("myapp"); + + await s.testWithAllClients(async (run) => { + // TODO: Startup should be the last log, but there is a bug + // where it runs too early in plugins + await run.match('plugin - startup'); + await run.match('plugin - before'); + await run.match('plugin - after'); + await run.match('plugin - later'); + + await run.match('plugin without Meteor'); + + const lines = [ + 'package sync', + 'package 1 - b before', + 'package 2 - b', + 'package 2 - a before', + 'package sync - later', + 'package 1 - b after', + 'package 2 - b later', + 'package 2 - a after', + 'package 1 - b later', + 'package 1 - a before', + 'package 2 - a later', + 'package 1 - a after', + 'package 1 - a later', + 'app a.js - before', + 'app b.js - before', + 'app a.js - after', + 'app b.js - after', + 'app a.js - later', + 'app b.js - later', + 'entry - before', + 'entry - after', + 'lazy package', + 'package 2 value 6', + 'entry - later', + 'after lazy', + 'lazy package value 10', + 'entry - startup', + ]; + + for(const line of lines) { + await run.match(line); + } + + await run.connectClient(); + + for(const line of lines) { + await run.match(`[client] ${line}`); + } + + await run.stop(); + }, { + // concatenate js files so packages load in parallel + // otherwise, there is too much of a delay between each + // package loading + // TODO: we could instead create a custom minifier for this test that + // only concatenates, which would be faster + args: ['--production'] + }); +}); From 4f6433a2520d6f778d9be08b53c1fcdfcc967417 Mon Sep 17 00:00:00 2001 From: zodern Date: Thu, 30 Mar 2023 15:37:30 -0500 Subject: [PATCH 20/37] Load all packages within same microtask --- tools/static-assets/server/boot.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/static-assets/server/boot.js b/tools/static-assets/server/boot.js index a62bfd592d..ea375cad19 100644 --- a/tools/static-assets/server/boot.js +++ b/tools/static-assets/server/boot.js @@ -409,7 +409,7 @@ var loadServerBundles = Profile("Load server bundles", async function () { var scriptPath = parsedSourceMaps[absoluteFilePath] ? absoluteFilePath : fileInfoOSPath; - var func = await require('vm').runInThisContext(wrapped, { + var func = require('vm').runInThisContext(wrapped, { filename: scriptPath, displayErrors: true }); @@ -427,14 +427,14 @@ var loadServerBundles = Profile("Load server bundles", async function () { }); } else { // Allows us to use code-coverage if the debugger is not enabled - await Profile(fileInfo.path, func).apply(global, args); + Profile(fileInfo.path, func).apply(global, args); } } await maybeWaitForDebuggerToAttach(); for (const info of infos) { - await info.fn.apply(global, info.args); + info.fn.apply(global, info.args); } if (global.Package['core-runtime']) { return global.Package['core-runtime'].waitUntilAllLoaded(); @@ -508,5 +508,3 @@ var runMain = Profile("Run main()", async function () { console.log(e.stack); process.exit(1) }); - - From 3d6d6c4acc35198924ef585129ef18caaf6a5d9f Mon Sep 17 00:00:00 2001 From: zodern Date: Thu, 30 Mar 2023 15:38:55 -0500 Subject: [PATCH 21/37] Update reify --- npm-packages/meteor-babel/package.json | 2 +- packages/modules/.npm/package/npm-shrinkwrap.json | 2 +- packages/modules/package.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/npm-packages/meteor-babel/package.json b/npm-packages/meteor-babel/package.json index 1eb19d3b16..2aa8ea21fa 100644 --- a/npm-packages/meteor-babel/package.json +++ b/npm-packages/meteor-babel/package.json @@ -41,7 +41,7 @@ "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.0", "@babel/types": "^7.17.0", - "@meteorjs/reify": "https://github.com/meteor/reify/tarball/78134aa90d8a17ddf6848c0964080f1e0afd1e08", + "@meteorjs/reify": "https://github.com/meteor/reify/tarball/0867be73ca61e87ae9d60edef62baf26b38719ef", "babel-preset-meteor": "^7.10.0", "babel-preset-minify": "^0.5.1", "convert-source-map": "^1.6.0", diff --git a/packages/modules/.npm/package/npm-shrinkwrap.json b/packages/modules/.npm/package/npm-shrinkwrap.json index 76b8819d98..893ab1178d 100644 --- a/packages/modules/.npm/package/npm-shrinkwrap.json +++ b/packages/modules/.npm/package/npm-shrinkwrap.json @@ -2,7 +2,7 @@ "lockfileVersion": 1, "dependencies": { "@meteorjs/reify": { - "version": "git+https://github.com/meteor/reify.git#78134aa90d8a17ddf6848c0964080f1e0afd1e08" + "version": "git+https://github.com/meteor/reify.git#0867be73ca61e87ae9d60edef62baf26b38719ef" }, "@types/estree": { "version": "1.0.0", diff --git a/packages/modules/package.js b/packages/modules/package.js index 157640a3ed..95113c9bc3 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -6,7 +6,7 @@ Package.describe({ }); Npm.depends({ - "@meteorjs/reify": "git+https://github.com/meteor/reify.git#78134aa90d8a17ddf6848c0964080f1e0afd1e08", + "@meteorjs/reify": "git+https://github.com/meteor/reify.git#0867be73ca61e87ae9d60edef62baf26b38719ef", "meteor-babel-helpers": "0.0.3", }); From 24da208385fbef08db262fc3e6da30057f7adc2d Mon Sep 17 00:00:00 2001 From: zodern Date: Thu, 30 Mar 2023 15:48:00 -0500 Subject: [PATCH 22/37] Fix checkAsyncModule --- packages/core-runtime/load-js-image.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/core-runtime/load-js-image.js b/packages/core-runtime/load-js-image.js index b80a84165c..2492acb920 100644 --- a/packages/core-runtime/load-js-image.js +++ b/packages/core-runtime/load-js-image.js @@ -83,9 +83,7 @@ function runEagerModules(config, callback) { var path = config.eagerModulePaths[index]; var exports = config.require(path); - // TODO[fibers]: retest the function checkAsyncModule. It looks like it's returning the wrong values - // returning false when exports is a promise - if (exports && exports.then) { + if (checkAsyncModule(exports)) { if (path === config.mainModulePath) { mainModuleAsync = true; } @@ -127,15 +125,14 @@ function runEagerModules(config, callback) { } function checkAsyncModule (exports) { - // Uses property descriptor to avoid running any getters - var isPromise = exports && hasOwn.call(exports, 'then') && - typeof Object.getOwnPropertyDescriptor(exports, 'then').value === 'function'; + var potentiallyAsync = exports && typeof exports === 'object' && + hasOwn.call(exports, '__reifyAsyncModule'); - if (!isPromise) { - return false; + if (!potentiallyAsync) { + return; } - return hasOwn.call(exports, '__reifyAsyncModule'); + return typeof exports.then === 'function'; } // For this to be accurate, all linked files must be queued before calling this From ef61497779dc4f84685a0346bd0e18325f3011d5 Mon Sep 17 00:00:00 2001 From: zodern Date: Thu, 30 Mar 2023 15:50:02 -0500 Subject: [PATCH 23/37] Disable topLevelAwait when compiling for older Meteor versions --- packages/babel-compiler/babel-compiler.js | 3 ++- tools/isobuild/compiler-plugin.js | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/babel-compiler/babel-compiler.js b/packages/babel-compiler/babel-compiler.js index 2b7e2e8301..4f3acd14a2 100644 --- a/packages/babel-compiler/babel-compiler.js +++ b/packages/babel-compiler/babel-compiler.js @@ -94,7 +94,8 @@ BCp.processOneFileForTarget = function (inputFile, source) { features.modernBrowsers = true; } - features.topLevelAwait = arch.startsWith('os.') || enableClientTLA + features.topLevelAwait = inputFile.supportsTopLevelAwait && + (arch.startsWith('os.') || enableClientTLA); features.useNativeAsyncAwait = Meteor.isFibersDisabled; diff --git a/tools/isobuild/compiler-plugin.js b/tools/isobuild/compiler-plugin.js index a0b42d3c31..79c49e33d4 100644 --- a/tools/isobuild/compiler-plugin.js +++ b/tools/isobuild/compiler-plugin.js @@ -239,6 +239,13 @@ class InputFile extends buildPluginModule.InputFile { // accept a lazy finalizer function as a second argument, so that // compilation can be avoided until/unless absolutely necessary. this.supportsLazyCompilation = true; + + // Communicate to compiler plugins that this version of Meteor + // is able to support top level await + // TODO: maybe this should also check if the file and package meet the + // minimum requirements to use top level await (file isn't bare, and + // package uses core-runtime and modules) + this.supportsTopLevelAwait = true; } getContentsAsBuffer() { From ac5f4c9c8694479e0589fa77f5cf92dbfa88804b Mon Sep 17 00:00:00 2001 From: zodern Date: Thu, 30 Mar 2023 15:56:34 -0500 Subject: [PATCH 24/37] Fix lock file --- npm-packages/meteor-babel/package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-packages/meteor-babel/package-lock.json b/npm-packages/meteor-babel/package-lock.json index 9dfdc307d6..09535205d8 100644 --- a/npm-packages/meteor-babel/package-lock.json +++ b/npm-packages/meteor-babel/package-lock.json @@ -1042,8 +1042,8 @@ } }, "@meteorjs/reify": { - "version": "https://github.com/meteor/reify/tarball/ee36898798645097948258eb9106dd0af60cec64", - "integrity": "sha512-ERt3gPO1iBDxJe+9UvkZPuGZKUmjD2/R3VjeF5HKEyXwiU6kh3swhRwQQrTopwpG8amPa2sjSr+DOihHMs+Z/g==", + "version": "https://github.com/meteor/reify/tarball/0867be73ca61e87ae9d60edef62baf26b38719ef", + "integrity": "sha512-72nBQp00MD6O2bz0bOUm6PWpuNLk4wv2uaRWcXOp+NYjYLLZB9S+O3o3o3lDe+OM4JMobCkQk4VIDasrz2Ds+w==", "requires": { "acorn": "^8.8.1", "magic-string": "^0.25.3", From e8db44157abf99062ead0e7415c607a9a61b6b38 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 15:07:28 -0300 Subject: [PATCH 25/37] adjusted log --- packages/test-in-console/puppeteerRunner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/test-in-console/puppeteerRunner.js b/packages/test-in-console/puppeteerRunner.js index c6509bd93d..bf771ac50d 100644 --- a/packages/test-in-console/puppeteerRunner.js +++ b/packages/test-in-console/puppeteerRunner.js @@ -26,7 +26,7 @@ async function runNextUrl(browser) { console.log(` The number of tests from Test number may be different because of the way the test is written. causing the test to fail or - to run more than once. in the console. Test number total: ${ testNumber }`); + to run more than once. in the console. Test number total: ${ testNumber }`); console.log(`Tests complete with ${ failCount } failures`); console.log(`Tests complete with ${ await getPassCount(page) } passes`); if (failCount > 0) { From 80e3c8dfdc0f774dddb13494e788b3cbcb9a726b Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 15:12:38 -0300 Subject: [PATCH 26/37] testing --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c6467dc6dd..cd9177d50e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -100,7 +100,7 @@ can_disable_fibers: &can_disable_fibers parameters: fibers: type: boolean - default: true + default: false # now is always off set_fibers_env: &set_fibers_env name: "Disable Fibers" From 11d6e307b008a5fd16f95954e6815cdd903bd485 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 15:36:16 -0300 Subject: [PATCH 27/37] chore: update test group 11 --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index cd9177d50e..70ea05d287 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -700,6 +700,7 @@ jobs: path: /tmp/memuse.txt Test Group 11: + <<: *can_disable_fibers <<: *build_machine_environment steps: - run: From 453507eb6e8daec8fe6d15fa1c616c1bc2ed1ef5 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 15:36:53 -0300 Subject: [PATCH 28/37] tests: solved mainModule --- tools/tests/app-config.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/tests/app-config.js b/tools/tests/app-config.js index 8b3282daba..0a17c57184 100644 --- a/tools/tests/app-config.js +++ b/tools/tests/app-config.js @@ -150,7 +150,7 @@ selftest.define("testModule", async function () { await s.init(); await s.createApp("app-config-mainModule", "app-config"); - s.cd("app-config-mainModule"); + await s.cd("app-config-mainModule"); // For meteortesting:mocha to work we must set test broswer driver // See https://github.com/meteortesting/meteor-mocha @@ -160,7 +160,8 @@ selftest.define("testModule", async function () { "test", // Not running with the --full-app option here, in order to exercise // the normal `meteor test` behavior. - "--driver-package", "meteortesting:mocha" + /// TODO: Fibers => turn this back to meteortesthing:mocha when 3.0.0 is released + "--driver-package", "grubba:mocha" /// meteortesting:mocha" ); run.waitSecs(60); From a5be6951fbd699b538ce6a8c98f5afd15621bf1b Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 15:37:05 -0300 Subject: [PATCH 29/37] tests: updated app-config sandboc --- tools/tests/apps/app-config/.meteor/packages | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/tests/apps/app-config/.meteor/packages b/tools/tests/apps/app-config/.meteor/packages index 46098f7d48..dcab3914a8 100644 --- a/tools/tests/apps/app-config/.meteor/packages +++ b/tools/tests/apps/app-config/.meteor/packages @@ -12,3 +12,4 @@ es5-shim # ECMAScript 5 compatibility for older browsers ecmascript # Enable ECMAScript2015+ syntax in app code shell-server # Server-side component of the `meteor shell` command less # Support .less files for defining CSS styles +grubba:mocha From 02e56a7ec05469a70fb6dfd897e82c83b517f662 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 15:37:16 -0300 Subject: [PATCH 30/37] updated versions in app-config sandbox --- tools/tests/apps/app-config/.meteor/versions | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/tests/apps/app-config/.meteor/versions b/tools/tests/apps/app-config/.meteor/versions index e53282cd8f..f4d94df8eb 100644 --- a/tools/tests/apps/app-config/.meteor/versions +++ b/tools/tests/apps/app-config/.meteor/versions @@ -62,3 +62,4 @@ underscore@1.0.11 url@1.2.0 webapp@1.5.0 webapp-hashing@1.0.9 +grubba:mocha@3.0.0 From 315a70e28eb4644c34fc6af08b4f919507ba5578 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 15:37:26 -0300 Subject: [PATCH 31/37] tests: solved hot-code-push --- tools/tests/hot-code-push.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tests/hot-code-push.js b/tools/tests/hot-code-push.js index 8cd76ec758..2eb212d6e6 100644 --- a/tools/tests/hot-code-push.js +++ b/tools/tests/hot-code-push.js @@ -107,7 +107,7 @@ selftest.define("versioning hot code push", async function (options) { s.set("AUTOUPDATE_VERSION", "1.0"); await s.createApp("myapp", "hot-code-push-test"); - s.cd("myapp"); + await s.cd("myapp"); await s.testWithAllClients(async function (run) { await run.match("myapp"); From b2c2a091cb1227c5788b7d199c65e429756e3c76 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 16:20:08 -0300 Subject: [PATCH 32/37] =?UTF-8?q?=E2=80=A0est:=20solved=20static-html=20-?= =?UTF-8?q?=20throws=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/tests/static-html.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tests/static-html.js b/tools/tests/static-html.js index 163173816d..edcdfa4df0 100644 --- a/tools/tests/static-html.js +++ b/tools/tests/static-html.js @@ -55,7 +55,7 @@ selftest.define("static-html - throws error", async () => { await s.createApp('myapp', 'compiler-plugin-static-html-error'); s.cd('myapp'); - const run = startRun(s); + const run = await startRun(s); await run.match("Attributes on not supported"); run.waitSecs(30); From 9e6292daf9ebcbab4a90918a5aede9dff6b07246 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 16:23:54 -0300 Subject: [PATCH 33/37] wip: show command --- tools/tests/package-tests.js | 581 +++++++++++++++++++++-------------- 1 file changed, 346 insertions(+), 235 deletions(-) diff --git a/tools/tests/package-tests.js b/tools/tests/package-tests.js index 07b342543f..f785cf3fb9 100644 --- a/tools/tests/package-tests.js +++ b/tools/tests/package-tests.js @@ -1,9 +1,9 @@ -var _= require('underscore'); +var _ = require("underscore"); -var selftest = require('../tool-testing/selftest.js'); +var selftest = require("../tool-testing/selftest.js"); var Sandbox = selftest.Sandbox; -var files = require('../fs/files'); -var utils = require('../utils/utils.js'); +var files = require("../fs/files"); +var utils = require("../utils/utils.js"); var username = "test"; @@ -13,7 +13,7 @@ var randomizedPackageName = function (username, start) { // be a consistent length is very useful. var startStr = start ? start + "-" : ""; return username + ":" + startStr + utils.randomToken().substring(0, 6); -} +}; // Given a sandbox, that has the app as its currend cwd, read the packages file // and check that it contains exactly the packages specified, in order. @@ -27,7 +27,7 @@ var randomizedPackageName = function (username, start) { // awesome-pack@1.0.0 (ie: name@version) to match that name at that // version explicitly. This is for packages that we included at a specific // version. -var checkPackages = selftest.markStack(async function(sand, packages) { +var checkPackages = selftest.markStack(async function (sand, packages) { var lines = sand.read(".meteor/packages").split("\n"); var i = 0; for (const line of lines) { @@ -36,10 +36,10 @@ var checkPackages = selftest.markStack(async function(sand, packages) { } // If the specified package contains an @ sign, then it has a version // number, so we should match everything. - if (packages[i].split('@').length > 1) { + if (packages[i].split("@").length > 1) { await selftest.expectEqual(line, packages[i]); } else { - var pack = line.split('@')[0]; + var pack = line.split("@")[0]; await selftest.expectEqual(pack, packages[i]); } i++; @@ -64,22 +64,22 @@ var checkPackages = selftest.markStack(async function(sand, packages) { // version explicitly. This is for packages that only exist for the purpose // of this test (for example, packages local to this app), so we know exactly // what version we expect. -var checkVersions = selftest.markStack(async function(sand, packages) { +var checkVersions = selftest.markStack(async function (sand, packages) { var lines = sand.read(".meteor/versions").split("\n"); var depend = {}; - _.each(lines, function(line) { + _.each(lines, function (line) { if (!line) { return; } // Packages are stored of the form foo@1.0.0, so this should give us an // array [foo, 1.0.0]. - var split = line.split('@'); + var split = line.split("@"); var pack = split[0]; depend[pack] = split[1]; }); var i = 0; for (const pack of packages) { - var split = pack.split('@'); + var split = pack.split("@"); if (split.length > 1) { await selftest.expectEqual(depend[split[0]], split[1]); } else { @@ -117,7 +117,7 @@ selftest.define("change packages during hot code push", [], async function () { // Modify the local package 'say-something'. s.cd("packages/say-something", function () { - s.write("foo.js", "console.log(\"another\");"); + s.write("foo.js", 'console.log("another");'); }); run.waitSecs(12); await run.match("another"); @@ -129,14 +129,14 @@ selftest.define("change packages during hot code push", [], async function () { // Change something in the plugin. s.cd("packages/contains-plugin/plugin", function () { - s.write("plugin.js", "console.log(\"edit\");"); + s.write("plugin.js", 'console.log("edit");'); }); run.waitSecs(2); await run.match("edit"); await run.match("foobar!"); // Check that we are watching the versions file, as well as the packages file. - s.unlink('.meteor/versions'); + s.unlink(".meteor/versions"); run.waitSecs(10); await run.match("restarted"); @@ -146,10 +146,10 @@ selftest.define("change packages during hot code push", [], async function () { await run.match("another"); await run.stop(); - s.rename('packages/say-something', 'packages/shout-something'); + s.rename("packages/say-something", "packages/shout-something"); s.write(".meteor/packages", "meteor-base \n shout-something"); s.cd("packages/shout-something", function () { - s.write("foo.js", "console.log(\"louder\");"); + s.write("foo.js", 'console.log("louder");'); }); run = s.run(); @@ -157,7 +157,7 @@ selftest.define("change packages during hot code push", [], async function () { await run.match("myapp"); await run.match("proxy"); run.waitSecs(5); - await run.match("louder"); // the package actually loaded + await run.match("louder"); // the package actually loaded // How about breaking and fixing a package.js? await s.cd("packages/shout-something", async function () { @@ -195,15 +195,18 @@ selftest.define("add debugOnly and prodOnly packages", [], async function () { function onStartup(property) { s.mkdir("server"); - s.write("server/exit-test.js", [ - "Meteor.startup(() => {", - " console.log('Meteor.isDevelopment', Meteor.isDevelopment);", - " console.log('Meteor.isProduction', Meteor.isProduction);", - ` console.log('${property}', global.${property});`, - ` process.exit(global.${property} ? 234 : 235);`, - "});", - "" - ].join("\n")); + s.write( + "server/exit-test.js", + [ + "Meteor.startup(() => {", + " console.log('Meteor.isDevelopment', Meteor.isDevelopment);", + " console.log('Meteor.isProduction', Meteor.isProduction);", + ` console.log('${property}', global.${property});`, + ` process.exit(global.${property} ? 234 : 235);`, + "});", + "", + ].join("\n") + ); } onStartup("DEBUG_ONLY_LOADED"); @@ -264,8 +267,7 @@ selftest.define("add packages to app", [], async function () { await run.match("accounts-base: A user account system"); await run.expectExit(0); - await checkPackages(s, - ["meteor-base", "accounts-base"]); + await checkPackages(s, ["meteor-base", "accounts-base"]); // Adding the nonexistent version now should still say "no such // version". Regression test for @@ -282,37 +284,46 @@ selftest.define("add packages to app", [], async function () { await run.match("say-something: print to console"); await run.expectExit(0); - await checkPackages(s, - ["meteor-base", "accounts-base", "say-something@1.0.0"]); + await checkPackages(s, [ + "meteor-base", + "accounts-base", + "say-something@1.0.0", + ]); run = s.run("add", "depends-on-plugin"); await run.match(/depends-on-plugin.*added,/); await run.expectExit(0); - await checkPackages(s, - ["meteor-base", "accounts-base", - "say-something@1.0.0", "depends-on-plugin"]); + await checkPackages(s, [ + "meteor-base", + "accounts-base", + "say-something@1.0.0", + "depends-on-plugin", + ]); - await checkVersions(s, - ["accounts-base", "depends-on-plugin", - "say-something", "meteor-base", - "contains-plugin@1.1.0"]); + await checkVersions(s, [ + "accounts-base", + "depends-on-plugin", + "say-something", + "meteor-base", + "contains-plugin@1.1.0", + ]); run = s.run("remove", "say-something"); await run.match("say-something: removed dependency"); - await checkVersions(s, - ["accounts-base", "depends-on-plugin", - "meteor-base", - "contains-plugin"]); + await checkVersions(s, [ + "accounts-base", + "depends-on-plugin", + "meteor-base", + "contains-plugin", + ]); run = s.run("remove", "depends-on-plugin"); await run.match(/contains-plugin.*removed from your project/); await run.match(/depends-on-plugin.*removed from your project/); await run.match("depends-on-plugin: removed dependency"); - await checkVersions(s, - ["accounts-base", - "meteor-base"]); + await checkVersions(s, ["accounts-base", "meteor-base"]); run = s.run("list"); await run.match("accounts-base"); await run.match("meteor-base"); @@ -325,56 +336,66 @@ selftest.define("add packages to app", [], async function () { await run.expectExit(0); }); -selftest.define("add package with both debugOnly and prodOnly", [], async function () { - var s = new Sandbox(); - await s.init(); - var run; - - // Add an app with a package with prodOnly and debugOnly set (an error) - await s.createApp("myapp", "debug-only-test", {dontPrepareApp: true}); - s.cd("myapp"); - run = s.run("--prepare-app"); - run.waitSecs(20); - await run.matchErr("can't have more than one of: debugOnly, prodOnly, testOnly"); - await run.expectExit(1); -}); +selftest.define( + "add package with both debugOnly and prodOnly", + [], + async function () { + var s = new Sandbox(); + await s.init(); + var run; + // Add an app with a package with prodOnly and debugOnly set (an error) + await s.createApp("myapp", "debug-only-test", { dontPrepareApp: true }); + s.cd("myapp"); + run = s.run("--prepare-app"); + run.waitSecs(20); + await run.matchErr( + "can't have more than one of: debugOnly, prodOnly, testOnly" + ); + await run.expectExit(1); + } +); // Add a package that adds files to specific client architectures. selftest.define("add packages client archs", async function (options) { var runTestWithArgs = async function (clientType, args, port) { var s = new Sandbox({ - clients: Object.assign(options.clients, { port: port }) + clients: Object.assign(options.clients, { port: port }), }); await s.init(); // Starting a run await s.createApp("myapp", "package-tests"); s.cd("myapp"); - s.set("METEOR_OFFLINE_CATALOG", "t"); + s.set("METEOR_OFFLINE_CATALOG", "t"); var outerRun = s.run("add", "say-something-client-targets"); await outerRun.match(/say-something-client-targets.*added,/); await outerRun.expectExit(0); await checkPackages(s, ["meteor-base", "say-something-client-targets"]); - await s.testWithAllClients(async function (run) { - var expectedLogNum = 0; - run.waitSecs(10); - await run.match("myapp"); - await run.match("proxy"); - run.waitSecs(10); - await run.match("running at"); - await run.match("localhost"); + await s.testWithAllClients( + async function (run) { + var expectedLogNum = 0; + run.waitSecs(10); + await run.match("myapp"); + await run.match("proxy"); + run.waitSecs(10); + await run.match("running at"); + await run.match("localhost"); - run.connectClient(); - run.waitSecs(40); - await run.match("all clients " + (expectedLogNum++)); - await run.match(clientType + " client " + (expectedLogNum++)); - await run.stop(); - }, { args, - testName: 'add packages client archs', - testFile: 'package-tests.js' }); + run.connectClient(); + run.waitSecs(40); + await run.match("all clients " + expectedLogNum++); + await run.match(clientType + " client " + expectedLogNum++); + await run.stop(); + }, + { + args, + testName: "add packages client archs", + testFile: "package-tests.js", + } + ); }; await runTestWithArgs("browser", [], 3000); @@ -397,26 +418,31 @@ selftest.define("add package with no builds", ["net"], async function () { await run.expectExit(1); }); -selftest.define("package skeleton creates correct versionsFrom", ['custom-warehouse'], async function () { - var s = new Sandbox({ warehouse: { v1: { recommended: true } } }); - await s.init(); +selftest.define( + "package skeleton creates correct versionsFrom", + ["custom-warehouse"], + async function () { + var s = new Sandbox({ warehouse: { v1: { recommended: true } } }); + await s.init(); - var token = utils.randomToken(); - var fullPackageName = "test:" + token; - var fsPackageName = token; + var token = utils.randomToken(); + var fullPackageName = "test:" + token; + var fsPackageName = token; - var run = s.run("create", "--package", fullPackageName); - run.waitSecs(15); - await run.match(fullPackageName); - await run.expectExit(0); + var run = s.run("create", "--package", fullPackageName); + run.waitSecs(15); + await run.match(fullPackageName); + await run.expectExit(0); - s.cd(fsPackageName); - var packageJs = s.read("package.js"); - if (! packageJs.match(/api.versionsFrom\('v1'\);/)) { - selftest.fail("package.js missing correct 'api.versionsFrom':\n" + - packageJs); + s.cd(fsPackageName); + var packageJs = s.read("package.js"); + if (!packageJs.match(/api.versionsFrom\('v1'\);/)) { + selftest.fail( + "package.js missing correct 'api.versionsFrom':\n" + packageJs + ); + } } -}); +); selftest.define("show unknown version of package", async function () { var s = new Sandbox(); @@ -435,7 +461,7 @@ selftest.define("circular dependency errors", async function () { // meteor add refreshes, but we don't need anything from the official catalog // here. - s.set('METEOR_OFFLINE_CATALOG', 't'); + s.set("METEOR_OFFLINE_CATALOG", "t"); var run; // This app contains some pairs of packages with circular dependencies The app @@ -444,20 +470,19 @@ selftest.define("circular dependency errors", async function () { s.cd("myapp"); // Try to add one of a pair of circularly-depending packages. See an error. - run = s.run('add', 'first'); - await run.matchErr('error: circular dependency'); + run = s.run("add", "first"); + await run.matchErr("error: circular dependency"); await run.expectExit(1); // Note that the app still builds fine because 'first' didn't actually get // added. - run = s.run('--prepare-app'); + run = s.run("--prepare-app"); await run.expectExit(0); - // This pair has first-imply uses second-imply, second-imply implies // first-imply. - run = s.run('add', 'first-imply'); - await run.matchErr('error: circular dependency'); + run = s.run("add", "first-imply"); + await run.matchErr("error: circular dependency"); await run.expectExit(1); // This pair has first-weak uses second-weak, second-weak uses first-weak @@ -465,27 +490,27 @@ selftest.define("circular dependency errors", async function () { // prepare-app step passes), but not to run the bundler. We don't want to // write a test that prevents us from making the weak cycle an error at // prepare-time, so let's skip straight to bundling. - s.write('.meteor/packages', 'first-weak'); - run = s.run('--once'); - await run.matchErr('error: circular dependency'); + s.write(".meteor/packages", "first-weak"); + run = s.run("--once"); + await run.matchErr("error: circular dependency"); await run.expectExit(254); // ... but we can add second-weak, which just doesn't pull in first-weak at // all. - s.write('.meteor/packages', 'second-weak'); - run = s.run('--once'); + s.write(".meteor/packages", "second-weak"); + run = s.run("--once"); await run.match(/first-weak.*removed from your project/); - await run.expectExit(123); // the app immediately calls process.exit(123) + await run.expectExit(123); // the app immediately calls process.exit(123) // This pair has first-unordered uses second-unordered, second-unordered uses // first-unordered unorderedly. This should work just fine: that's why // unordered exists! - s.write('.meteor/packages', 'first-unordered'); - run = s.run('--once'); + s.write(".meteor/packages", "first-unordered"); + run = s.run("--once"); await run.match(/first-unordered.*added/); await run.match(/second-unordered.*added/); await run.match(/second-weak.*removed from your project/); - await run.expectExit(123); // the app immediately calls process.exit(123) + await run.expectExit(123); // the app immediately calls process.exit(123) }); // Runs 'meteor show ' without a specified version and checks @@ -509,15 +534,20 @@ selftest.define("circular dependency errors", async function () { // - label: string that we expect to see as the label. (ex: "installed") // - addendum: a message to display at the bottom. // - all: run 'meteor show' with the 'show-all' option. -var testShowPackage = selftest.markStack(async function (s, fullPackageName, options) { +var testShowPackage = selftest.markStack(async function ( + s, + fullPackageName, + options +) { var run; if (options.all) { run = s.run("show", "--show-all", fullPackageName); } else { run = s.run("show", fullPackageName); } - var packageName = options.defaultVersion ? - fullPackageName + "@" + options.defaultVersion : fullPackageName; + var packageName = options.defaultVersion + ? fullPackageName + "@" + options.defaultVersion + : fullPackageName; await run.match("Package: " + packageName + "\n"); if (options.homepage) { run.read("Homepage: " + options.homepage + "\n"); @@ -583,7 +613,7 @@ var testShowPackage = selftest.markStack(async function (s, fullPackageName, op // - constraint: constraint, such as "1.0.0" or "=1.0.0" or null. // - weak: true if this is a weak dependency. // - addendum: a message that we expect to display at the very bottom. -var testShowPackageVersion = selftest.markStack(async function (s, options) { +var testShowPackageVersion = selftest.markStack(async function (s, options) { var name = options.packageName; var version = options.version; var run = s.run("show", name + "@" + version); @@ -625,8 +655,12 @@ var testShowPackageVersion = selftest.markStack(async function (s, options) { if (options.publishedBy) { await run.match("\n"); await run.match( - "Published by " + options.publishedBy + - " on " + options.publishedOn + ".\n"); + "Published by " + + options.publishedBy + + " on " + + options.publishedOn + + ".\n" + ); } if (options.addendum) { run.read("\n" + options.addendum + "\n"); @@ -635,11 +669,10 @@ var testShowPackageVersion = selftest.markStack(async function (s, options) { await run.expectEnd(0); }); - // For local packages without a version, we want to replace version information // with the string "local". We also want to make sure that querying for // 'name@local' gives that local version. -selftest.define("show local package w/o version", async function () { +selftest.define("show local package w/o version", async function () { var s = new Sandbox(); await s.init(); @@ -654,13 +687,13 @@ selftest.define("show local package w/o version", async function () { s.cp("package-completely-empty.js", "package.js"); await testShowPackage(s, name, { defaultVersion: "local", - versions: [{ version: "local", directory: packageDir }] + versions: [{ version: "local", directory: packageDir }], }); await testShowPackageVersion(s, { packageName: name, version: "local", - directory: packageDir + directory: packageDir, }); // Test that running without any arguments also shows this package. @@ -679,7 +712,7 @@ selftest.define("show local package w/o version", async function () { // Make sure that a local-only package shows up correctly in show and search // results. -selftest.define("show and search local package", async function () { +selftest.define("show and search local package", async function () { // Setup: create an app, containing a package. This local package should show // up in the results of `meteor show` and `meteor search`. var s = new Sandbox(); @@ -698,25 +731,25 @@ selftest.define("show and search local package", async function () { s.cp("package-with-git.js", "package.js"); }); - var summary = 'This is a test package'; + var summary = "This is a test package"; // Run `meteor show`, but don't add the package to the app yet. We should know // that the package exists, even though it hasn't been added to the app. await testShowPackage(s, name, { summary: summary, defaultVersion: "local", - git: 'www.github.com/meteor/meteor', - versions: [{ version: "1.0.0", directory: packageDir }] + git: "www.github.com/meteor/meteor", + versions: [{ version: "1.0.0", directory: packageDir }], }); // Add the package to the app. var run = s.run("add", name); run.waitSecs(5); await run.expectExit(0); - testShowPackage(s, name, { + await testShowPackage(s, name, { summary: summary, - git: 'www.github.com/meteor/meteor', + git: "www.github.com/meteor/meteor", defaultVersion: "local", - versions: [{ version: "1.0.0", directory: packageDir }] + versions: [{ version: "1.0.0", directory: packageDir }], }); // When we run `meteor search`, we should be able to see the results for this @@ -743,13 +776,15 @@ selftest.define("show and search local package", async function () { C: "web.browser, web.browser.legacy, web.cordova", D: "web.browser, web.browser.legacy", E: "web.cordova", - G: "server, web.cordova" + G: "server, web.cordova", }; - const exportStr = Object.keys(impRaw).map(key => { - const value = impRaw[key]; - return key + (value ? " (" + value + ")" : ""); - }).join(", "); + const exportStr = Object.keys(impRaw) + .map((key) => { + const value = impRaw[key]; + return key + (value ? " (" + value + ")" : ""); + }) + .join(", "); var description = "Test package."; @@ -759,7 +794,7 @@ selftest.define("show and search local package", async function () { exports: exportStr, description: description, defaultVersion: "local", - versions: [{ version: "1.0.1", directory: packageDir }] + versions: [{ version: "1.0.1", directory: packageDir }], }); await testShowPackageVersion(s, { packageName: name, @@ -768,15 +803,18 @@ selftest.define("show and search local package", async function () { git: "www.github.com/meteor/meteor", summary: summary, exports: exportStr, - description: description + description: description, }); // Test showing implies. Since we are not going to build the package, we don't // have to publish any of the things that we imply. - var impliesData = _.sortBy(_.map(impRaw, function (label, placeholder) { - var name = randomizedPackageName(username, placeholder.toLowerCase()); - return { placeholder: placeholder, name: name, label: label}; - }), 'name'); + var impliesData = _.sortBy( + _.map(impRaw, function (label, placeholder) { + var name = randomizedPackageName(username, placeholder.toLowerCase()); + return { placeholder: placeholder, name: name, label: label }; + }), + "name" + ); s.cd(name, function () { s.cp("package-with-implies.js", "package.js"); var packOpen = s.read("package.js"); @@ -793,9 +831,17 @@ selftest.define("show and search local package", async function () { return d.label ? d.name + " (" + d.label + ")" : d.name; }); var impStr = - impArr[0] + ", " + impArr[1] + ", " + - impArr[2] + ", " + impArr[3] + ", " + - impArr[4] + ", " + impArr[5]; + impArr[0] + + ", " + + impArr[1] + + ", " + + impArr[2] + + ", " + + impArr[3] + + ", " + + impArr[4] + + ", " + + impArr[5]; await testShowPackage(s, name, { summary: summary, @@ -804,7 +850,7 @@ selftest.define("show and search local package", async function () { directory: packageDir, defaultVersion: "local", git: "www.github.com/meteor/meteor", - versions: [{ version: "1.2.1", directory: packageDir }] + versions: [{ version: "1.2.1", directory: packageDir }], }); // Implies are also dependencies. @@ -819,14 +865,14 @@ selftest.define("show and search local package", async function () { summary: summary, git: "www.github.com/meteor/meteor", implies: impStr, - dependencies: deps + dependencies: deps, }); }); // This tests that we get the right excerpt out of the Readme.md in different // combinations. It doesn't test publication, because publishing is slow -- // that's covered in a different test. -selftest.define("show readme excerpt", async function () { +selftest.define("show readme excerpt", async function () { var s = new Sandbox(); await s.init(); @@ -843,13 +889,13 @@ selftest.define("show readme excerpt", async function () { var basePackageInfo = { summary: "This is a test package", defaultVersion: "local", - versions: [{ version: "0.9.9", directory: packageDir }] + versions: [{ version: "0.9.9", directory: packageDir }], }; var baseVersionInfo = { summary: "This is a test package", packageName: name, version: "0.9.9", - directory: packageDir + directory: packageDir, }; s.cd(name); @@ -862,64 +908,108 @@ selftest.define("show readme excerpt", async function () { // An example of a standard readme. var readme = - "Heading" + "\n" + - "========" + "\n" + - "foobar1" + "\n" + - "\n" + - "## Subheading" + "\n" + - "You should not see this line!"; - s.write("README.md", readme); - await testShowPackage( - s, name, Object.assign({ description: "foobar1" }, basePackageInfo)); - await testShowPackageVersion( - s, Object.assign({ description: "foobar1" }, baseVersionInfo)); - - // Another example -- we have hidden the excerpt under a different subheading. - readme = - "Heading" + "\n" + - "========" + "\n" + - "## Subheading" + "\n" + - "foobar2" + "\n" + - "## Another subheading" + "\n" + + "Heading" + + "\n" + + "========" + + "\n" + + "foobar1" + + "\n" + + "\n" + + "## Subheading" + + "\n" + "You should not see this line!"; s.write("README.md", readme); await testShowPackage( - s, name, Object.assign({ description: "foobar2" }, basePackageInfo)); + s, + name, + Object.assign({ description: "foobar1" }, basePackageInfo) + ); await testShowPackageVersion( - s, Object.assign({ description: "foobar2" }, baseVersionInfo)); + s, + Object.assign({ description: "foobar1" }, baseVersionInfo) + ); + + // Another example -- we have hidden the excerpt under a different subheading. + readme = + "Heading" + + "\n" + + "========" + + "\n" + + "## Subheading" + + "\n" + + "foobar2" + + "\n" + + "## Another subheading" + + "\n" + + "You should not see this line!"; + s.write("README.md", readme); + await testShowPackage( + s, + name, + Object.assign({ description: "foobar2" }, basePackageInfo) + ); + await testShowPackageVersion( + s, + Object.assign({ description: "foobar2" }, baseVersionInfo) + ); // Generally, people skip a line between the header and the text, and // sometimes, even between headers. (It is part of markdown, in fact.) Let's // make sure that we handle that correctly. readme = - "Heading" + "\n" + - "========" + "\n" + "\n" + - "## Subheading" + "\n" + "\n" + - "foobaz" + "\n" + "\n" + - "## Another subheading" + "\n" + "\n" + + "Heading" + + "\n" + + "========" + + "\n" + + "\n" + + "## Subheading" + + "\n" + + "\n" + + "foobaz" + + "\n" + + "\n" + + "## Another subheading" + + "\n" + + "\n" + "You should not see this line!"; s.write("README.md", readme); await testShowPackage( - s, name, Object.assign({ description: "foobaz" }, basePackageInfo)); + s, + name, + Object.assign({ description: "foobaz" }, basePackageInfo) + ); await testShowPackageVersion( - s, Object.assign({ description: "foobaz" }, baseVersionInfo)); + s, + Object.assign({ description: "foobaz" }, baseVersionInfo) + ); // Some formatting in the text. - var excerpt = - "Here is a code sample:" + "\n\n" + - "```foobar and foobar```"; + var excerpt = "Here is a code sample:" + "\n\n" + "```foobar and foobar```"; readme = - "Heading" + "\n" + - "========" + "\n" + "\n" + - excerpt + "\n\n" + - "# Subheading" + "\n" + "\n" + - "## Another subheading" + "\n" + "\n" + + "Heading" + + "\n" + + "========" + + "\n" + + "\n" + + excerpt + + "\n\n" + + "# Subheading" + + "\n" + + "\n" + + "## Another subheading" + + "\n" + + "\n" + "You should not see this line!"; s.write("README.md", readme); await testShowPackage( - s, name, Object.assign({ description: excerpt }, basePackageInfo)); + s, + name, + Object.assign({ description: excerpt }, basePackageInfo) + ); await testShowPackageVersion( - s, Object.assign({ description: excerpt }, baseVersionInfo)); + s, + Object.assign({ description: excerpt }, baseVersionInfo) + ); // Now, let's try different file specifications for the documentation. var git = "https:ilovegit.git"; @@ -936,30 +1026,36 @@ selftest.define("show readme excerpt", async function () { git: git, packageName: name, version: "1.0.0", - directory: packageDir + directory: packageDir, }; basePackageInfo = { git: git, summary: summary, defaultVersion: "local", - versions: [{ version: "1.0.0", directory: packageDir }] + versions: [{ version: "1.0.0", directory: packageDir }], }; await testShowPackageVersion(s, baseVersionInfo); await testShowPackage(s, name, basePackageInfo); // If we specify a different file, read that file. - s.write("package.js", - staging.replace(/~documentation~/g, "'Meteor-Readme.md'")); + s.write( + "package.js", + staging.replace(/~documentation~/g, "'Meteor-Readme.md'") + ); readme = "A special Readme, just for Meteor."; s.write("Meteor-Readme.md", "Title\n==\n" + readme); - await testShowPackageVersion(s, - Object.assign({ description: readme }, baseVersionInfo)); - await testShowPackage(s, name, - Object.assign({ description: readme }, basePackageInfo)); + await testShowPackageVersion( + s, + Object.assign({ description: readme }, baseVersionInfo) + ); + await testShowPackage( + s, + name, + Object.assign({ description: readme }, basePackageInfo) + ); // If we specify a non-existent file, tell us. - s.write("package.js", - staging.replace(/~documentation~/g, "'NOTHING'")); + s.write("package.js", staging.replace(/~documentation~/g, "'NOTHING'")); var run = s.run("show", name); await run.matchErr("Documentation not found"); await run.expectExit(1); @@ -987,15 +1083,15 @@ selftest.define("tilde version constraints", [], async function () { await run.match("running at"); run.waitSecs(60); - var packages = s.read(".meteor/packages") - .replace(/\n*$/m, "\n"); + var packages = s.read(".meteor/packages").replace(/\n*$/m, "\n"); function setTopLevelConstraint(constraint) { s.write( ".meteor/packages", - packages + "tilde-constraints" + ( - constraint ? "@" + constraint : "" - ) + "\n" + packages + + "tilde-constraints" + + (constraint ? "@" + constraint : "") + + "\n" ); } @@ -1015,11 +1111,15 @@ selftest.define("tilde version constraints", [], async function () { run.waitSecs(10); setTopLevelConstraint("0.4.3"); - await run.match("error: No version of tilde-constraints satisfies all constraints"); + await run.match( + "error: No version of tilde-constraints satisfies all constraints" + ); run.waitSecs(10); setTopLevelConstraint("~0.4.3"); - await run.match("error: No version of tilde-constraints satisfies all constraints"); + await run.match( + "error: No version of tilde-constraints satisfies all constraints" + ); run.waitSecs(10); setTopLevelConstraint("0.3.0"); @@ -1028,35 +1128,35 @@ selftest.define("tilde version constraints", [], async function () { run.waitSecs(10); setTopLevelConstraint("~0.3.0"); - await run.match("error: No version of tilde-constraints satisfies all constraints"); + await run.match( + "error: No version of tilde-constraints satisfies all constraints" + ); run.waitSecs(10); setTopLevelConstraint("0.5.0"); - await run.match("error: No version of tilde-constraints satisfies all constraints"); + await run.match( + "error: No version of tilde-constraints satisfies all constraints" + ); run.waitSecs(10); setTopLevelConstraint("~0.5.0"); - await run.match("error: No version of tilde-constraints satisfies all constraints"); + await run.match( + "error: No version of tilde-constraints satisfies all constraints" + ); run.waitSecs(10); - s.write( - ".meteor/packages", - packages - ); + s.write(".meteor/packages", packages); await run.match(/tilde-constraints.*removed/); run.waitSecs(10); - s.write( - ".meteor/packages", - packages + "tilde-dependent\n" - ); + s.write(".meteor/packages", packages + "tilde-dependent\n"); await run.match(/tilde-constraints.*added, version 0\.4\.2/); await run.match(/tilde-dependent.*added, version 0\.1\.0/); await run.match("tilde-constraints.js"); await run.match("tilde-dependent.js"); run.waitSecs(10); - var depPackageJsPath = "packages/tilde-dependent/package.js" + var depPackageJsPath = "packages/tilde-dependent/package.js"; var depPackageJs = s.read(depPackageJsPath); function setDepConstraint(constraint) { @@ -1064,9 +1164,7 @@ selftest.define("tilde version constraints", [], async function () { depPackageJsPath, depPackageJs.replace( /tilde-constraints[^"]*/g, // Syntax highlighting hack: " - "tilde-constraints" + ( - constraint ? "@" + constraint : "" - ) + "tilde-constraints" + (constraint ? "@" + constraint : "") ) ); } @@ -1142,15 +1240,15 @@ selftest.define("override version constraints", [], async function () { await run.match("running at"); run.waitSecs(60); - let packages = s.read(".meteor/packages") - .replace(/\n*$/m, "\n"); + let packages = s.read(".meteor/packages").replace(/\n*$/m, "\n"); function setTopLevelConstraint(constraint) { s.write( ".meteor/packages", - packages + "override-constraints" + ( - constraint ? "@" + constraint : "" - ) + "\n" + packages + + "override-constraints" + + (constraint ? "@" + constraint : "") + + "\n" ); } @@ -1177,7 +1275,9 @@ selftest.define("override version constraints", [], async function () { await checkRestarted(); async function checkNoSatisfyingVersion() { - await run.match("error: No version of override-constraints satisfies all constraints"); + await run.match( + "error: No version of override-constraints satisfies all constraints" + ); run.waitSecs(10); } @@ -1248,8 +1348,7 @@ selftest.define("override version constraints", [], async function () { await run.match("override-conflicts.js"); await checkRestarted(); - const conflictingPackageJs = - s.read("packages/override-conflicts/package.js"); + const conflictingPackageJs = s.read("packages/override-conflicts/package.js"); function setConflictingConstraint(statement) { s.write( @@ -1268,8 +1367,10 @@ selftest.define("override version constraints", [], async function () { await checkRestarted(); setConflictingConstraint('api.use("override-constraints@=1.4.0");'); - await run.match("Constraint override-constraints@=1.4.0 is not satisfied by " + - "override-constraints 1.5.3"); + await run.match( + "Constraint override-constraints@=1.4.0 is not satisfied by " + + "override-constraints 1.5.3" + ); run.waitSecs(10); setTopLevelConstraint("1.5.0!"); @@ -1278,8 +1379,10 @@ selftest.define("override version constraints", [], async function () { // Constraints imposed elsewhere are still enforced as minimums, so the // @1.5.0! override syntax can't do anything about this constraint: setConflictingConstraint('api.use("override-constraints@1.6.0");'); - await run.match("Constraint override-constraints@1.6.0 is not satisfied by " + - "override-constraints 1.5.3"); + await run.match( + "Constraint override-constraints@1.6.0 is not satisfied by " + + "override-constraints 1.5.3" + ); run.waitSecs(10); setConflictingConstraint('api.use("override-constraints@1.5.0");'); @@ -1289,13 +1392,17 @@ selftest.define("override version constraints", [], async function () { await checkRestarted(); setConflictingConstraint('api.use("override-constraints@0.9.0");'); - await run.match("Constraint override-constraints@0.9.0 is not satisfied by " + - "override-constraints 1.5.3"); + await run.match( + "Constraint override-constraints@0.9.0 is not satisfied by " + + "override-constraints 1.5.3" + ); run.waitSecs(10); setTopLevelConstraint("0.9.0||1.5.3"); - await run.match("Constraint override-constraints@0.9.0 is not satisfied by " + - "override-constraints 1.5.3"); + await run.match( + "Constraint override-constraints@0.9.0 is not satisfied by " + + "override-constraints 1.5.3" + ); run.waitSecs(10); setTopLevelConstraint("1.4.0!"); @@ -1308,16 +1415,20 @@ selftest.define("override version constraints", [], async function () { await checkRestarted(); setTopLevelConstraint("1.5.3"); - await run.match("Constraint override-constraints@0.9.0 is not satisfied by " + - "override-constraints 1.5.3"); + await run.match( + "Constraint override-constraints@0.9.0 is not satisfied by " + + "override-constraints 1.5.3" + ); run.waitSecs(10); setTopLevelConstraint(""); - await run.match("Constraint override-constraints@0.9.0 is not satisfied by " + - "override-constraints 1.5.3"); + await run.match( + "Constraint override-constraints@0.9.0 is not satisfied by " + + "override-constraints 1.5.3" + ); run.waitSecs(10); - setConflictingConstraint('// PLACEHOLDER'); + setConflictingConstraint("// PLACEHOLDER"); await checkRestarted(); await run.stop(); From 2e2c9917bc26ab71494ec480e7cf218ad53d6f5c Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Fri, 31 Mar 2023 16:51:52 -0300 Subject: [PATCH 34/37] wip --- tools/tests/package-tests.js | 8 ++++---- tools/tool-testing/matcher.js | 33 ++++++++++++++++++--------------- tools/tool-testing/sandbox.js | 2 +- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/tools/tests/package-tests.js b/tools/tests/package-tests.js index f785cf3fb9..794e0f5c94 100644 --- a/tools/tests/package-tests.js +++ b/tools/tests/package-tests.js @@ -1192,19 +1192,19 @@ selftest.define("tilde version constraints", [], async function () { // which is a larger (preexisting) problem we should investigate. /* setDepConstraint("=0.4.0"); - run.match("error: No version of tilde-constraints satisfies all constraints"); + await run.match("error: No version of tilde-constraints satisfies all constraints"); run.waitSecs(10); setDepConstraint("~0.3.0"); - run.match("error: No version of tilde-constraints satisfies all constraints"); + await run.match("error: No version of tilde-constraints satisfies all constraints"); run.waitSecs(10); setDepConstraint("0.4.3"); - run.match("error: No version of tilde-constraints satisfies all constraints"); + await run.match("error: No version of tilde-constraints satisfies all constraints"); run.waitSecs(10); setDepConstraint("~0.4.3"); - run.match("error: No version of tilde-constraints satisfies all constraints"); + await run.match("error: No version of tilde-constraints satisfies all constraints"); run.waitSecs(10); */ diff --git a/tools/tool-testing/matcher.js b/tools/tool-testing/matcher.js index 3873b5cf88..c4b1342242 100644 --- a/tools/tool-testing/matcher.js +++ b/tools/tool-testing/matcher.js @@ -16,10 +16,10 @@ export default class Matcher { }); } - write(data) { + async write(data) { this.buf += data; this.fullBuffer += data; - this._tryMatch(); + await this._tryMatch(); } getFullBuffer() { @@ -64,7 +64,7 @@ export default class Matcher { } // Like match, but returns a Promise without calling .await(). - matchAsync(pattern, { + async matchAsync(pattern, { timeout = null, strict = false, matchFullBuffer = false, @@ -76,7 +76,7 @@ export default class Matcher { this.matchStrict = strict; this.matchFullBuffer = matchFullBuffer; const mp = this.matchPromise = makeFulfillablePromise(); - this._tryMatch(); // could clear this.matchPromise + await this._tryMatch(); // could clear this.matchPromise let timer = null; if (timeout) { @@ -92,13 +92,16 @@ export default class Matcher { return mp; } - return mp.then((result) => { - clearTimeout(timer); - return result; - }, (error) => { - clearTimeout(timer); - throw error; - }); + return mp.then( + (result) => { + clearTimeout(timer); + return result; + }, + (error) => { + clearTimeout(timer); + throw error; + } + ); } matchBeforeEnd(pattern, timeout) { @@ -119,9 +122,9 @@ export default class Matcher { endAsync() { this.resolveEndPromise(); - return this._beforeEnd(() => { + return this._beforeEnd(async () => { this.ended = true; - this._tryMatch(); + await this._tryMatch(); return this.matchPromise; }); } @@ -133,7 +136,7 @@ export default class Matcher { } } - _tryMatch() { + async _tryMatch() { const mp = this.matchPromise; if (! mp) { return; @@ -179,7 +182,7 @@ export default class Matcher { } if (ret !== null) { - this.resolveMatch(ret); + await this.resolveMatch(ret); return; } diff --git a/tools/tool-testing/sandbox.js b/tools/tool-testing/sandbox.js index 24835d0bcd..375bcd8484 100644 --- a/tools/tool-testing/sandbox.js +++ b/tools/tool-testing/sandbox.js @@ -272,7 +272,7 @@ export default class Sandbox { if (callback) { const ret = callback(); if (ret && typeof ret.then === "function") { - return ret.then(() => this.cwd = previous); + return ret.then(() => (this.cwd = previous)); } else { this.cwd = previous; } From e66650a173a013d310d534a75e7c7d62dfc448be Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 3 Apr 2023 09:50:13 -0300 Subject: [PATCH 35/37] chore: updated yaml to run test 11 --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 70ea05d287..e9401a19c3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -709,6 +709,7 @@ jobs: <<: *run_env_change - attach_workspace: at: . + - run: *set_fibers_env - run: name: "Print environment" command: printenv @@ -911,6 +912,7 @@ workflows: requires: - Get Ready - Test Group 11: + <<: *matrix_for_fibers requires: - Get Ready - Clean Up: From a64b7275121d4d81e4a82a0252c50db9eed26894 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 3 Apr 2023 10:47:33 -0300 Subject: [PATCH 36/37] tests: solved matcher --- tools/tool-testing/matcher.js | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/tools/tool-testing/matcher.js b/tools/tool-testing/matcher.js index c4b1342242..62fd1de0c2 100644 --- a/tools/tool-testing/matcher.js +++ b/tools/tool-testing/matcher.js @@ -70,13 +70,24 @@ export default class Matcher { matchFullBuffer = false, }) { if (this.matchPromise) { - return Promise.reject(new Error("already have a match pending?")); + // wait a bit to let the matcher catch up + const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + await sleep(100); + + this._tryMatch(); // could clear this.matchPromise + + // If we still have a matchPromise, then we have a problem. + // you should check who is calling. + if (this.matchPromise) { + return Promise.reject(new Error("already have a match pending?")) + } } this.matchPattern = pattern; this.matchStrict = strict; this.matchFullBuffer = matchFullBuffer; - const mp = this.matchPromise = makeFulfillablePromise(); - await this._tryMatch(); // could clear this.matchPromise + this.matchPromise = makeFulfillablePromise(); + const mp = this.matchPromise; + this._tryMatch(); // could clear this.matchPromise let timer = null; if (timeout) { @@ -117,14 +128,14 @@ export default class Matcher { } end() { - return this.endAsync().await(); + return this.endAsync(); } endAsync() { this.resolveEndPromise(); return this._beforeEnd(async () => { this.ended = true; - await this._tryMatch(); + this._tryMatch(); return this.matchPromise; }); } @@ -182,7 +193,7 @@ export default class Matcher { } if (ret !== null) { - await this.resolveMatch(ret); + this.resolveMatch(ret); return; } From 18bbb63c0af51a2f9b25fecefe76a7a7ce0b008c Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 3 Apr 2023 12:46:20 -0300 Subject: [PATCH 37/37] tests: updated what was missing --- packages/minimongo/minimongo_tests_client.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/minimongo/minimongo_tests_client.js b/packages/minimongo/minimongo_tests_client.js index 44215d640e..4cb98be4f4 100644 --- a/packages/minimongo/minimongo_tests_client.js +++ b/packages/minimongo/minimongo_tests_client.js @@ -1895,12 +1895,12 @@ Tinytest.addAsync('minimongo - observe ordered with projection', async test => { test.equal(operations.shift(), undefined); const cursor = c.find({}, {fields: {a: 1, _id: 0}}); - await test.throwsAsync(async () => { - await cursor.observeChanges({ added() {} }); - }); - test.throws(() => { - cursor.observe({ added() {} }); - }); + test.throws(() => { + cursor.observeChanges({ added() {} }); + }); + test.throws(() => { + cursor.observe({ added() {} }); + }); // test initial inserts (and backwards sort) handle = c.find({}, {sort: {a: -1}, fields: { a: 1 } }).observe(cbs);