Merge branch 'release-3.0' into release-3.0-fix-package-tests

# Conflicts:
#	packages/deprecated/markdown/package.js
#	packages/non-core/blaze
This commit is contained in:
denihs
2023-06-14 14:37:46 -04:00
178 changed files with 555 additions and 433 deletions

View File

@@ -674,7 +674,7 @@ jobs:
--headless \
--junit ./tmp/results/junit/11.xml \
--without-tag "custom-warehouse"
no_output_timeout: 30m
no_output_timeout: 35m
- run:
<<: *run_save_node_bin
- store_test_results:

View File

@@ -61,6 +61,7 @@ sidebar_categories:
- api/packagejs
- api/mobile-config
- api/environment
- api/top-level-await
Packages:
- packages/accounts-ui
- packages/accounts-passwordless

View File

@@ -5,8 +5,6 @@
"packages/test-in-browser/diff_match_patch_uncompressed.js",
"packages/jquery/jquery.js",
"packages/underscore/underscore.js",
"packages/accounts-password/password_server.js",
"packages/webapp/webapp_server.js",
"packages/json/json2.js",
"packages/minimongo/minimongo_tests.js",
"tools/node_modules",
@@ -15,10 +13,6 @@
"guide",
"**/node_modules",
"npm-packages"
],
"include": [
"packages/accounts-password/password_server.docs.js",
"packages/webapp/webapp_server.docs.js"
]
},
"plugins": [ "plugins/markdown"],

View File

@@ -1,50 +0,0 @@
const fs = require("fs").promises;
// if we have more files with tla just add them here and make sure to add them
// as well to jsdoc-conf.json in the exclude section and their counterparts
// with .docs.js extension
const pathsWithTLA = [
"packages/accounts-password/password_server.js",
"packages/webapp/webapp_server.js",
];
/**
*
* @param {string} path
* @returns {Promise<[string, Error]>}
*/
async function getFile(path) {
try {
const data = await fs.readFile(path, "utf8");
return [data, null];
} catch (e) {
console.error(e);
return ["", e];
}
}
(async function () {
for (const path of pathsWithTLA) {
const [code, error] = await getFile(`../${path}`);
if (error) return "ERR";
/**
* @type {string[]}
*/
let file = [];
// the complexity of this is O(n^2) but it's not a big deal since we are only
// doing this for a few files.
for (line of code.split("\n")) {
// this is a hack to remove the await keyword from the top level.
if (line.startsWith("await")) {
line = line.replace("await", "");
}
file.push(line);
}
await fs.writeFile(
`../${path.replace(".js", ".docs.js")}`,
file.join("\n"),
"utf8"
);
}
})();

224
docs/package-lock.json generated
View File

