Merge branch 'release-3.0' into feature/fix-oauth-ui-methods

This commit is contained in:
Jan Dvorak
2024-03-25 15:45:40 +01:00
committed by GitHub
239 changed files with 1604 additions and 2043 deletions

View File

@@ -178,7 +178,7 @@ jobs:
command: |
eval $PRE_TEST_COMMANDS;
cd dev_bundle/lib
../../meteor npm install @types/node@20.9.0 --save-dev
../../meteor npm install @types/node@20.10.5 --save-dev
# Ensure that meteor/tools has no TypeScript errors.
../../meteor npm install -g typescript
cd ../../
@@ -390,7 +390,7 @@ jobs:
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}|--svelte|--vue|--typescript|--apollo|--solid|--full" \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/3.xml \
--without-tag "custom-warehouse"

View File

@@ -11,9 +11,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: 14.x
node-version: 20.x
- run: npm ci
- name: Run ESLint@8
run: npx eslint@8 "./npm-packages/meteor-installer/**/*.js"

View File

@@ -7,9 +7,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: 18.x
node-version: 20.x
- run: cd scripts/admin/check-legacy-syntax && npm ci
- name: Check syntax
run: cd scripts/admin/check-legacy-syntax && node check-syntax.js
run: cd scripts/admin/check-legacy-syntax && node check-syntax.js

View File

@@ -11,7 +11,7 @@ jobs:
working-directory: docs/
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: 12.x
- name: Build the Docs

View File

@@ -11,7 +11,7 @@ jobs:
working-directory: guide/
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: 12.x
- name: Build the Guide

View File

@@ -18,11 +18,11 @@ jobs:
working-directory: npm-packages/eslint-plugin-meteor
strategy:
matrix:
node-version: [16.x, 18.x]
node-version: 20.x
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm

View File

@@ -18,11 +18,11 @@ jobs:
working-directory: npm-packages/meteor-babel
strategy:
matrix:
node-version: [16.x, 18.x]
node-version: 20.x
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm

View File

@@ -18,11 +18,11 @@ jobs:
working-directory: npm-packages/meteor-promise
strategy:
matrix:
node-version: [12.x, 14.x]
node-version: [14.x, 20.x]
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm

View File

@@ -4,7 +4,7 @@ dist: jammy
sudo: required
services: xvfb
node_js:
- "18.16.0"
- "20.10.0"
cache:
directories:
- ".meteor"

View File

@@ -389,6 +389,7 @@
if the cursor is ready and if the callbacks are have been called.
If you only use it in the `Client` or as a `LocalCollection` things have not
changed.
- `cursor.observeChangesAsync` and `cursor.observeAsync` are added and resolve as promises, returning results similar to their synchronous counterparts.
- `mobile-experience@2.0.0`:
@@ -431,6 +432,7 @@
- Updated to unify methods, `update`,`insert`,`remove`, `fetch` are now async, they are
the same as their `*Async` counterpart.
- `ensureIndex` and `createIndex` are now async.
- `observeChangesAsync` and `observeAsync` are added and resolve as promises, returning results similar to their synchronous counterparts.
- `npm-mongo@5.0.0`:
@@ -665,6 +667,9 @@
- `Meteor.callAsync()`
- `meteor`:
- Added `Meteor.isDebug` to execute code in debug builds, activated with the --inspect mode.
- `minifier-css`: (2.9+)
- `CssTools.minifyCssAsync()`

View File

@@ -10,8 +10,8 @@ assets, which are located in the `private` subdirectory of an application's
tree. Assets are not processed as source files and are copied directly
into your application's bundle.
{% apibox "Assets.getText" %}
{% apibox "Assets.getBinary" %}
{% apibox "Assets.getTextAsync" %}
{% apibox "Assets.getBinaryAsync" %}
{% apibox "Assets.absoluteFilePath" %}
Static server assets are included by placing them in the application's `private`
@@ -20,7 +20,7 @@ directory called `nested` with a file called `data.txt` inside it, then server
code can read `data.txt` by running:
```js
const data = Assets.getText('nested/data.txt');
const data = await Assets.getTextAsync('nested/data.txt');
```
Note: Packages can only access their own assets. If you need to read the assets of a different package, or of the enclosing app, you need to get a reference to that package's `Assets` object.

View File

@@ -80,7 +80,7 @@ package) so that Meteor will pick up the local dependency.
> In a lifecycle of a package there might come time to end the development for various reasons, or
it gets superseded. In either case Meteor allows you to easily notify the users of the package by
setting the deprecated flag to true: `deprecated: true` in the package description. In addition, you
replace it with a string that tells the users where to find replacement or what to do.
replace it with a string that tells the users where to find replacement or what to do.
Provide basic package information with `Package.describe(options)`. To publish a
package, you must define `summary` and `version`.
@@ -97,7 +97,7 @@ package is exported to.
{% apibox "PackageAPI#versionsFrom" %}
> Choose Meteor versions carefully. First determine the minimum version of Meteor you need for the API you use in your package.
This should be based on specific needs of your package like needed the *Async calls, which would require minimum version to be
This should be based on specific needs of your package like needed the *Async calls, which would require minimum version to be
at least 2.8. Another example are where packages had a major version bump, for example this has happened with the accounts packages
in Meteor 2.3. If you want to be backward and forward compatible it is good to include Meteor version before 2.3 and then 2.3.6 in the array.
A general recommendation for most compatibility for accounts packages (unless you need API that was affected in Meteor 2.3) is to have the following
@@ -315,7 +315,7 @@ methods are available:
- `addAsset` - Add a file to serve as-is to the browser or to include on the
browser, depending on the target. On the web, it will be served at the exact
path requested. For server targets, it can be retrieved using
`Assets.getText` or `Assets.getBinary`.
`Assets.getTextAsync` or `Assets.getBinaryAsync`.
- `addHtml` - Works in web targets only. Add markup to the `head` or `body`
section of the document.
- `hmrAvailable` - Returns true if the file can be updated with HMR. Among other things,

View File