@@ -4,6 +4,43 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@babel/parser": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.5.tgz",
"integrity": "sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ==",
"dev": true
},
"@jsdoc/salty": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz",
"integrity": "sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==",
"dev": true,
"requires": {
"lodash": "^4.17.21"
}
},
"@types/linkify-it": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
"integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
"dev": true
},
"@types/markdown-it": {
"version": "12.2.3",
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
"integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
"dev": true,
"requires": {
"@types/linkify-it": "*",
"@types/mdurl": "*"
}
},
"@types/mdurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
"integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
"dev": true
},
"JSONStream": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
@@ -559,20 +596,12 @@
"optional": true
},
"catharsis": {
"version": "0.8.11",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz",
"integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==",
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
"integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
"dev": true,
"requires": {
"lodash": "^4.17.14"
},
"dependencies": {
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
}
"lodash": "^4.17.15"
}
},
"center-align": {
@@ -2902,12 +2931,12 @@
}
},
"js2xmlparser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz",
"integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=",
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
"integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
"dev": true,
"requires": {
"xmlcreate": "^1.0.1"
"xmlcreate": "^2.0.4"
}
},
"jsbn": {
@@ -2918,35 +2947,50 @@
"optional": true
},
"jsdoc": {
"version": "3.5.5",
"resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz",
"integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==",
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz",
"integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==",
"dev": true,
"requires": {
"babylon": "7.0.0-beta.19",
"bluebird": "~3.5.0",
"catharsis": "~0.8.9",
"escape-string-regexp": "~1.0.5",
"js2xmlparser": "~3.0.0",
"klaw": "~2.0.0",
"marked": "~0.3.6",
"mkdirp": "~0.5.1",
"requizzle": "~0.2.1",
"strip-json-comments": "~2.0.1",
"taffydb": "2.6.2",
"underscore": "~1.8.3"
"@babel/parser": "^7.20.15",
"@jsdoc/salty": "^0.2.1",
"@types/markdown-it": "^12.2.3",
"bluebird": "^3.7.2",
"catharsis": "^0.9.0",
"escape-string-regexp": "^2.0.0",
"js2xmlparser": "^4.0.2",
"klaw": "^3.0.0",
"markdown-it": "^12.3.2",
"markdown-it-anchor": "^8.4.1",
"marked": "^4.0.10",
"mkdirp": "^1.0.4",
"requizzle": "^0.2.3",
"strip-json-comments": "^3.1.0",
"underscore": "~1.13.2"
},
"dependencies": {
"babylon": {
"version": "7.0.0-beta.19",
"resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz",
"integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==",
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
"dev": true
},
"escape-string-regexp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"dev": true
},
"mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"dev": true
},
"underscore": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
"integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
"version": "1.13.6",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
"integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
"dev": true
}
}
@@ -3020,9 +3064,9 @@
}
},
"klaw": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz",
"integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
"integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.9"
@@ -3059,6 +3103,15 @@
"source-map": "^0.5.3"
}
},
"linkify-it": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
"dev": true,
"requires": {
"uc.micro": "^1.0.1"
}
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
@@ -3202,10 +3255,43 @@
"nopt": "~2.1.1"
}
},
"markdown-it": {
"version": "12.3.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
"integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
"dev": true,
"requires": {
"argparse": "^2.0.1",
"entities": "~2.1.0",
"linkify-it": "^3.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
"dependencies": {
"argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
"entities": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
"integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
"dev": true
}
}
},
"markdown-it-anchor": {
"version": "8.6.7",
"resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
"integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
"dev": true
},
"marked": {
"version": "0.3.19",
"resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
"integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==",
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
"integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
"dev": true
},
"math-random": {
@@ -3214,6 +3300,12 @@
"integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==",
"dev": true
},
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
"dev": true
},
"meteor-hexo-config": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/meteor-hexo-config/-/meteor-hexo-config-1.0.12.tgz",
@@ -3607,6 +3699,7 @@
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
},
@@ -3615,7 +3708,8 @@
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
"dev": true,
"optional": true
}
}
},
@@ -4901,20 +4995,12 @@
"dev": true
},
"requizzle": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
"integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
"integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
"dev": true,
"requires": {
"lodash": "^4.17.14"
},
"dependencies": {
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
}
"lodash": "^4.17.21"
}
},
"resolve": {
@@ -5437,9 +5523,9 @@
"dev": true
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
},
"striptags": {
@@ -5528,12 +5614,6 @@
}
}
},
"taffydb": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
"integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=",
"dev": true
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -5642,6 +5722,12 @@
"dev": true,
"optional": true
},
"uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
"dev": true
},
"uglify-js": {
"version": "3.13.5",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz",
@@ -5883,9 +5969,9 @@
"optional": true
},
"xmlcreate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz",
"integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=",
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
"integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
"dev": true
},
"y18n": {

View File

@@ -16,17 +16,15 @@
"hexo-renderer-marked": "2.0.0",
"hexo-server": "1.0.0",
"hexo-versioned-netlify-redirects": "1.1.0",
"jsdoc": "3.5.5",
"jsdoc": "^4.0.2",
"meteor-hexo-config": "1.0.12",
"meteor-theme-hexo": "2.0.3",
"showdown": "1.9.1",
"underscore": "1.13.1"
},
"scripts": {
"strip-tla": "node ./jsdoc/strip-tla.js",
"generate-history": "node ./generators/changelog/script.js",
"codegen": "npm run strip-tla && npm run generate-history",
"build": "npm run codegen && jsdoc/jsdoc.sh && chexo meteor-hexo-config -- generate",
"build": "npm run generate-history && jsdoc/jsdoc.sh && chexo meteor-hexo-config -- generate",
"clean": "hexo clean; rm data/data.js data/names.json",
"test": "npm run clean; npm run build",
"predeploy": "npm run build",

View File

@@ -0,0 +1,122 @@
---
title: Top Level Await
description: Documentation of how to use top level await in Meteor
---
[Top level await](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await#top_level_await) (TLA) allows you to use `await` in the top level of a module or file instead of only in async functions. One way to view it as every file runs inside an `async` function.
Here is an example of using top level await on the server. When this file is loaded, the `await` will cause the module to wait for the count before the code in the rest of the module is run.
```js
const Links = new Mongo.Collection('links');
// Async code using top level await.
// The module waits for this to finish before continuing
const count = await Links.find().countAsync();
if (count === 0) {
await Links.insertAsync({ url: 'https://meteor.com' });
}
```
In previous versions of Meteor, async code using fibers could be run in the top level of a module. Top level await allows writing similar code that works without fibers. There are a few differences that this article will cover.
Meteor's implementation of top level await tries to closely follow the specification. There currently are some differences with how Meteor handles circular dependencies.
## Using Top Level Await
Top level await can be used in any app or package that uses the `ecmascript`, `typescript`, or `coffeescript` packages, or that uses any other build plugin that compiles top level await using reify.
Generally, if you can use ECMAScript modules, then you can also use top level await.
There are some extra considerations when using top level await in packages. They are covered later in this article.
Top level await is only enabled by default on the server. You can enable it for the client by setting the env var `METEOR_ENABLE_CLIENT_TOP_LEVEL_AWAIT` to `true`. There are a couple known issues with using TLA on the client:
1. It breaks any files in `/client/compatibility` since it now wraps those files in a function
2. Hot module replacement has not been updated to work with TLA
## Async Modules
With top level await, some modules are considered async, which affects how they behave. There are two ways a module can become an async module:
1. It uses top level await
2. It imports a module that is async
For example, this module (`setup.js`) would be async because it uses top level await:
```js
await setupLanguages();
```
This module (`main.js`) would be sync:
```js
console.log('in main.js');
```
However, if it imports `setup.js` which does use top level await, then `main.js` also becomes async.
```js
import './setup.js';
console.log('in main.js');
```
## Require
When using `require` to load an async module, instead of directly returning a module's exports, it will return a promise that resolves to the module's exports.
```js
// resolves to the exports of init.js
const promise = require('./init.js');
```
If you are using `require`, this does mean you need to be careful when adding or removing top level await in a file since you also have to update where the module is required.
Since a module becomes async if it depends on an async module, this could affect more than just the individual modules using top level await.
When possible, you can use ecmascript import syntax or dynamic imports instead so you don't have to worry about which modules are sync or async.
## Nested Imports
Nested imports refer to using `import ...` outside of the root of a module, for example in an if block or a function.
```js
if (Meteor.isClient) {
import './init-client.js';
}
export function showNotification(message) {
import show from './notifications.js';
show(message);
}
```
This is a feature unique to Meteor, so the top level await specification wasn't written to work with nested imports. Using nested imports to import a sync module continues to work, but it will throw an error if used to import an async module. You can use `require` or dynamic imports for async modules in these situations.
## Using in Packages
Top level await is only supported starting in Meteor 3. Published build plugins are able to use top level await in older Meteor versions since the runtime is bundled when they are published, though in development they require Meteor 3.
If you want to ensure your package only runs in versions of Meteor that support top level await, you can have your package use `isobuild:top-level-await`:
```js
Package.onUse(function (api) {
// Do not allow this package to be used in pre-Meteor 3 apps.
api.use("isobuild:top-level-await@3.0.0");
});
```
When importing a package that does not have a lazy main module, it will work the same whether a package uses top level await or not. This is true even when using `require`. This allows packages to add or remove top level await without it being a breaking change.
There are a couple cases where adding or removing top level await from a module in a package could be considered a breaking change:
1. If specific modules are require'd from a package. For example: `require('meteor/zodern:aurorae/svelte.js')`. When importing a specific module from a package, `require` changes its behavior based on if the module is async or not.
2. If a package that has lazy main modules is require'd. Unlike normal packages, `require` will return a promise if the lazy main module is an async module. Changing if the lazy main module is async or not should be considered a breaking change for the package.
## Module and Package Execution Order
Normally, modules are run one at a time. This was even true when using async code with fibers in the root of a module. However, top level await is different - it allows siblings (modules that do not depend on each other) to sometimes run in parallel. This can allow the app to load faster, which is especially important on the client. However, this could cause code to run in an unexpected order if you are used to how Meteor worked with fibers.
This is also applies to packages. Packages that do not directly or indirectly depend on each other are able to load in parallel if they use top level await.
Modules that are eagerly evaluated (added in packages with `api.addFiles`, or outside of `imports` in apps that do not have a main module) and not directly imported continue to run one at a time, even if they use top level await, since it is common for these modules to implicitly depend on the previous modules.

View File

@@ -1,5 +1,5 @@
Package.describe({
version: '3.0.0-alpha300.6',
version: '3.0.0-alpha300.9',
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-alpha300.6',
version: '3.0.0-alpha300.9',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Login service for Facebook accounts",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(api => {

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Login service for Google accounts",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(api => {

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Common code for OAuth-based login services",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
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-alpha300.6',
version: '3.0.0-alpha300.9',
});
Npm.depends({

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Login service for Twitter accounts",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(api => {

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'allow-deny',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
// 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: "Enable the application cache in the browser",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
deprecated: true,
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Try to detect inadequate input sanitization",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
// 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: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
// 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-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(function(api) {

View File

@@ -1,7 +1,7 @@
Package.describe({
name: "babel-compiler",
summary: "Parser/transpiler for ECMAScript 2015+ syntax",
version: '8.0.0-alpha300.6',
version: '8.0.0-alpha300.9',
});
Npm.depends({

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Binary Heap datastructure implementation",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
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: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
documentation: null
});

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'caching-compiler',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
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: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Check whether a value matches a pattern',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
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-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "context",
version: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
summary: "Manage contextual information without passing objects around",
documentation: "README.md"
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Core runtime to load packages and the app",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
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: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
documentation: null
});

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'ddp-rate-limiter',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
// 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-alpha300.6',
version: '3.0.0-alpha300.9',
documentation: null
});