@@ -37,7 +37,7 @@ id.
On the client, you must pass `password` and at least one of `username` or `email` — enough information for the user to be able to log in again later. If there are existing users with a username or email only differing in case, `createUser` will fail. The callback's `error.reason` will be `'Username already exists.'` or `'Email already exists.'` In the latter case, the user can then either [login](accounts.html#Meteor-loginWithPassword) or [reset their password](#Accounts-resetPassword).
On the server, you do not need to specify `password`, but the user will not be able to log in until it has a password (eg, set with [`Accounts.setPassword`](#accounts_setpassword)). To create an account without a password on the server and still let the user pick their own password, call `createUser` with the `email` option and then call [`Accounts.sendEnrollmentEmail`](#accounts_sendenrollmentemail). This will send the user an email with a link to set their initial password.
On the server, you do not need to specify `password`, but the user will not be able to log in until it has a password (eg, set with [`Accounts.setPasswordAsync`](#accounts_setpasswordasync)). To create an account without a password on the server and still let the user pick their own password, call `createUser` with the `email` option and then call [`Accounts.sendEnrollmentEmail`](#accounts_sendenrollmentemail). This will send the user an email with a link to set their initial password.
By default the `profile` option is added directly to the new user document. To
override this behavior, use [`Accounts.onCreateUser`](#accounts_oncreateuser).
@@ -100,7 +100,7 @@ This function accepts tokens passed into the callbacks registered with
If the user trying to reset the password has 2FA enabled, this error will be thrown:
* "Changed password, but user not logged in because 2FA is enabled [2fa-enabled]": No longer signing in the user automatically if the user has 2FA enabled.
{% apibox "Accounts.setPassword" %}
{% apibox "Accounts.setPasswordAsync" %}
{% apibox "Accounts.sendResetPasswordEmail" %}

View File

@@ -285,20 +285,6 @@ You can also use Vue 3 with Vite by using the [jorgenvatle:meteor-vite](https://
package. You can see an example on the [meteor-vite](https://github.com/JorgenVatle/meteor-vite/tree/release/examples/vue)
repository.
<h3 id="vue-2">--vue-2</h3>
The command `meteor create --vue-2 app-name` creates a Meteor app with [Vue 2](https://v2.vuejs.org/) and
[MongoDB](https://www.mongodb.com/). To create a complete app, including testing and deployment, follow the
[Vue 2 tutorial](https://vue-tutorial.meteor.com/).
Npm packages included: `@babel/runtime`, `meteor-node-stubs`, `vue`, `vue-meteor-tracker`.
Meteor packages included: `meteor-base`, `mobile-experience`, `mongo`, `reactive-var`, `standard-minifier-css`,
`standard-minifier-js`, `es5-shim`, `ecmascript`, `typescript`, `shell-server`, `tracker`, `static-html`, `akryum:vue-component`,
`meteortesting:mocha`, `johanbrook:publication-collector`.
<h2 id="meteorgenerate"> meteor generate </h2>
``meteor generate`` is a command for generating scaffolds for your current project. When ran without arguments, it will ask

View File

@@ -2,7 +2,6 @@
title: Docs
---
> Meteor 2.x runs on a deprecated Node.js version (14). Meteor 3.0 is in progress, and it will run on the latest Node.js version. For more information, please consult our [migration guide](https://guide.meteor.com/3.0-migration.html).
<!-- XXX: note that this content is somewhat duplicated on the guide, and should be updated in parallel -->
<h2 id="what-is-meteor">What is Meteor?</h2>
@@ -24,11 +23,11 @@ Meteor is a full-stack JavaScript platform for developing modern web and mobile
1. The place to get started with Meteor is the [tutorials page](https://www.meteor.com/developers/tutorials).
1. [Meteor Examples](https://github.com/meteor/examples) is a list of examples using Meteor. You can also include your example with Meteor.
1. Once you are familiar with the basics, the [Meteor Guide](http://guide.meteor.com) covers intermediate material on how to use Meteor in a larger scale app.
1. Visit the [Meteor discussion forums](https://forums.meteor.com) to announce projects, get help, talk about the community, or discuss changes to core.
1. [Meteor Slack Community](https://join.slack.com/t/meteor-community/shared_invite/enQtODA0NTU2Nzk5MTA3LWY5NGMxMWRjZDgzYWMyMTEyYTQ3MTcwZmU2YjM5MTY3MjJkZjQ0NWRjOGZlYmIxZjFlYTA5Mjg4OTk3ODRiOTc) is the best place to ask (and answer!) technical questions and also meet Meteor developers.
1. [Atmosphere](https://atmospherejs.com) is the repository of community packages designed especially for Meteor.

View File

@@ -8,7 +8,6 @@ You need to install the Meteor command line tool to create, run, and manage your
<h3 id="prereqs-node">Node.js version</h3>
> Meteor 2.x runs on a deprecated Node.js version (14). Meteor 3.0 is in progress, and it will run on the latest Node.js version. For more information, please consult our [migration guide](https://guide.meteor.com/3.0-migration.html).
- Node.js version >= 10 and <= 14 is required.
- We recommend you using [nvm](https://github.com/nvm-sh/nvm) or [Volta](https://volta.sh/) for managing Node.js versions.

View File

@@ -3,19 +3,27 @@ title: Migrating to Meteor 3.0
description: How to migrate your application to Meteor 3.0.
---
> **This guide will be created as we get closer to the Meteor 3.0 beta release.** We are also evaluating new documentation platforms to improve our users' experience.
> This guide will be created as we approach the Meteor 3.0 release.
> We're in the process of moving our documentation to Vitepress,
> and updating the Meteor API docs for version 3.0. For the latest updates,
> visit https://v3-docs.meteor.com/.
## What's the status of version 3.0?
**Latest version:** `3.0-beta.0` <br/>
**Node.js version:** `20.9.0 LTS`
**Latest version:** `3.0-beta.6` <br/>
**Node.js version:** `20.11.1 LTS` <br />
**NPM version:** `10.2.4`
Meteor 3.0 is in alpha and not recommended for production. You can check the "[Release 3.0 Pull Request](https://github.com/meteor/meteor/pull/12359)" to see what is being changed.
Meteor 3.0 is in beta and not recommended for production. You can check the "[Release 3.0 Pull Request](https://github.com/meteor/meteor/pull/12359)" to see what is being changed.
## How to prepare for version 3.0?
You can follow the guide "[How to migrate to Meteor Async in Meteor 2.x](/prepare-meteor-3.0.html)" to help you prepare your application for the new version by starting to use async methods.
## How to follow the progress on version 3?
The best way to follow the progress is by checking the "[What's left until an official Meteor 3.0?](https://github.com/meteor/meteor/discussions/12865)" discussion. We have also been sharing constant updates on [this topic](https://forums.meteor.com/t/fibers-public-roadmap-and-meteor-3-0/59627/84) in our forum.
## Frequently Asked Questions
### What is Fibers?
@@ -112,7 +120,15 @@ findOne is not available on the server. Please use findOneAsync instead.
You can create a new Meteor 3.0 project by running the command below:
```bash
meteor create my-new-project --release 3.0-beta.0
meteor create my-new-project --release 3.0-beta.6
```
or alternatively, you can use `npx`
If you want to test Meteor v3, you can use the following command to install it:
```bash
npx meteor@beta
```
### How to update from version 2?
@@ -120,13 +136,9 @@ meteor create my-new-project --release 3.0-beta.0
You can update your Meteor 2.x project by running the command below inside your project folder:
```bash
meteor update --release 3.0-beta.0
meteor update --release 3.0-beta.6
```
### How to follow the progress on version 3?
The best way to follow the progress is by checking the "[What's left until an official Meteor 3.0?](https://github.com/meteor/meteor/discussions/12865)" discussion. We have also been sharing constant updates on [this topic](https://forums.meteor.com/t/fibers-public-roadmap-and-meteor-3-0/59627/84) in our forum.
### When will Meteor 3.0 be ready?
We plan to release the beta version by the end of Q4 2023. An official version will depend a lot on user feedback, but we aim to release it by the end of Q1 2024.

View File

@@ -3,7 +3,6 @@ title: Introduction
description: This is the guide for using Meteor, a full-stack JavaScript platform for developing modern web and mobile applications.
---
> Meteor 2.x runs on a deprecated Node.js version (14). Meteor 3.0 is in progress, and it will run on the latest Node.js version. For more information, please consult our [migration guide](https://guide.meteor.com/3.0-migration.html).
<!-- XXX: note that this content is somewhat duplicated on the docs, and should be updated in parallel -->
<h2 id="what-is-meteor">What is Meteor?</h2>
@@ -44,11 +43,11 @@ meteor
1. The place to get started with Meteor is the [tutorials page](https://www.meteor.com/developers/tutorials).
1. [Meteor Examples](https://github.com/meteor/examples) is a list of examples using Meteor. You can also include your example with Meteor.
1. Once you are familiar with the basics, the [Meteor Guide](http://guide.meteor.com) covers intermediate material on how to use Meteor in a larger scale app.
1. Visit the [Meteor discussion forums](https://forums.meteor.com) to announce projects, get help, talk about the community, or discuss changes to core.
1. [Meteor Slack Community](https://join.slack.com/t/meteor-community/shared_invite/enQtODA0NTU2Nzk5MTA3LWY5NGMxMWRjZDgzYWMyMTEyYTQ3MTcwZmU2YjM5MTY3MjJkZjQ0NWRjOGZlYmIxZjFlYTA5Mjg4OTk3ODRiOTc) is the best place to ask (and answer!) technical questions and also meet Meteor developers.
1. [Atmosphere](https://atmospherejs.com) is the repository of community packages designed especially for Meteor.

2
meteor
View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash
BUNDLE_VERSION=20.11.1.1
BUNDLE_VERSION=20.11.1.2
# OS Check. Put here because here is where we download the precompiled

View File

@@ -1,12 +1,12 @@
{
"name": "@meteorjs/babel",
"version": "7.19.0-beta.4",
"version": "7.20.0-beta.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@meteorjs/babel",
"version": "7.19.0-beta.4",
"version": "7.20.0-beta.4",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.17.2",
@@ -26,7 +26,7 @@
"convert-source-map": "^1.6.0",
"lodash": "^4.17.21",
"meteor-babel-helpers": "0.0.3",
"typescript": "~5.3.3"
"typescript": "~5.4.3"
},
"devDependencies": {
"@babel/plugin-proposal-decorators": "7.14.5",
@@ -3756,9 +3756,9 @@
}
},
"node_modules/typescript": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
"version": "5.4.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz",
"integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"

View File

@@ -1,7 +1,7 @@
{
"name": "@meteorjs/babel",
"author": "Meteor <dev@meteor.com>",
"version": "7.19.0-beta.4",
"version": "7.20.0-beta.4",
"license": "MIT",
"type": "commonjs",
"description": "Babel wrapper package for use with Meteor",
@@ -48,7 +48,7 @@
"convert-source-map": "^1.6.0",
"lodash": "^4.17.21",
"meteor-babel-helpers": "0.0.3",
"typescript": "~5.3.3"
"typescript": "~5.4.3"
},
"devDependencies": {
"@babel/plugin-proposal-decorators": "7.14.5",

View File

@@ -1,10 +1,10 @@
#!/usr/bin/env node
const command = process.argv[2];
const command = process.argv[2] || 'install';
if (!command) {
console.log(`
Usage: meteor-installer <command>
Usage: npx meteor@<version> <command>
Commands:
install

View File

@@ -1,7 +1,7 @@
const os = require('os');
const path = require('path');
const METEOR_LATEST_VERSION = '3.0-beta.6';
const METEOR_LATEST_VERSION = '3.0-beta.7';
const sudoUser = process.env.SUDO_USER || '';
function isRoot() {
return process.getuid && process.getuid() === 0;

View File

@@ -45,7 +45,9 @@ if (!semver.satisfies(process.version, nodeVersion)) {
);
}
const isInstalledGlobally = process.env.npm_config_global === 'true';
const isInstalledGlobally =
process.env.npm_config_global === 'true' ||
process.env.npm_lifecycle_event === 'npx';
if (!isInstalledGlobally) {
console.error('******************************************');
@@ -55,7 +57,7 @@ if (!isInstalledGlobally) {
console.error('Make sure you pass -g to npm install.');
console.error('Aborting...');
console.error('******************************************');
process.exit(1);
process.exit(0);
}
process.on('unhandledRejection', err => {
throw err;
@@ -121,8 +123,8 @@ if (fs.existsSync(startedPath)) {
console.log(
`If you want to reinstall it, run:
$ meteor-installer uninstall
$ meteor-installer install
$ npx meteor uninstall
$ npx meteor@<version> install
`,
);
process.exit();
@@ -316,7 +318,7 @@ function showGettingStarted() {
const exportCommand = `export PATH=${meteorPath}:$PATH`;
const runCommand = isWindows()
? `set path "${meteorPath}/;%path%`
? `set path "${meteorPath}/;%path%"`
: exportCommand;
const message = `
***************************************

View File

@@ -1,12 +1,12 @@
{
"name": "meteor",
"version": "2.14.0",
"version": "3.0.0-beta.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "meteor",
"version": "2.14.0",
"version": "3.0.0-beta.6",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@@ -14,7 +14,7 @@
"cli-progress": "^3.11.1",
"https-proxy-agent": "^5.0.1",
"node-7z": "^2.1.2",
"node-downloader-helper": "^1.0.19",
"node-downloader-helper": "^2.1.9",
"rimraf": "^3.0.2",
"semver": "^7.3.7",
"tar": "^6.1.11",
@@ -24,8 +24,8 @@
"meteor-installer": "cli.js"
},
"engines": {
"node": "<=14.x",
"npm": "<=6.x"
"node": "<=20.x",
"npm": "<=10.x"
}
},
"node_modules/7zip-bin": {
@@ -289,13 +289,14 @@
}
},
"node_modules/node-downloader-helper": {
"version": "1.0.19",
"license": "MIT",
"version": "2.1.9",
"resolved": "https://registry.npmjs.org/node-downloader-helper/-/node-downloader-helper-2.1.9.tgz",
"integrity": "sha512-FSvAol2Z8UP191sZtsUZwHIN0eGoGue3uEXGdWIH5228e9KH1YHXT7fN8Oa33UGf+FbqGTQg3sJfrRGzmVCaJA==",
"bin": {
"ndh": "bin/ndh"
},
"engines": {
"node": ">=6.9"
"node": ">=14.18"
}
},
"node_modules/normalize-path": {

View File

@@ -1,6 +1,6 @@
{
"name": "meteor",
"version": "3.0.0-beta.6",
"version": "3.0.0-beta.8",
"description": "Install Meteor",
"main": "install.js",
"scripts": {
@@ -14,7 +14,7 @@
"cli-progress": "^3.11.1",
"https-proxy-agent": "^5.0.1",
"node-7z": "^2.1.2",
"node-downloader-helper": "^1.0.19",
"node-downloader-helper": "^2.1.9",
"rimraf": "^3.0.2",
"semver": "^7.3.7",
"tar": "^6.1.11",

View File

@@ -2,9 +2,9 @@
"lockfileVersion": 4,
"dependencies": {
"@types/node": {
"version": "20.11.19",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz",
"integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ=="
"version": "20.11.30",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz",
"integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw=="
},
"@types/notp": {
"version": "2.0.5",

View File

@@ -1,5 +1,5 @@
Package.describe({
version: '3.0.0-beta300.6',
version: '3.0.0-beta300.7',
summary:
'Package used to enable two factor authentication through OTP protocol',
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'A user account system',
version: '3.0.0-beta300.6',
version: '3.0.0-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Login service for Facebook accounts",
version: "1.3.4-beta300.6",
version: "1.3.4-beta300.7",
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Login service for Github accounts',
version: '1.5.1-beta300.6',
version: '1.5.1-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Login service for Google accounts",
version: "1.4.1-beta300.6",
version: "1.4.1-beta300.7",
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Login service for Meetup accounts',
version: '1.5.1-beta300.6',
version: '1.5.1-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Login service for Meteor developer accounts',
version: '1.5.1-beta300.6',
version: '1.5.1-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Common code for OAuth-based login services",
version: "1.4.3-beta300.6",
version: "1.4.3-beta300.7",
});
Package.onUse(api => {

View File

@@ -5,7 +5,7 @@ Package.describe({
// 2.2.x in the future. The version was also bumped to 2.0.0 temporarily
// during the Meteor 1.5.1 release process, so versions 2.0.0-beta.2
// through -beta.5 and -rc.0 have already been published.
version: '3.0.0-beta300.6',
version: '3.0.0-beta300.7',
});
Npm.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'No-password login/sign-up support for accounts',
version: '3.0.0-beta300.6',
version: '3.0.0-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Login service for Twitter accounts",
version: "1.5.1-beta300.6",
version: "1.5.1-beta300.7",
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Unstyled version of login widgets',
version: '1.7.1-beta300.6',
version: '1.7.1-beta300.7',
});
Package.onUse(function(api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Simple templates to add login widgets to an app",
version: "1.4.3-beta300.6",
version: "1.4.3-beta300.7",
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Login service for Sina Weibo accounts",
version: "1.4.1-beta300.6",
version: "1.4.1-beta300.7",
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'allow-deny',
version: '2.0.0-beta300.6',
version: '2.0.0-beta300.7',
// Brief, one-line summary of the package.
summary: 'Implements functionality for allow/deny and client-side db operations',
// URL to the Git repository containing the source code for this package.

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Try to detect inadequate input sanitization",
version: '1.0.8-beta300.6'
version: '1.0.8-beta300.7'
});
// This package is empty; its presence is detected by livedata.

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "(For prototyping only) Publish the entire database to all clients",
version: '1.0.8-beta300.6'
version: '1.0.8-beta300.7'
});
// This package is empty; its presence is detected by several other packages

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Update the client when new client code is available',
version: '2.0.0-beta300.6',
version: '2.0.0-beta300.7',
});
Package.onUse(function(api) {

View File

@@ -1,11 +1,11 @@
Package.describe({
name: "babel-compiler",
summary: "Parser/transpiler for ECMAScript 2015+ syntax",
version: '7.11.0-beta300.6',
version: '7.11.0-beta300.7',
});
Npm.depends({
'@meteorjs/babel': '7.19.0-beta.4',
'@meteorjs/babel': '7.20.0-beta.4',
'json5': '2.1.1',
'semver': '7.3.8'
});

View File

@@ -1,7 +1,7 @@
Package.describe({
name: "babel-runtime",
summary: "Runtime support for output of Babel transpiler",
version: '1.5.2-beta300.6',
version: '1.5.2-beta300.7',
documentation: 'README.md'
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Base64 encoding and decoding",
version: '1.0.13-beta300.6',
version: '1.0.13-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Binary Heap datastructure implementation",
version: '1.0.12-beta300.6'
version: '1.0.12-beta300.7'
});
Package.onUse(api => {

View File

@@ -2,7 +2,7 @@ Package.describe({
// These tests are in a separate package so that we can Npm.depend on
// parse5, a html parsing library.
summary: "Tests for the boilerplate-generator package",
version: '1.5.2-beta300.6',
version: '1.5.2-beta300.7',
documentation: null
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Generates the boilerplate html from program's manifest",
version: '2.0.0-beta300.6',
version: '2.0.0-beta300.7',
});
Npm.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Common code for browser-policy packages",
version: '1.0.13-beta300.6',
version: '1.0.13-beta300.7',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Configure content security policies",
version: '2.0.0-beta300.6',
version: '2.0.0-beta300.7',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Restrict which websites can frame your app",
version: '1.1.3-beta300.6'
version: '1.1.3-beta300.7'
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Configure security policies enforced by the browser",
version: '1.1.3-beta300.6'
version: '1.1.3-beta300.7'
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'caching-compiler',
version: '2.0.0-beta300.6',
version: '2.0.0-beta300.7',
summary: 'An easy way to make compiler plugins cache',
documentation: 'README.md'
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Register callbacks on a hook",
version: '1.6.0-beta300.6',
version: '1.6.0-beta300.7',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Check whether a value matches a pattern',
version: '1.3.3-beta300.6',
version: '1.3.3-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Given the set of the constraints, picks a satisfying configuration",
version: '2.0.0-beta300.6',
version: '2.0.0-beta300.7',
});
Npm.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Core runtime to load packages and the app",
version: '1.0.0-beta300.6',
version: '1.0.0-beta300.7',
documentation: null
});

View File

@@ -1,7 +1,7 @@
Package.describe({
summary: "Makes your Cordova application use the Crosswalk WebView \
instead of the System WebView on Android",
version: '1.7.2-beta300.6',
version: '1.7.2-beta300.7',
documentation: null
});

View File

@@ -20,7 +20,7 @@ export const loadAsyncStubHelpers = () => {
queue = queue.finally(() => {
fn(resolve, reject);
return promise;
return promise.stubPromise;
});
promise.finally(() => {
@@ -89,25 +89,30 @@ export const loadAsyncStubHelpers = () => {
return queueFunction(
(resolve, reject) => {
let hasStub = false;
let finished = false;
Meteor._setImmediate(() => {
const applyAsyncPromise = oldApplyAsync.apply(this, args);
stubPromiseResolver(applyAsyncPromise.stubPromise);
serverPromiseResolver(applyAsyncPromise.serverPromise);
hasStub = !!applyAsyncPromise.stubPromise;
if (hasStub) {
applyAsyncPromise.stubPromise.finally(() => {
finished = true;
});
}
applyAsyncPromise
.then((result) => {
finished = true;
resolve(result);
})
.catch((err) => {
finished = true;
reject(err);
});
});
Meteor._setImmediate(() => {
if (!finished) {
if (hasStub && !finished) {
console.warn(
`Method stub (${name}) took too long and could cause unexpected problems. Learn more at https://github.com/zodern/fix-async-stubs/#limitations`
);

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Meteor's latency-compensated distributed data client",
version: '3.0.0-beta300.6',
version: '3.0.0-beta300.7',
documentation: null
});

View File

@@ -320,3 +320,22 @@ Tinytest.addAsync(
test.equal(serverEvents, ["server-only-sync", "publication"]);
}
);
Tinytest.addAsync(
"method interaction with unblocking mechanism",
async function (test) {
await Meteor.callAsync("getAndResetEvents");
await Promise.all([
Meteor.callAsync("unblockedMethod", { delay: 200 }), // unblock + sleep for 200 milliseconds
Meteor.callAsync("blockingMethod"), // run straight + block
]);
let serverEvents = await Meteor.callAsync("getAndResetEvents");
test.equal(
serverEvents,
["unblock start", "blockingMethod", "unblock end"],
"should have properly executed the unblocking mechanism"
);
}
);

View File

@@ -40,7 +40,16 @@ Meteor.methods({
events.push('callAsyncStubFromAsyncStub');
return 'server result';
}
},
async 'unblockedMethod'({ delay }) {
events.push('unblock start');
this.unblock();
await Meteor._sleepForMs(delay);
events.push('unblock end');
},
'blockingMethod'() {
events.push('blockingMethod');
},
});
Meteor.publish("simple-publication", function () {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Code shared beween ddp-client and ddp-server",
version: '1.4.1-beta300.6',
version: '1.4.1-beta300.7',
documentation: null
});

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'ddp-rate-limiter',
version: '1.2.1-beta300.6',
version: '1.2.1-beta300.7',
// Brief, one-line summary of the package.
summary: 'The DDPRateLimiter allows users to add rate limits to DDP' +
' methods and subscriptions.',

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Meteor's latency-compensated distributed data server",
version: '3.0.0-beta300.6',
version: '3.0.0-beta300.7',
documentation: null
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Meteor's latency-compensated distributed data framework",
version: '1.4.2-beta300.6'
version: '1.4.2-beta300.7'
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Enable the application cache in the browser",
version: '1.2.9-beta300.6',
version: '1.2.9-beta300.7',
deprecated: true,
});

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "context",
version: '1.0.0-beta300.6',
version: '1.0.0-beta300.7',
summary: "Manage contextual information without passing objects around",
documentation: "README.md",
deprecated: 'You should not be needing this package in Meteor 3'

View File

@@ -1,15 +1,15 @@
Package.describe({
summary: "Make HTTP calls to remote servers",
version: '3.0.0-beta300.6',
version: '3.0.0-beta300.7',
deprecated: 'Please use the fetch package'
});
Package.onUse(function (api) {
api.use([
'url@1.3.2',
'ecmascript@0.16.8-beta300.6',
'fetch@0.1.4-beta300.6',
'modules@0.19.1-beta300.6'
'ecmascript@0.16.8-beta300.7',
'fetch@0.1.4-beta300.7',
'modules@0.19.1-beta300.7'
]);
api.mainModule('httpcall_client.js', 'client');

View File

@@ -2,13 +2,13 @@
Package.describe({
summary: "Markdown-to-HTML processor",
version: "3.0.0-beta300.6",
version: "3.0.0-beta300.7",
deprecated: true,
documentation: 'README.md'
});
Package.onUse(function (api) {
api.use('ecmascript@0.16.8-beta300.6');
api.use('ecmascript@0.16.8-beta300.7');
api.use("templating@1.4.2", "client", {weak: true});
api.mainModule('template-integration.js', 'client');
});

View File

@@ -1,5 +1,5 @@
Package.describe({
version: '0.1.3-beta300.6',
version: '0.1.3-beta300.7',
summary: 'Show build errors in client when using HMR',
documentation: 'README.md',
devOnly: true

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "An implementation of a diff algorithm on arrays and objects.",
version: '1.1.3-beta300.6',
version: '1.1.3-beta300.7',
documentation: null
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Disables oplog tailing",
version: '1.0.8-beta300.6'
version: '1.0.8-beta300.7'
});
// This package is empty; its presence is detected by mongo-livedata.

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "dynamic-import",
version: "0.7.4-beta300.6",
version: "0.7.4-beta300.7",
summary: "Runtime support for Meteor 1.5 dynamic import(...) syntax",
documentation: "README.md"
});

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'ecmascript-runtime-client',
version: '0.12.2-beta300.6',
version: '0.12.2-beta300.7',
summary: 'Polyfills for new ECMAScript 2015 APIs like Map and Set',
git:
'https://github.com/meteor/meteor/tree/devel/packages/ecmascript-runtime-client',

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "ecmascript-runtime-server",
version: "0.11.1-beta300.6",
version: "0.11.1-beta300.7",
summary: "Polyfills for new ECMAScript 2015 APIs like Map and Set",
git: "https://github.com/meteor/meteor/tree/devel/packages/ecmascript-runtime-client",
documentation: "README.md"

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "ecmascript-runtime",
version: '0.8.2-beta300.6',
version: '0.8.2-beta300.7',
summary: "Polyfills for new ECMAScript 2015 APIs like Map and Set",
git: "https://github.com/meteor/ecmascript-runtime",
documentation: "README.md"

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'ecmascript',
version: '0.16.8-beta300.6',
version: '0.16.8-beta300.7',
summary: 'Compiler plugin that supports ES2015+ in all .js files',
documentation: 'README.md',
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Extended and Extensible JSON library',
version: '1.1.4-beta300.6',
version: '1.1.4-beta300.7',
});
Package.onUse(function onUse(api) {

View File

@@ -2,9 +2,9 @@
"lockfileVersion": 4,
"dependencies": {
"@types/node": {
"version": "20.11.20",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz",
"integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg=="
"version": "20.11.30",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz",
"integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw=="
},
"@types/nodemailer": {
"version": "6.4.7",

View File

@@ -24,7 +24,7 @@ export const EmailInternals = {
const MailComposer = EmailInternals.NpmModules.mailcomposer.module;
const makeTransport = async function (mailUrlString) {
const makeTransport = function (mailUrlString) {
const mailUrl = new URL(mailUrlString);
if (mailUrl.protocol !== 'smtp:' && mailUrl.protocol !== 'smtps:') {
@@ -103,31 +103,31 @@ const knownHostsTransport = function (settings = undefined, url = undefined) {
};
EmailTest.knowHostsTransport = knownHostsTransport;
const getTransport = async function () {
const getTransport = function () {
const packageSettings = Meteor.settings.packages?.email || {};
// We delay this check until the first call to Email.send, in case someone
// set process.env.MAIL_URL in startup code. Then we store in a cache until
// process.env.MAIL_URL changes.
const url = process.env.MAIL_URL;
if (
this.cacheKey === undefined ||
this.cacheKey !== url ||
this.cacheKey !== packageSettings.service ||
this.cacheKey !== 'settings'
globalThis.cacheKey === undefined ||
globalThis.cacheKey !== url ||
globalThis.cacheKey !== packageSettings.service ||
globalThis.cacheKey !== 'settings'
) {
if (
(packageSettings.service && wellKnow(packageSettings.service)) ||
(url && wellKnow(new URL(url).hostname)) ||
wellKnow(url?.split(':')[0] || '')
) {
this.cacheKey = packageSettings.service || 'settings';
this.cache = knownHostsTransport(packageSettings, url);
globalThis.cacheKey = packageSettings.service || 'settings';
globalThis.cache = knownHostsTransport(packageSettings, url);
} else {
this.cacheKey = url;
this.cache = url ? await makeTransport(url, packageSettings) : null;
globalThis.cacheKey = url;
globalThis.cache = url ? makeTransport(url, packageSettings) : null;
}
}
return this.cache;
return globalThis.cache;
};
let nextDevModeMailId = 0;
@@ -250,10 +250,9 @@ Email.sendAsync = async function (options) {
}
if (mailUrlEnv || mailUrlSettings) {
const transport = await getTransport();
await transport.sendMail(email);
return;
return getTransport().sendMail(email);
}
return devModeSendAsync(email, options);
};

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Send email messages',
version: '3.0.0-beta300.6',
version: '3.0.0-beta300.7',
});
Npm.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "es5-shim",
version: "4.8.1-beta300.6",
version: "4.8.1-beta300.7",
summary: "Shims and polyfills to improve ECMAScript 5 support",
documentation: "README.md"
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Blaze configuration templates for Facebook OAuth.",
version: '1.0.4-beta300.6',
version: '1.0.4-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Facebook OAuth flow",
version: '1.11.3-beta300.6'
version: '1.11.3-beta300.7'
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Publish internal app statistics",
version: '1.0.2-beta300.6',
version: '1.0.2-beta300.7',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Display internal app statistics",
version: '1.0.2-beta300.6',
version: '1.0.2-beta300.7',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "fetch",
version: '0.1.4-beta300.6',
version: '0.1.4-beta300.7',
summary: "Isomorphic modern/legacy/Node polyfill for WHATWG fetch()",
documentation: "README.md"
});

View File

@@ -157,9 +157,9 @@
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="
},
"hasown": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
"integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="
},
"ip": {
"version": "0.3.3",
@@ -299,9 +299,9 @@
"integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w=="
},
"object-is": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
"integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw=="
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
"integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q=="
},
"object-keys": {
"version": "1.1.1",
@@ -366,9 +366,9 @@
"integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="
},
"set-function-length": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
"integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g=="
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="
},
"set-function-name": {
"version": "2.0.2",

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Internal force-ssl common code.',
version: '1.1.1-beta300.6'
version: '1.1.1-beta300.7'
});
Npm.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Require this application to use HTTPS",
version: "1.1.1-beta300.6",
version: "1.1.1-beta300.7",
prodOnly: true
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'GeoJSON utility functions (from https://github.com/maxogden/geojson-js-utils)',
version: '1.0.12-beta300.6',
version: '1.0.12-beta300.7',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Blaze configuration templates for GitHub OAuth.',
version: '1.0.3-beta300.6',
version: '1.0.3-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'GitHub OAuth flow',
version: '1.4.2-beta300.6'
version: '1.4.2-beta300.7'
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Blaze configuration templates for Google OAuth.',
version: '1.0.4-beta300.6',
version: '1.0.4-beta300.7',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Google OAuth flow",
version: "1.4.5-beta300.6",
version: "1.4.5-beta300.7",
});
Cordova.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'hot-code-push',
version: '1.0.5-beta300.6',
version: '1.0.5-beta300.7',
// Brief, one-line summary of the package.
summary: 'Update the client in place when new code is available.',
// URL to the Git repository containing the source code for this package.

Some files were not shown because too many files have changed in this diff Show More