View File

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

View File

@@ -2,15 +2,16 @@
Package.describe({
summary: "Markdown-to-HTML processor",
version: "3.0.0-alpha300.6",
version: "3.0.0-alpha300.9",
deprecated: true,
documentation: 'README.md'
});
Package.onUse(function (api) {
api.use('ecmascript@1.0.0-alpha300.6');
api.use("templating@2.0.0-alpha300.6", "client", {weak: true});
api.mainModule('template-integration.js', 'client');
api.versionsFrom('3.0-alpha.6');
api.use('ecmascript@1.0.0-alpha300.9');
api.use("templating@2.0.0-alpha300.9", "client", {weak: true});
api.mainModule('template-integration.js', 'client', { lazy: true });
});
Package.onTest(function (api) {

View File

@@ -1,5 +1,5 @@
Package.describe({
version: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
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: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
documentation: null
});

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "dynamic-import",
version: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
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: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
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: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
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: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
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: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
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: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(function onUse(api) {

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "es5-shim",
version: '5.0.0-alpha300.6',
version: '5.0.0-alpha300.9',
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: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(api => {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Require this application to use HTTPS",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
prodOnly: true
});

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Google OAuth flow",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Cordova.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'hot-code-push',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
// 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.

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'hot-module-replacement',
version: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
summary: 'Update code in development without reloading the page',
documentation: 'README.md',
debugOnly: true,

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Dictionary data structure allowing non-string keys",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "(For prototyping only) Allow all database writes from the client",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
// This package is empty; its presence is detected by mongo-livedata.

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "inter-process-messaging",
version: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
summary: "Support for sending messages from the build process to the server process",
documentation: "README.md"
});

View File

@@ -6,7 +6,7 @@ Package.describe({
// between such packages and the build tool.
name: 'launch-screen',
summary: 'Default and customizable launch screen on mobile.',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Cordova.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Simulates local storage on IE 6,7 using userData",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Logging facility.',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Npm.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "General satisfiability solver for logic problems",
version: '3.0.0-alpha300.6',
version: '3.0.0-alpha300.9',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Blaze configuration templates for the Meetup OAuth flow.',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Meetup OAuth flow',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'meteor-base',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
// Brief, one-line summary of the package.
summary: 'Packages that every Meteor app needs',
// By default, Meteor will default to using README.md for documentation.

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Blaze configuration templates for the Meteor developer accounts OAuth.',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'Meteor developer accounts OAuth flow',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'The Meteor command-line tool',
version: '3.0.0-alpha.6',
version: '3.0.0-alpha.9',
});
Package.includeTool();

View File

@@ -2,7 +2,7 @@
Package.describe({
summary: "Core Meteor environment",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.registerBuildPlugin({

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'CSS minifier',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Npm.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "JavaScript minifier",
version: '3.0.0-alpha300.6',
version: '3.0.0-alpha300.9',
});
Npm.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Meteor's client-side datastore: a port of MongoDB to Javascript",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(api => {

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'mobile-experience',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
summary: 'Packages for a great mobile user experience',
documentation: 'README.md'
});

View File

@@ -1,7 +1,7 @@
Package.describe({
name: 'mobile-status-bar',
summary: "Good defaults for the mobile status bar",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Cordova.depends({

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'modern-browsers',
version: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
summary:
'API for defining the boundary between modern and legacy ' +
'JavaScript clients',

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'modules-runtime-hot',
version: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
summary: 'Patches modules-runtime to support Hot Module Replacement',
git: 'https://github.com/benjamn/install',
documentation: 'README.md',

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "modules-runtime",
version: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
summary: "CommonJS module system",
git: "https://github.com/benjamn/install",
documentation: "README.md"

View File

@@ -1,6 +1,6 @@
Package.describe({
name: "modules",
version: '1.0.0-alpha300.6',
version: '1.0.0-alpha300.9',
summary: "CommonJS module system",
documentation: "README.md"
});

View File

@@ -3,7 +3,7 @@ Package.describe({
documentation: 'README.md',
name: 'mongo-dev-server',
summary: 'Start MongoDB alongside Meteor, in development mode.',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(function (api) {

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: 'JS simulation of MongoDB ObjectIDs',
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
documentation: null
});

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "Moved to the 'mongo' package",
version: '2.0.0-alpha300.6',
version: '2.0.0-alpha300.9',
});
Package.onUse(function (api) {

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