From dd1fa7b8c55721ba2bbc67ee628e4fa5bedc9199 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 12 Jun 2017 13:14:00 -0400 Subject: [PATCH 001/113] Upgrade meteor-babel and expose Babel.getMinifierOptions. --- History.md | 2 + .../.npm/package/npm-shrinkwrap.json | 54 +++++++++---------- packages/babel-compiler/babel.js | 27 ++++++---- packages/babel-compiler/package.js | 4 +- scripts/dev-bundle-tool-package.js | 2 +- 5 files changed, 48 insertions(+), 41 deletions(-) diff --git a/History.md b/History.md index 0b550d892f..ae91c70cce 100644 --- a/History.md +++ b/History.md @@ -31,6 +31,8 @@ context and with its `EnvironmentVariable`s bound. [PR #8629](https://github.com/meteor/meteor/pull/8629) +* The `meteor-babel` npm package has been upgraded to version 0.21.5. + * The `reify` npm package has been upgraded to version 0.11.22. * Illegal characters in paths written in build output directories will now diff --git a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json index 066a3e4bae..cb4116c17f 100644 --- a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json +++ b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json @@ -21,14 +21,14 @@ "from": "babel-code-frame@>=6.22.0 <7.0.0" }, "babel-core": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.1.tgz", + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", "from": "babel-core@>=6.22.1 <7.0.0" }, "babel-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.1.tgz", - "from": "babel-generator@>=6.24.1 <7.0.0" + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "from": "babel-generator@>=6.25.0 <7.0.0" }, "babel-helper-builder-react-jsx": { "version": "6.24.1", @@ -280,8 +280,8 @@ "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-modules-reify": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-reify/-/babel-plugin-transform-es2015-modules-reify-0.11.0.tgz", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-reify/-/babel-plugin-transform-es2015-modules-reify-0.11.1.tgz", "from": "babel-plugin-transform-es2015-modules-reify@>=0.11.0 <0.12.0" }, "babel-plugin-transform-es2015-object-super": { @@ -365,8 +365,8 @@ "from": "babel-plugin-transform-property-literals@>=6.8.1 <7.0.0" }, "babel-plugin-transform-react-display-name": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz", + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "from": "babel-plugin-transform-react-display-name@>=6.23.0 <7.0.0" }, "babel-plugin-transform-react-jsx": { @@ -460,33 +460,33 @@ "from": "babel-runtime@>=6.22.0 <7.0.0" }, "babel-template": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.24.1.tgz", + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", "from": "babel-template@>=6.22.0 <7.0.0" }, "babel-traverse": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.24.1.tgz", + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", "from": "babel-traverse@>=6.22.1 <7.0.0" }, "babel-types": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.24.1.tgz", + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", "from": "babel-types@>=6.22.0 <7.0.0" }, "babylon": { - "version": "6.17.2", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.2.tgz", + "version": "6.17.3", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.3.tgz", "from": "babylon@>=6.15.0 <7.0.0" }, "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "from": "balanced-match@>=0.4.1 <0.5.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "from": "balanced-match@>=1.0.0 <2.0.0" }, "brace-expansion": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "from": "brace-expansion@>=1.1.7 <2.0.0" }, "chalk": { @@ -530,8 +530,8 @@ "from": "esutils@>=2.0.2 <3.0.0" }, "globals": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz", + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "from": "globals@>=9.0.0 <10.0.0" }, "has-ansi": { @@ -590,9 +590,9 @@ "from": "loose-envify@>=1.0.0 <2.0.0" }, "meteor-babel": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/meteor-babel/-/meteor-babel-0.21.4.tgz", - "from": "meteor-babel@0.21.4" + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/meteor-babel/-/meteor-babel-0.21.5.tgz", + "from": "meteor-babel@0.21.5" }, "meteor-babel-helpers": { "version": "0.0.3", diff --git a/packages/babel-compiler/babel.js b/packages/babel-compiler/babel.js index 13306f306b..90f88704aa 100644 --- a/packages/babel-compiler/babel.js +++ b/packages/babel-compiler/babel.js @@ -1,12 +1,15 @@ +var meteorBabel = null; +function getMeteorBabel() { + return meteorBabel || (meteorBabel = Npm.require("meteor-babel")); +} + /** * Returns a new object containing default options appropriate for */ function getDefaultOptions(extraFeatures) { - var meteorBabel = Npm.require('meteor-babel'); - // See https://github.com/meteor/babel/blob/master/options.js for more // information about what the default options are. - var options = meteorBabel.getDefaultOptions(extraFeatures); + var options = getMeteorBabel().getDefaultOptions(extraFeatures); // The sourceMap option should probably be removed from the default // options returned by meteorBabel.getDefaultOptions. @@ -22,22 +25,24 @@ Babel = { validateExtraFeatures: Function.prototype, parse: function (source) { - return Npm.require('meteor-babel').parse(source); + return getMeteorBabel().parse(source); }, compile: function (source, options) { - var meteorBabel = Npm.require('meteor-babel'); options = options || getDefaultOptions(); - return meteorBabel.compile(source, options); + return getMeteorBabel().compile(source, options); }, setCacheDir: function (cacheDir) { - Npm.require('meteor-babel').setCacheDir(cacheDir); + getMeteorBabel().setCacheDir(cacheDir); }, - minify: function(source, options) { - var meteorBabel = Npm.require('meteor-babel'); - var options = options || meteorBabel.getMinifierOptions(); - return meteorBabel.minify(source, options); + minify: function (source, options) { + var options = options || getMeteorBabel().getMinifierOptions(); + return getMeteorBabel().minify(source, options); + }, + + getMinifierOptions: function (extraFeatures) { + return getMeteorBabel().getMinifierOptions(extraFeatures); } }; diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 4e8beea419..a6542ae28b 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,11 +6,11 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.19.2' + version: '6.19.3' }); Npm.depends({ - 'meteor-babel': '0.21.4' + 'meteor-babel': '0.21.5' }); Package.onUse(function (api) { diff --git a/scripts/dev-bundle-tool-package.js b/scripts/dev-bundle-tool-package.js index 93a146dff2..ff88d0e689 100644 --- a/scripts/dev-bundle-tool-package.js +++ b/scripts/dev-bundle-tool-package.js @@ -14,7 +14,7 @@ var packageJson = { npm: "4.6.1", "node-gyp": "3.6.0", "node-pre-gyp": "0.6.34", - "meteor-babel": "0.21.4", + "meteor-babel": "0.21.5", reify: "0.11.22", "meteor-promise": "0.8.4", fibers: "1.0.15", From a4fb21e20b725631e18c31fcc341ae8033a5efc3 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 12 Jun 2017 13:20:26 -0400 Subject: [PATCH 002/113] Inline process.env.NODE_ENV when minifying with UglifyJS or Babili. Related threads: https://forums.meteor.com/t/new-react-devtools-check-if-your-production-build-is-really-in-production-mode/36199 meteor/meteor#6402 meteor/meteor-feature-requests#94 --- History.md | 3 +++ .../minifier-js/.npm/package/npm-shrinkwrap.json | 6 +++--- packages/minifier-js/minifier.js | 16 ++++++++++++++-- packages/minifier-js/package.js | 4 ++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/History.md b/History.md index ae91c70cce..fbef567da0 100644 --- a/History.md +++ b/History.md @@ -31,6 +31,9 @@ context and with its `EnvironmentVariable`s bound. [PR #8629](https://github.com/meteor/meteor/pull/8629) +* The `minifier-js` package will now replace `process.env.NODE_ENV` with + its string value (or `"development"` if unspecified). + * The `meteor-babel` npm package has been upgraded to version 0.21.5. * The `reify` npm package has been upgraded to version 0.11.22. diff --git a/packages/minifier-js/.npm/package/npm-shrinkwrap.json b/packages/minifier-js/.npm/package/npm-shrinkwrap.json index 77e6b7279a..a58743385e 100644 --- a/packages/minifier-js/.npm/package/npm-shrinkwrap.json +++ b/packages/minifier-js/.npm/package/npm-shrinkwrap.json @@ -16,9 +16,9 @@ "from": "source-map@>=0.5.1 <0.6.0" }, "uglify-js": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.13.tgz", - "from": "uglify-js@3.0.13" + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.15.tgz", + "from": "uglify-js@3.0.15" } } } diff --git a/packages/minifier-js/minifier.js b/packages/minifier-js/minifier.js index 806c88e3ab..e1d5ab51c6 100644 --- a/packages/minifier-js/minifier.js +++ b/packages/minifier-js/minifier.js @@ -2,6 +2,8 @@ var uglify; meteorJsMinify = function (source) { var result = {}; + var NODE_ENV = process.env.NODE_ENV || "development"; + uglify = uglify || Npm.require("uglify-js"); try { @@ -9,7 +11,10 @@ meteorJsMinify = function (source) { compress: { drop_debugger: false, unused: false, - dead_code: false + dead_code: false, + global_defs: { + "process.env.NODE_ENV": NODE_ENV + } } }); @@ -24,7 +29,14 @@ meteorJsMinify = function (source) { // Although Babel.minify can handle a wider variety of ECMAScript // 2015+ syntax, it is substantially slower than UglifyJS, so we use // it only as a fallback. - result.code = Babel.minify(source).code; + if (Babel.getMinifierOptions) { + var options = Babel.getMinifierOptions({ + inlineNodeEnv: NODE_ENV + }); + result.code = Babel.minify(source, options).code; + } else { + result.code = Babel.minify(source).code; + } } return result; diff --git a/packages/minifier-js/package.js b/packages/minifier-js/package.js index d6f75cc1ab..0f7cfa48f7 100644 --- a/packages/minifier-js/package.js +++ b/packages/minifier-js/package.js @@ -1,10 +1,10 @@ Package.describe({ summary: "JavaScript minifier", - version: "2.1.0" + version: "2.1.1" }); Npm.depends({ - "uglify-js": "3.0.13" + "uglify-js": "3.0.15" }); Package.onUse(function (api) { From acbfff75ed13e7bc15dfdeb7151bfbf0a36f83d1 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 12 Jun 2017 20:19:12 -0400 Subject: [PATCH 003/113] Upgrade reify to version 0.11.23 to silence React.PropTypes warnings. --- History.md | 4 +++- packages/babel-compiler/.npm/package/npm-shrinkwrap.json | 4 ++-- packages/modules/.npm/package/npm-shrinkwrap.json | 6 +++--- packages/modules/package.js | 4 ++-- scripts/dev-bundle-tool-package.js | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/History.md b/History.md index fbef567da0..e7ebe3fc66 100644 --- a/History.md +++ b/History.md @@ -1,5 +1,7 @@ ## v.NEXT +## v1.5.1, TBD + * `reactive-dict` now supports setting initial data when defining a named `ReactiveDict`. No longer run migration logic when used on the server, this is to prevent duplicate name error on reloads. Initial data is now @@ -36,7 +38,7 @@ * The `meteor-babel` npm package has been upgraded to version 0.21.5. -* The `reify` npm package has been upgraded to version 0.11.22. +* The `reify` npm package has been upgraded to version 0.11.23. * Illegal characters in paths written in build output directories will now be replaced with `_`s rather than removed, so that file and directory diff --git a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json index cb4116c17f..387e397135 100644 --- a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json +++ b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json @@ -692,8 +692,8 @@ } }, "reify": { - "version": "0.11.22", - "resolved": "https://registry.npmjs.org/reify/-/reify-0.11.22.tgz", + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/reify/-/reify-0.11.23.tgz", "from": "reify@>=0.11.18 <0.12.0" }, "repeating": { diff --git a/packages/modules/.npm/package/npm-shrinkwrap.json b/packages/modules/.npm/package/npm-shrinkwrap.json index 35a5bacdb0..876f21cd80 100644 --- a/packages/modules/.npm/package/npm-shrinkwrap.json +++ b/packages/modules/.npm/package/npm-shrinkwrap.json @@ -16,9 +16,9 @@ "from": "minizlib@>=1.0.3 <2.0.0" }, "reify": { - "version": "0.11.22", - "resolved": "https://registry.npmjs.org/reify/-/reify-0.11.22.tgz", - "from": "reify@0.11.22" + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/reify/-/reify-0.11.23.tgz", + "from": "reify@0.11.23" }, "semver": { "version": "5.3.0", diff --git a/packages/modules/package.js b/packages/modules/package.js index 97846d2294..840be2b953 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,12 +1,12 @@ Package.describe({ name: "modules", - version: "0.9.1", + version: "0.9.2", summary: "CommonJS module system", documentation: "README.md" }); Npm.depends({ - reify: "0.11.22" + reify: "0.11.23" }); Package.onUse(function(api) { diff --git a/scripts/dev-bundle-tool-package.js b/scripts/dev-bundle-tool-package.js index ff88d0e689..bf956020be 100644 --- a/scripts/dev-bundle-tool-package.js +++ b/scripts/dev-bundle-tool-package.js @@ -15,7 +15,7 @@ var packageJson = { "node-gyp": "3.6.0", "node-pre-gyp": "0.6.34", "meteor-babel": "0.21.5", - reify: "0.11.22", + reify: "0.11.23", "meteor-promise": "0.8.4", fibers: "1.0.15", promise: "7.1.1", From 570b730812c325b0efdb7f271add68ff324d3476 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 12 Jun 2017 20:20:26 -0400 Subject: [PATCH 004/113] Bump $BUNDLE_VERSION to 4.8.19 before rebuilding dev bundle. --- meteor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meteor b/meteor index 1314849223..967665a9cb 100755 --- a/meteor +++ b/meteor @@ -1,6 +1,6 @@ #!/usr/bin/env bash -BUNDLE_VERSION=4.8.18 +BUNDLE_VERSION=4.8.19 # OS Check. Put here because here is where we download the precompiled # bundles that are arch specific. From ac26456692fc0e7c7841c57d5085453cfb1bf4df Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 12 Jun 2017 20:32:57 -0400 Subject: [PATCH 005/113] Bump package versions for 1.5.1-beta.0 release. --- packages/babel-compiler/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/minifier-js/package.js | 2 +- packages/modules/package.js | 2 +- packages/standard-minifier-js/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index a6542ae28b..9e49ce0db0 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.19.3' + version: '6.19.3-beta.0' }); Npm.depends({ diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index 2a25c9bb47..4ac157f3c3 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.8.0', + version: '0.8.1-beta.0', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index f10bd49fcd..d914728b7c 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.0' + version: '1.5.1-beta.0' }); Package.includeTool(); diff --git a/packages/minifier-js/package.js b/packages/minifier-js/package.js index 0f7cfa48f7..8d66d4575a 100644 --- a/packages/minifier-js/package.js +++ b/packages/minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "JavaScript minifier", - version: "2.1.1" + version: "2.1.1-beta.0" }); Npm.depends({ diff --git a/packages/modules/package.js b/packages/modules/package.js index 840be2b953..ffcd245e49 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.9.2", + version: "0.9.2-beta.0", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/packages/standard-minifier-js/package.js b/packages/standard-minifier-js/package.js index 3b6148b45f..ef9775aa84 100644 --- a/packages/standard-minifier-js/package.js +++ b/packages/standard-minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'standard-minifier-js', - version: '2.1.0', + version: '2.1.1-beta.0', summary: 'Standard javascript minifiers used with Meteor apps by default.', documentation: 'README.md', }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index 8846fd805b..d447bcd3d7 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5-rc.13", + "version": "1.5.1-beta.0", "recommended": false, "official": false, "description": "Meteor" From cc07304a48a7b6aa0ce9675ce4b9461ce7f2a3c5 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 13 Jun 2017 13:54:44 -0400 Subject: [PATCH 006/113] Update reify in an attempt to fix #8795. --- History.md | 2 +- .../.npm/package/npm-shrinkwrap.json | 36 +++++++++---------- .../modules/.npm/package/npm-shrinkwrap.json | 6 ++-- packages/modules/package.js | 2 +- scripts/dev-bundle-tool-package.js | 2 +- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/History.md b/History.md index e7ebe3fc66..c4ec8bbb8c 100644 --- a/History.md +++ b/History.md @@ -38,7 +38,7 @@ * The `meteor-babel` npm package has been upgraded to version 0.21.5. -* The `reify` npm package has been upgraded to version 0.11.23. +* The `reify` npm package has been upgraded to version 0.11.24. * Illegal characters in paths written in build output directories will now be replaced with `_`s rather than removed, so that file and directory diff --git a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json index 387e397135..2316fef18c 100644 --- a/packages/babel-compiler/.npm/package/npm-shrinkwrap.json +++ b/packages/babel-compiler/.npm/package/npm-shrinkwrap.json @@ -138,8 +138,8 @@ } }, "babel-plugin-minify-dead-code-elimination": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.6.tgz", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz", "from": "babel-plugin-minify-dead-code-elimination@>=0.1.3 <0.2.0" }, "babel-plugin-minify-flip-comparisons": { @@ -280,8 +280,8 @@ "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.22.0 <7.0.0" }, "babel-plugin-transform-es2015-modules-reify": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-reify/-/babel-plugin-transform-es2015-modules-reify-0.11.1.tgz", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-reify/-/babel-plugin-transform-es2015-modules-reify-0.11.2.tgz", "from": "babel-plugin-transform-es2015-modules-reify@>=0.11.0 <0.12.0" }, "babel-plugin-transform-es2015-object-super": { @@ -340,13 +340,13 @@ "from": "babel-plugin-transform-inline-consecutive-adds@>=0.0.2 <0.0.3" }, "babel-plugin-transform-member-expression-literals": { - "version": "6.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.3.tgz", + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.4.tgz", "from": "babel-plugin-transform-member-expression-literals@>=6.8.1 <7.0.0" }, "babel-plugin-transform-merge-sibling-variables": { - "version": "6.8.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.4.tgz", + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.5.tgz", "from": "babel-plugin-transform-merge-sibling-variables@>=6.8.2 <7.0.0" }, "babel-plugin-transform-minify-booleans": { @@ -360,8 +360,8 @@ "from": "babel-plugin-transform-object-rest-spread@>=6.22.0 <7.0.0" }, "babel-plugin-transform-property-literals": { - "version": "6.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.3.tgz", + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.4.tgz", "from": "babel-plugin-transform-property-literals@>=6.8.1 <7.0.0" }, "babel-plugin-transform-react-display-name": { @@ -395,13 +395,13 @@ "from": "babel-plugin-transform-regexp-constructors@>=0.0.5 <0.0.6" }, "babel-plugin-transform-remove-console": { - "version": "6.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.3.tgz", + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.4.tgz", "from": "babel-plugin-transform-remove-console@>=6.8.0 <7.0.0" }, "babel-plugin-transform-remove-debugger": { - "version": "6.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.3.tgz", + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.4.tgz", "from": "babel-plugin-transform-remove-debugger@>=6.8.0 <7.0.0" }, "babel-plugin-transform-remove-undefined": { @@ -415,8 +415,8 @@ "from": "babel-plugin-transform-runtime@>=6.22.0 <7.0.0" }, "babel-plugin-transform-simplify-comparison-operators": { - "version": "6.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.3.tgz", + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.4.tgz", "from": "babel-plugin-transform-simplify-comparison-operators@>=6.8.1 <7.0.0" }, "babel-plugin-transform-strict-mode": { @@ -692,8 +692,8 @@ } }, "reify": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/reify/-/reify-0.11.23.tgz", + "version": "0.11.24", + "resolved": "https://registry.npmjs.org/reify/-/reify-0.11.24.tgz", "from": "reify@>=0.11.18 <0.12.0" }, "repeating": { diff --git a/packages/modules/.npm/package/npm-shrinkwrap.json b/packages/modules/.npm/package/npm-shrinkwrap.json index 876f21cd80..ed85116d23 100644 --- a/packages/modules/.npm/package/npm-shrinkwrap.json +++ b/packages/modules/.npm/package/npm-shrinkwrap.json @@ -16,9 +16,9 @@ "from": "minizlib@>=1.0.3 <2.0.0" }, "reify": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/reify/-/reify-0.11.23.tgz", - "from": "reify@0.11.23" + "version": "0.11.24", + "resolved": "https://registry.npmjs.org/reify/-/reify-0.11.24.tgz", + "from": "reify@0.11.24" }, "semver": { "version": "5.3.0", diff --git a/packages/modules/package.js b/packages/modules/package.js index ffcd245e49..ef36054b6a 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -6,7 +6,7 @@ Package.describe({ }); Npm.depends({ - reify: "0.11.23" + reify: "0.11.24" }); Package.onUse(function(api) { diff --git a/scripts/dev-bundle-tool-package.js b/scripts/dev-bundle-tool-package.js index bf956020be..2758b69fe3 100644 --- a/scripts/dev-bundle-tool-package.js +++ b/scripts/dev-bundle-tool-package.js @@ -15,7 +15,7 @@ var packageJson = { "node-gyp": "3.6.0", "node-pre-gyp": "0.6.34", "meteor-babel": "0.21.5", - reify: "0.11.23", + reify: "0.11.24", "meteor-promise": "0.8.4", fibers: "1.0.15", promise: "7.1.1", From faa5b2ec0331060110e1705bc15f3ef4762d2886 Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Mon, 12 Jun 2017 12:57:31 +0300 Subject: [PATCH 007/113] Bump versions of packages associated to #8629. * Major version bump for `ddp-server` * Minor version bumps for: - `accounts-base` - `allow-deny` - `ddp-client` - `ddp-common` - `meteor` - `mongo` --- packages/accounts-base/package.js | 2 +- packages/allow-deny/package.js | 2 +- packages/ddp-client/package.js | 2 +- packages/ddp-common/package.js | 2 +- packages/ddp-server/package.js | 2 +- packages/meteor/package.js | 2 +- packages/mongo/package.js | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js index 80ac334d76..9f52c7a6f9 100644 --- a/packages/accounts-base/package.js +++ b/packages/accounts-base/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "A user account system", - version: "1.3.0" + version: "1.3.1" }); Package.onUse(function (api) { diff --git a/packages/allow-deny/package.js b/packages/allow-deny/package.js index 4f84375323..56d9402c5b 100644 --- a/packages/allow-deny/package.js +++ b/packages/allow-deny/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'allow-deny', - version: '1.0.5', + version: '1.0.6', // 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. diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js index a285362f9c..b6cd2a1cb4 100644 --- a/packages/ddp-client/package.js +++ b/packages/ddp-client/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data client", - version: '1.3.4', + version: '1.3.5', documentation: null }); diff --git a/packages/ddp-common/package.js b/packages/ddp-common/package.js index 42a831899b..e053ebbf49 100644 --- a/packages/ddp-common/package.js +++ b/packages/ddp-common/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Code shared beween ddp-client and ddp-server", - version: '1.2.8', + version: '1.2.9', documentation: null }); diff --git a/packages/ddp-server/package.js b/packages/ddp-server/package.js index 14e9d22ba4..be03d14268 100644 --- a/packages/ddp-server/package.js +++ b/packages/ddp-server/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data server", - version: '1.3.14', + version: '2.0.0', documentation: null }); diff --git a/packages/meteor/package.js b/packages/meteor/package.js index 322778bd18..efd5b1a4a9 100644 --- a/packages/meteor/package.js +++ b/packages/meteor/package.js @@ -2,7 +2,7 @@ Package.describe({ summary: "Core Meteor environment", - version: '1.6.1' + version: '1.6.2' }); Package.registerBuildPlugin({ diff --git a/packages/mongo/package.js b/packages/mongo/package.js index 45659fd43f..74cc22955b 100644 --- a/packages/mongo/package.js +++ b/packages/mongo/package.js @@ -9,7 +9,7 @@ Package.describe({ summary: "Adaptor for using MongoDB and Minimongo over DDP", - version: '1.1.18' + version: '1.1.19' }); Npm.depends({ From 4cc43005168a093cc30c5e3823f8a0f998ed2a87 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Tue, 13 Jun 2017 14:42:45 -0400 Subject: [PATCH 008/113] Bump package versions for 1.5.1-beta.1 release. --- packages/accounts-base/package.js | 2 +- packages/allow-deny/package.js | 2 +- packages/babel-compiler/package.js | 2 +- packages/ddp-client/package.js | 2 +- packages/ddp-common/package.js | 2 +- packages/ddp-server/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/meteor/package.js | 2 +- packages/minifier-js/package.js | 2 +- packages/modules/package.js | 2 +- packages/mongo/package.js | 2 +- packages/standard-minifier-js/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js index 9f52c7a6f9..e2d86287dc 100644 --- a/packages/accounts-base/package.js +++ b/packages/accounts-base/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "A user account system", - version: "1.3.1" + version: "1.3.1-beta.1" }); Package.onUse(function (api) { diff --git a/packages/allow-deny/package.js b/packages/allow-deny/package.js index 56d9402c5b..5ec14c517c 100644 --- a/packages/allow-deny/package.js +++ b/packages/allow-deny/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'allow-deny', - version: '1.0.6', + version: '1.0.6-beta.1', // 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. diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 9e49ce0db0..29929b2022 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.19.3-beta.0' + version: '6.19.3-beta.1' }); Npm.depends({ diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js index b6cd2a1cb4..05632302e9 100644 --- a/packages/ddp-client/package.js +++ b/packages/ddp-client/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data client", - version: '1.3.5', + version: '1.3.5-beta.1', documentation: null }); diff --git a/packages/ddp-common/package.js b/packages/ddp-common/package.js index e053ebbf49..a77fa74157 100644 --- a/packages/ddp-common/package.js +++ b/packages/ddp-common/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Code shared beween ddp-client and ddp-server", - version: '1.2.9', + version: '1.2.9-beta.1', documentation: null }); diff --git a/packages/ddp-server/package.js b/packages/ddp-server/package.js index be03d14268..eba26536cd 100644 --- a/packages/ddp-server/package.js +++ b/packages/ddp-server/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data server", - version: '2.0.0', + version: '2.0.0-beta.1', documentation: null }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index 4ac157f3c3..d1dbe4ebbd 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.8.1-beta.0', + version: '0.8.1-beta.1', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index d914728b7c..22eac450a5 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.1-beta.0' + version: '1.5.1-beta.1' }); Package.includeTool(); diff --git a/packages/meteor/package.js b/packages/meteor/package.js index efd5b1a4a9..1935c28a4a 100644 --- a/packages/meteor/package.js +++ b/packages/meteor/package.js @@ -2,7 +2,7 @@ Package.describe({ summary: "Core Meteor environment", - version: '1.6.2' + version: '1.6.2-beta.1' }); Package.registerBuildPlugin({ diff --git a/packages/minifier-js/package.js b/packages/minifier-js/package.js index 8d66d4575a..a5f0092835 100644 --- a/packages/minifier-js/package.js +++ b/packages/minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "JavaScript minifier", - version: "2.1.1-beta.0" + version: "2.1.1-beta.1" }); Npm.depends({ diff --git a/packages/modules/package.js b/packages/modules/package.js index ef36054b6a..223dd9218c 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.9.2-beta.0", + version: "0.9.2-beta.1", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/packages/mongo/package.js b/packages/mongo/package.js index 74cc22955b..cedf4c3f46 100644 --- a/packages/mongo/package.js +++ b/packages/mongo/package.js @@ -9,7 +9,7 @@ Package.describe({ summary: "Adaptor for using MongoDB and Minimongo over DDP", - version: '1.1.19' + version: '1.1.19-beta.1' }); Npm.depends({ diff --git a/packages/standard-minifier-js/package.js b/packages/standard-minifier-js/package.js index ef9775aa84..5e89889d64 100644 --- a/packages/standard-minifier-js/package.js +++ b/packages/standard-minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'standard-minifier-js', - version: '2.1.1-beta.0', + version: '2.1.1-beta.1', summary: 'Standard javascript minifiers used with Meteor apps by default.', documentation: 'README.md', }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index d447bcd3d7..7bda939dbb 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5.1-beta.0", + "version": "1.5.1-beta.1", "recommended": false, "official": false, "description": "Meteor" From 0a1b4239a1908b15bc48c93b3b7b93fefbee3ce3 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 16 Jun 2017 14:54:26 -0400 Subject: [PATCH 009/113] Bump package versions for 1.5.1-beta.2 release. --- packages/accounts-base/package.js | 2 +- packages/accounts-password/package.js | 2 +- packages/allow-deny/package.js | 2 +- packages/babel-compiler/package.js | 2 +- packages/ddp-client/package.js | 2 +- packages/ddp-common/package.js | 2 +- packages/ddp-server/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/meteor/package.js | 2 +- packages/minifier-js/package.js | 2 +- packages/modules/package.js | 2 +- packages/mongo/package.js | 2 +- packages/standard-minifier-js/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js index e2d86287dc..44e9d0fa4a 100644 --- a/packages/accounts-base/package.js +++ b/packages/accounts-base/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "A user account system", - version: "1.3.1-beta.1" + version: "1.3.1-beta.2" }); Package.onUse(function (api) { diff --git a/packages/accounts-password/package.js b/packages/accounts-password/package.js index 28b305e829..5f1a8718a4 100644 --- a/packages/accounts-password/package.js +++ b/packages/accounts-password/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Password support for accounts", - version: "2.0.0" + version: "2.0.0-beta.2" }); Package.onUse(function(api) { diff --git a/packages/allow-deny/package.js b/packages/allow-deny/package.js index 5ec14c517c..65f3211fc4 100644 --- a/packages/allow-deny/package.js +++ b/packages/allow-deny/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'allow-deny', - version: '1.0.6-beta.1', + version: '1.0.6-beta.2', // 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. diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 29929b2022..8e9407ed8b 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.19.3-beta.1' + version: '6.19.3-beta.2' }); Npm.depends({ diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js index 05632302e9..61126f7665 100644 --- a/packages/ddp-client/package.js +++ b/packages/ddp-client/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data client", - version: '1.3.5-beta.1', + version: '1.3.5-beta.2', documentation: null }); diff --git a/packages/ddp-common/package.js b/packages/ddp-common/package.js index a77fa74157..a4534b07cd 100644 --- a/packages/ddp-common/package.js +++ b/packages/ddp-common/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Code shared beween ddp-client and ddp-server", - version: '1.2.9-beta.1', + version: '1.2.9-beta.2', documentation: null }); diff --git a/packages/ddp-server/package.js b/packages/ddp-server/package.js index eba26536cd..6baf2a917c 100644 --- a/packages/ddp-server/package.js +++ b/packages/ddp-server/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data server", - version: '2.0.0-beta.1', + version: '2.0.0-beta.2', documentation: null }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index d1dbe4ebbd..c5ce1f3ecd 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.8.1-beta.1', + version: '0.8.1-beta.2', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index 22eac450a5..d7e56ddea1 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.1-beta.1' + version: '1.5.1-beta.2' }); Package.includeTool(); diff --git a/packages/meteor/package.js b/packages/meteor/package.js index 1935c28a4a..e72f611ccd 100644 --- a/packages/meteor/package.js +++ b/packages/meteor/package.js @@ -2,7 +2,7 @@ Package.describe({ summary: "Core Meteor environment", - version: '1.6.2-beta.1' + version: '1.6.2-beta.2' }); Package.registerBuildPlugin({ diff --git a/packages/minifier-js/package.js b/packages/minifier-js/package.js index a5f0092835..c30512b3f7 100644 --- a/packages/minifier-js/package.js +++ b/packages/minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "JavaScript minifier", - version: "2.1.1-beta.1" + version: "2.1.1-beta.2" }); Npm.depends({ diff --git a/packages/modules/package.js b/packages/modules/package.js index 223dd9218c..ea7bf746e1 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.9.2-beta.1", + version: "0.9.2-beta.2", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/packages/mongo/package.js b/packages/mongo/package.js index cedf4c3f46..cebb2fa929 100644 --- a/packages/mongo/package.js +++ b/packages/mongo/package.js @@ -9,7 +9,7 @@ Package.describe({ summary: "Adaptor for using MongoDB and Minimongo over DDP", - version: '1.1.19-beta.1' + version: '1.1.19-beta.2' }); Npm.depends({ diff --git a/packages/standard-minifier-js/package.js b/packages/standard-minifier-js/package.js index 5e89889d64..3e6a804fd9 100644 --- a/packages/standard-minifier-js/package.js +++ b/packages/standard-minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'standard-minifier-js', - version: '2.1.1-beta.1', + version: '2.1.1-beta.2', summary: 'Standard javascript minifiers used with Meteor apps by default.', documentation: 'README.md', }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index 7bda939dbb..fe2d9e9b21 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5.1-beta.1", + "version": "1.5.1-beta.2", "recommended": false, "official": false, "description": "Meteor" From e51e72b4d76b4f2d8a58ffee3e9b6e33f1da9cf5 Mon Sep 17 00:00:00 2001 From: Simon Fridlund Date: Fri, 2 Jun 2017 21:21:22 +0200 Subject: [PATCH 010/113] Trigger ready callback on resubscribe This fixes #1173. --- packages/ddp-client/livedata_connection.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/ddp-client/livedata_connection.js b/packages/ddp-client/livedata_connection.js index 331e14be2d..60f2eecb47 100644 --- a/packages/ddp-client/livedata_connection.js +++ b/packages/ddp-client/livedata_connection.js @@ -582,8 +582,15 @@ _.extend(Connection.prototype, { // an onReady callback inside an autorun; the semantics we provide is // that at the time the sub first becomes ready, we call the last // onReady callback provided, if any.) - if (!existing.ready) + // If the sub is already ready, run the ready callback right away. + // It seems that users would expect an onReady callback inside an + // autorun to trigger once the the sub first becomes ready and also + // when re-subs happens. + if (existing.ready) { + callbacks.onReady(); + } else { existing.readyCallback = callbacks.onReady; + } } // XXX COMPAT WITH 1.0.3.1 we used to have onError but now we call From 5b9e23f2dba1eb9cd4777317a5a802fac8fc2609 Mon Sep 17 00:00:00 2001 From: Simon Fridlund Date: Sat, 3 Jun 2017 02:11:43 +0200 Subject: [PATCH 011/113] Update tests for reactive sub and reub --- .../ddp-client/livedata_connection_tests.js | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/ddp-client/livedata_connection_tests.js b/packages/ddp-client/livedata_connection_tests.js index c0b21b69b1..ffc16e372d 100644 --- a/packages/ddp-client/livedata_connection_tests.js +++ b/packages/ddp-client/livedata_connection_tests.js @@ -291,11 +291,11 @@ Tinytest.add("livedata stub - reactive subscribe", function (test) { // Change the foo subscription and flush. We should sub to the new foo // subscription, re-sub to the stopper subscription, and then unsub from the old - // foo subscription. The bar subscription should be unaffected. The completer - // subscription should *NOT* call its new onReady callback, because we only - // call at most one onReady for a given reactively-saved subscription. + // foo subscription. The bar subscription should be unaffected. The completer + // subscription should call its new onReady callback, because we always + // call onReady for a given reactively-saved subscription. // The completerHandle should have been reestablished to the ready handle. - rFoo.set("foo2"); + rFoo.set("foo2"); Tracker.flush(); test.length(stream.sent, 3); @@ -312,17 +312,17 @@ Tinytest.add("livedata stub - reactive subscribe", function (test) { message = JSON.parse(stream.sent.shift()); test.equal(message, {msg: 'unsub', id: idFoo1}); - test.equal(onReadyCount, {completer: 1}); + test.equal(onReadyCount, {completer: 2}); test.isTrue(completerReady); // Ready the stopper and bar subs. Completing stopper should call only the // onReady from the new subscription because they were separate subscriptions // started at different times and the first one was explicitly torn down by - // the client; completing bar should call only the onReady from the new - // subscription because we only call at most one onReady per reactively-saved + // the client; completing bar should call the onReady from the new + // subscription because we always call onReady for a given reactively-saved // subscription. stream.receive({msg: 'ready', 'subs': [idStopperAgain, idBar1]}); - test.equal(onReadyCount, {completer: 1, bar1: 1, stopper: 1}); + test.equal(onReadyCount, {completer: 2, bar1: 1, stopper: 1}); // Shut down the autorun. This should unsub us from all current subs at flush // time. @@ -1310,15 +1310,24 @@ Tinytest.add("livedata stub - reactive resub", function (test) { }); markAllReady(); + var message = JSON.parse(stream.sent.shift()); + delete message.id; + test.equal(message, {msg: 'sub', name: 'foo-sub', params: ['A']}); test.equal(fooReady, 1); // Rerun the inner autorun with different subscription - // arguments. Detect the re-sub via onReady. + // arguments. fooArg.set('B'); test.isTrue(inner.invalidated); Tracker.flush(); test.isFalse(inner.invalidated); markAllReady(); + message = JSON.parse(stream.sent.shift()); + delete message.id; + test.equal(message, {msg: 'sub', name: 'foo-sub', params: ['B']}); + message = JSON.parse(stream.sent.shift()); + delete message.id; + test.equal(message, {msg: 'unsub'}); test.equal(fooReady, 2); // Rerun inner again with same args; should be no re-sub. @@ -1327,7 +1336,8 @@ Tinytest.add("livedata stub - reactive resub", function (test) { Tracker.flush(); test.isFalse(inner.invalidated); markAllReady(); - test.equal(fooReady, 2); + test.isUndefined(stream.sent.shift()); test.isUndefined(stream.sent.shift()); + test.equal(fooReady, 3); // Rerun outer! Should still be no re-sub even though // the inner computation is stopped and a new one is @@ -1337,13 +1347,20 @@ Tinytest.add("livedata stub - reactive resub", function (test) { Tracker.flush(); test.isFalse(inner.invalidated); markAllReady(); - test.equal(fooReady, 2); + test.isUndefined(stream.sent.shift()); + test.equal(fooReady, 4); // Change the subscription. Now we should get an onReady. fooArg.set('C'); Tracker.flush(); markAllReady(); - test.equal(fooReady, 3); + message = JSON.parse(stream.sent.shift()); + delete message.id; + test.equal(message, {msg: 'sub', name: 'foo-sub', params: ['C']}); + message = JSON.parse(stream.sent.shift()); + delete message.id; + test.equal(message, {msg: 'unsub'}); + test.equal(fooReady, 5); }); From ad243d95664ea21b1488e22097e0a61c9114e20a Mon Sep 17 00:00:00 2001 From: Simon Fridlund Date: Sat, 3 Jun 2017 02:30:18 +0200 Subject: [PATCH 012/113] Update History.md --- History.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.md b/History.md index da1a4602bc..ad7f43f5ae 100644 --- a/History.md +++ b/History.md @@ -7,6 +7,10 @@ present when `observe` or `observeChanges` was called are now available inside the callbacks. [PR #8734](https://github.com/meteor/meteor/pull/8734) +* Subscriptions onReady now fire on re-subscription with the same arguments. + [PR #8754](https://github.com/meteor/meteor/pull/8754) + [Issue #1173](https://github.com/meteor/meteor/issues/1173) + * `reactive-dict` now supports setting initial data when defining a named `ReactiveDict`. No longer run migration logic when used on the server, this is to prevent duplicate name error on reloads. Initial data is now From 49a28be680d682e3acd864a08e43d5c63e526dc6 Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Thu, 8 Jun 2017 20:21:10 +0300 Subject: [PATCH 013/113] Bump major version of `ddp-client` for #8754. To reflect that meteor/meteor#8754 is a breaking change, we should bump the major version here. --- packages/ddp-client/package.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js index 61126f7665..8a2ba3a5a6 100644 --- a/packages/ddp-client/package.js +++ b/packages/ddp-client/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data client", - version: '1.3.5-beta.2', + version: '2.0.0-beta.2', documentation: null }); From 94a6d13977d431f63125d137f9ecc0a09dc64a38 Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Wed, 14 Jun 2017 18:49:27 +0300 Subject: [PATCH 014/113] Add additional History.md clarity for #8754. [no ci] --- History.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index ad7f43f5ae..57fd00b598 100644 --- a/History.md +++ b/History.md @@ -7,7 +7,16 @@ present when `observe` or `observeChanges` was called are now available inside the callbacks. [PR #8734](https://github.com/meteor/meteor/pull/8734) -* Subscriptions onReady now fire on re-subscription with the same arguments. +* A subscription's `onReady` is now fired again during a re-subscription, even + if the subscription has the same arguments. Previously, when subscribing + to a publication the `onReady` would have only been called if the arguments + were different, creating a confusing difference in functionality. This may be + breaking behavior if an app uses the firing of `onReady` as an assumption + that the data was just received from the server. If such functionality is + still necessary, consider using + [`observe`](https://docs.meteor.com/api/collections.html#Mongo-Cursor-observe) + or + [`observeChanges`](https://docs.meteor.com/api/collections.html#Mongo-Cursor-observeChanges) [PR #8754](https://github.com/meteor/meteor/pull/8754) [Issue #1173](https://github.com/meteor/meteor/issues/1173) From 7cb7866b6096c4cca44d38612d69a5fc07a215f9 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 21 Jun 2017 13:50:33 -0400 Subject: [PATCH 015/113] Bump package versions for 1.5.1-beta.3 release. --- packages/accounts-base/package.js | 2 +- packages/accounts-password/package.js | 2 +- packages/allow-deny/package.js | 2 +- packages/babel-compiler/package.js | 2 +- packages/ddp-client/package.js | 2 +- packages/ddp-common/package.js | 2 +- packages/ddp-server/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/meteor/package.js | 2 +- packages/minifier-js/package.js | 2 +- packages/modules/package.js | 2 +- packages/mongo/package.js | 2 +- packages/standard-minifier-js/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js index 44e9d0fa4a..89ac183f9c 100644 --- a/packages/accounts-base/package.js +++ b/packages/accounts-base/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "A user account system", - version: "1.3.1-beta.2" + version: "1.3.1-beta.3" }); Package.onUse(function (api) { diff --git a/packages/accounts-password/package.js b/packages/accounts-password/package.js index 5f1a8718a4..9ec51e7c3c 100644 --- a/packages/accounts-password/package.js +++ b/packages/accounts-password/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Password support for accounts", - version: "2.0.0-beta.2" + version: "2.0.0-beta.3" }); Package.onUse(function(api) { diff --git a/packages/allow-deny/package.js b/packages/allow-deny/package.js index 65f3211fc4..0787195376 100644 --- a/packages/allow-deny/package.js +++ b/packages/allow-deny/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'allow-deny', - version: '1.0.6-beta.2', + version: '1.0.6-beta.3', // 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. diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index 8e9407ed8b..b1c18348f6 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.19.3-beta.2' + version: '6.19.3-beta.3' }); Npm.depends({ diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js index 8a2ba3a5a6..4b020865a9 100644 --- a/packages/ddp-client/package.js +++ b/packages/ddp-client/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data client", - version: '2.0.0-beta.2', + version: '2.0.0-beta.3', documentation: null }); diff --git a/packages/ddp-common/package.js b/packages/ddp-common/package.js index a4534b07cd..f797d78093 100644 --- a/packages/ddp-common/package.js +++ b/packages/ddp-common/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Code shared beween ddp-client and ddp-server", - version: '1.2.9-beta.2', + version: '1.2.9-beta.3', documentation: null }); diff --git a/packages/ddp-server/package.js b/packages/ddp-server/package.js index 6baf2a917c..40d019ac75 100644 --- a/packages/ddp-server/package.js +++ b/packages/ddp-server/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data server", - version: '2.0.0-beta.2', + version: '2.0.0-beta.3', documentation: null }); diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index c5ce1f3ecd..600015e2e2 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.8.1-beta.2', + version: '0.8.1-beta.3', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index d7e56ddea1..bbf5ac9deb 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.1-beta.2' + version: '1.5.1-beta.3' }); Package.includeTool(); diff --git a/packages/meteor/package.js b/packages/meteor/package.js index 06962114e3..7508b0c7c5 100644 --- a/packages/meteor/package.js +++ b/packages/meteor/package.js @@ -2,7 +2,7 @@ Package.describe({ summary: "Core Meteor environment", - version: '1.7.0-beta.2' + version: '1.7.0-beta.3' }); Package.registerBuildPlugin({ diff --git a/packages/minifier-js/package.js b/packages/minifier-js/package.js index c30512b3f7..ee4de288b1 100644 --- a/packages/minifier-js/package.js +++ b/packages/minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "JavaScript minifier", - version: "2.1.1-beta.2" + version: "2.1.1-beta.3" }); Npm.depends({ diff --git a/packages/modules/package.js b/packages/modules/package.js index ea7bf746e1..9039726e73 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.9.2-beta.2", + version: "0.9.2-beta.3", summary: "CommonJS module system", documentation: "README.md" }); diff --git a/packages/mongo/package.js b/packages/mongo/package.js index cebb2fa929..65abb40575 100644 --- a/packages/mongo/package.js +++ b/packages/mongo/package.js @@ -9,7 +9,7 @@ Package.describe({ summary: "Adaptor for using MongoDB and Minimongo over DDP", - version: '1.1.19-beta.2' + version: '1.1.19-beta.3' }); Npm.depends({ diff --git a/packages/standard-minifier-js/package.js b/packages/standard-minifier-js/package.js index 3e6a804fd9..d9c0d8fab8 100644 --- a/packages/standard-minifier-js/package.js +++ b/packages/standard-minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'standard-minifier-js', - version: '2.1.1-beta.2', + version: '2.1.1-beta.3', summary: 'Standard javascript minifiers used with Meteor apps by default.', documentation: 'README.md', }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index fe2d9e9b21..c98420f5ce 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5.1-beta.2", + "version": "1.5.1-beta.3", "recommended": false, "official": false, "description": "Meteor" From f5d1cd9c2408e954ae6e9e101e4d3d00e3498467 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 21 Jun 2017 14:37:47 -0400 Subject: [PATCH 016/113] Update uglify-js to version 3.0.18. --- History.md | 2 ++ packages/minifier-js/.npm/package/npm-shrinkwrap.json | 6 +++--- packages/minifier-js/package.js | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/History.md b/History.md index 57fd00b598..deea9a0857 100644 --- a/History.md +++ b/History.md @@ -66,6 +66,8 @@ * The `reify` npm package has been upgraded to version 0.11.24. +* The `uglify-js` npm package has been upgraded to version 3.0.18. + * Illegal characters in paths written in build output directories will now be replaced with `_`s rather than removed, so that file and directory names consisting of only illegal characters do not become empty diff --git a/packages/minifier-js/.npm/package/npm-shrinkwrap.json b/packages/minifier-js/.npm/package/npm-shrinkwrap.json index a58743385e..b92b6f3593 100644 --- a/packages/minifier-js/.npm/package/npm-shrinkwrap.json +++ b/packages/minifier-js/.npm/package/npm-shrinkwrap.json @@ -16,9 +16,9 @@ "from": "source-map@>=0.5.1 <0.6.0" }, "uglify-js": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.15.tgz", - "from": "uglify-js@3.0.15" + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.18.tgz", + "from": "uglify-js@3.0.18" } } } diff --git a/packages/minifier-js/package.js b/packages/minifier-js/package.js index ee4de288b1..bc338e386d 100644 --- a/packages/minifier-js/package.js +++ b/packages/minifier-js/package.js @@ -4,7 +4,7 @@ Package.describe({ }); Npm.depends({ - "uglify-js": "3.0.15" + "uglify-js": "3.0.18" }); Package.onUse(function (api) { From 78553410b65badd74d8d4d42708dd412aa24a161 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Wed, 21 Jun 2017 14:50:03 -0400 Subject: [PATCH 017/113] Remove beta suffixes from modules, babel-compiler, ecmascript. These packages need to be published in advance of the 1.5.1 release. --- packages/babel-compiler/package.js | 2 +- packages/ecmascript/package.js | 2 +- packages/modules/package.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/babel-compiler/package.js b/packages/babel-compiler/package.js index b1c18348f6..a6542ae28b 100644 --- a/packages/babel-compiler/package.js +++ b/packages/babel-compiler/package.js @@ -6,7 +6,7 @@ Package.describe({ // isn't possible because you can't publish a non-recommended // release with package versions that don't have a pre-release // identifier at the end (eg, -dev) - version: '6.19.3-beta.3' + version: '6.19.3' }); Npm.depends({ diff --git a/packages/ecmascript/package.js b/packages/ecmascript/package.js index 600015e2e2..921deb8b43 100644 --- a/packages/ecmascript/package.js +++ b/packages/ecmascript/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'ecmascript', - version: '0.8.1-beta.3', + version: '0.8.1', summary: 'Compiler plugin that supports ES2015+ in all .js files', documentation: 'README.md' }); diff --git a/packages/modules/package.js b/packages/modules/package.js index 9039726e73..479325548b 100644 --- a/packages/modules/package.js +++ b/packages/modules/package.js @@ -1,6 +1,6 @@ Package.describe({ name: "modules", - version: "0.9.2-beta.3", + version: "0.9.2", summary: "CommonJS module system", documentation: "README.md" }); From 36b599496e20441d49f55a645b31a608d9ceb1eb Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 22 Jun 2017 11:17:14 -0400 Subject: [PATCH 018/113] Bump ddp package version (accidentally missed in 1.5.1-beta.3). Will fix #8830, as explained by https://github.com/meteor/meteor/issues/8830#issuecomment-310378955. Related: ac12eea2d428cd837a78de5fc03a8ca691d6ceeb --- packages/ddp/package.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ddp/package.js b/packages/ddp/package.js index 287f90ade8..719aea29c9 100644 --- a/packages/ddp/package.js +++ b/packages/ddp/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data framework", - version: '1.2.5' + version: '1.3.0-beta.3' }); Package.onUse(function (api) { From 5b43e2d1c26cf065dc2608657c564db713427e59 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Thu, 22 Jun 2017 11:23:46 -0400 Subject: [PATCH 019/113] Bump package versions for 1.5.1-beta.4 release. This release should make the problem reported in #8830 go away. --- packages/accounts-base/package.js | 2 +- packages/accounts-password/package.js | 2 +- packages/allow-deny/package.js | 2 +- packages/ddp-client/package.js | 2 +- packages/ddp-common/package.js | 2 +- packages/ddp-server/package.js | 2 +- packages/ddp/package.js | 2 +- packages/meteor-tool/package.js | 2 +- packages/meteor/package.js | 2 +- packages/minifier-js/package.js | 2 +- packages/mongo/package.js | 2 +- packages/standard-minifier-js/package.js | 2 +- scripts/admin/meteor-release-experimental.json | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/accounts-base/package.js b/packages/accounts-base/package.js index 89ac183f9c..c3de465a58 100644 --- a/packages/accounts-base/package.js +++ b/packages/accounts-base/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "A user account system", - version: "1.3.1-beta.3" + version: "1.3.1-beta.4" }); Package.onUse(function (api) { diff --git a/packages/accounts-password/package.js b/packages/accounts-password/package.js index 9ec51e7c3c..17a121f1a8 100644 --- a/packages/accounts-password/package.js +++ b/packages/accounts-password/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Password support for accounts", - version: "2.0.0-beta.3" + version: "2.0.0-beta.4" }); Package.onUse(function(api) { diff --git a/packages/allow-deny/package.js b/packages/allow-deny/package.js index 0787195376..52dc87de8f 100644 --- a/packages/allow-deny/package.js +++ b/packages/allow-deny/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'allow-deny', - version: '1.0.6-beta.3', + version: '1.0.6-beta.4', // 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. diff --git a/packages/ddp-client/package.js b/packages/ddp-client/package.js index 4b020865a9..0329f5c011 100644 --- a/packages/ddp-client/package.js +++ b/packages/ddp-client/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data client", - version: '2.0.0-beta.3', + version: '2.0.0-beta.4', documentation: null }); diff --git a/packages/ddp-common/package.js b/packages/ddp-common/package.js index f797d78093..b0c1fbc948 100644 --- a/packages/ddp-common/package.js +++ b/packages/ddp-common/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Code shared beween ddp-client and ddp-server", - version: '1.2.9-beta.3', + version: '1.2.9-beta.4', documentation: null }); diff --git a/packages/ddp-server/package.js b/packages/ddp-server/package.js index 40d019ac75..5649ad55d7 100644 --- a/packages/ddp-server/package.js +++ b/packages/ddp-server/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data server", - version: '2.0.0-beta.3', + version: '2.0.0-beta.4', documentation: null }); diff --git a/packages/ddp/package.js b/packages/ddp/package.js index 719aea29c9..e66b292f4d 100644 --- a/packages/ddp/package.js +++ b/packages/ddp/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Meteor's latency-compensated distributed data framework", - version: '1.3.0-beta.3' + version: '1.3.0-beta.4' }); Package.onUse(function (api) { diff --git a/packages/meteor-tool/package.js b/packages/meteor-tool/package.js index bbf5ac9deb..48da1a7ade 100644 --- a/packages/meteor-tool/package.js +++ b/packages/meteor-tool/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "The Meteor command-line tool", - version: '1.5.1-beta.3' + version: '1.5.1-beta.4' }); Package.includeTool(); diff --git a/packages/meteor/package.js b/packages/meteor/package.js index 7508b0c7c5..abfb9ecb78 100644 --- a/packages/meteor/package.js +++ b/packages/meteor/package.js @@ -2,7 +2,7 @@ Package.describe({ summary: "Core Meteor environment", - version: '1.7.0-beta.3' + version: '1.7.0-beta.4' }); Package.registerBuildPlugin({ diff --git a/packages/minifier-js/package.js b/packages/minifier-js/package.js index bc338e386d..ed25375c12 100644 --- a/packages/minifier-js/package.js +++ b/packages/minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "JavaScript minifier", - version: "2.1.1-beta.3" + version: "2.1.1-beta.4" }); Npm.depends({ diff --git a/packages/mongo/package.js b/packages/mongo/package.js index 65abb40575..18e869853d 100644 --- a/packages/mongo/package.js +++ b/packages/mongo/package.js @@ -9,7 +9,7 @@ Package.describe({ summary: "Adaptor for using MongoDB and Minimongo over DDP", - version: '1.1.19-beta.3' + version: '1.1.19-beta.4' }); Npm.depends({ diff --git a/packages/standard-minifier-js/package.js b/packages/standard-minifier-js/package.js index d9c0d8fab8..6f9e340017 100644 --- a/packages/standard-minifier-js/package.js +++ b/packages/standard-minifier-js/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'standard-minifier-js', - version: '2.1.1-beta.3', + version: '2.1.1-beta.4', summary: 'Standard javascript minifiers used with Meteor apps by default.', documentation: 'README.md', }); diff --git a/scripts/admin/meteor-release-experimental.json b/scripts/admin/meteor-release-experimental.json index c98420f5ce..8125d23f71 100644 --- a/scripts/admin/meteor-release-experimental.json +++ b/scripts/admin/meteor-release-experimental.json @@ -1,6 +1,6 @@ { "track": "METEOR", - "version": "1.5.1-beta.3", + "version": "1.5.1-beta.4", "recommended": false, "official": false, "description": "Meteor" From 4ff0d0d469e0d6608b21d111014054e265d703b4 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 23 Jun 2017 15:57:03 -0400 Subject: [PATCH 020/113] First pass at modernizing the webapp package. --- packages/webapp/package.js | 16 ++-- packages/webapp/webapp_client.js | 23 ++--- packages/webapp/webapp_server.js | 145 +++++++++++++++---------------- 3 files changed, 95 insertions(+), 89 deletions(-) diff --git a/packages/webapp/package.js b/packages/webapp/package.js index 3577375bac..1d71d39a65 100644 --- a/packages/webapp/package.js +++ b/packages/webapp/package.js @@ -30,15 +30,19 @@ Package.onUse(function (api) { // (browser-policy depends on webapp). So we don't explicitly depend in any // way on browser-policy here, but we use it when it is loaded, and it can be // loaded after webapp. - api.export(['WebApp', 'main', 'WebAppInternals'], 'server'); - api.export(['WebApp'], 'client'); - api.addFiles('webapp_server.js', 'server'); - api.addFiles('webapp_client.js', 'client'); - api.addFiles('webapp_cordova.js', 'web.cordova'); + api.mainModule('webapp_server.js', 'server'); + api.export('WebApp', 'server'); + api.export('WebAppInternals', 'server'); + api.export('main', 'server'); + + api.mainModule('webapp_client.js', 'client'); + api.export('WebApp', 'client'); + + api.mainModule('webapp_cordova.js', 'web.cordova'); }); Package.onTest(function (api) { - api.use(['tinytest', 'webapp', 'http', 'underscore']); + api.use(['tinytest', 'ecmascript', 'webapp', 'http', 'underscore']); api.addFiles('webapp_tests.js', 'server'); api.addFiles('webapp_client_tests.js', 'client'); }); diff --git a/packages/webapp/webapp_client.js b/packages/webapp/webapp_client.js index 49d138480e..70d4a764e5 100644 --- a/packages/webapp/webapp_client.js +++ b/packages/webapp/webapp_client.js @@ -1,15 +1,18 @@ -WebApp = { - - _isCssLoaded: function () { - if (document.styleSheets.length === 0) +export const WebApp = { + _isCssLoaded() { + if (document.styleSheets.length === 0) { return true; + } - return _.find(document.styleSheets, function (sheet) { - if (sheet.cssText && !sheet.cssRules) // IE8 - return !sheet.cssText.match(/meteor-css-not-found-error/); - return !_.find(sheet.cssRules, function (rule) { - return rule.selectorText === '.meteor-css-not-found-error'; - }); + return _.find(document.styleSheets, sheet => { + if (sheet.cssText && ! sheet.cssRules) { // IE8 + return ! sheet.cssText.match(/meteor-css-not-found-error/); + } + + return ! _.find( + sheet.cssRules, + rule => rule.selectorText === '.meteor-css-not-found-error' + ); }); } }; diff --git a/packages/webapp/webapp_server.js b/packages/webapp/webapp_server.js index ff555ad387..f76daedadf 100644 --- a/packages/webapp/webapp_server.js +++ b/packages/webapp/webapp_server.js @@ -1,25 +1,21 @@ -////////// Requires ////////// - -var fs = Npm.require("fs"); -var http = Npm.require("http"); -var os = Npm.require("os"); -var path = Npm.require("path"); -var url = Npm.require("url"); -var crypto = Npm.require("crypto"); - -var connect = Npm.require('connect'); -var parseurl = Npm.require('parseurl'); -var useragent = Npm.require('useragent'); -var send = Npm.require('send'); - -var Future = Npm.require('fibers/future'); -var Fiber = Npm.require('fibers'); +import { readFile } from "fs"; +import { createServer } from "http"; +import { + join as pathJoin, + dirname as pathDirname, +} from "path"; +import { parse as parseUrl } from "url"; +import { createHash } from "crypto"; +import connect from "connect"; +import parseRequest from "parseurl"; +import { lookup as lookupUserAgent } from "useragent"; +import send from "send"; var SHORT_SOCKET_TIMEOUT = 5*1000; var LONG_SOCKET_TIMEOUT = 120*1000; -WebApp = {}; -WebAppInternals = {}; +export const WebApp = {}; +export const WebAppInternals = {}; WebAppInternals.NpmModules = { connect: { @@ -43,13 +39,13 @@ var bundledJsCssUrlRewriteHook = function (url) { }; var sha1 = function (contents) { - var hash = crypto.createHash('sha1'); + var hash = createHash('sha1'); hash.update(contents); return hash.digest('hex'); }; var readUtf8FileSync = function (filename) { - return Meteor.wrapAsync(fs.readFile)(filename, 'utf8'); + return Meteor.wrapAsync(readFile)(filename, 'utf8'); }; // #BrowserIdentification @@ -98,7 +94,7 @@ var camelCase = function (name) { }; var identifyBrowser = function (userAgentString) { - var userAgent = useragent.lookup(userAgentString); + var userAgent = lookupUserAgent(userAgentString); return { name: camelCase(userAgent.family), major: +userAgent.major, @@ -113,7 +109,7 @@ WebAppInternals.identifyBrowser = identifyBrowser; WebApp.categorizeRequest = function (req) { return _.extend({ browser: identifyBrowser(req.headers['user-agent']), - url: url.parse(req.url, true) + url: parseUrl(req.url, true) }, _.pick(req, 'dynamicHead', 'dynamicBody')); }; @@ -292,7 +288,7 @@ WebAppInternals.generateBoilerplateInstance = function (arch, return new Boilerplate(arch, manifest, _.extend({ pathMapper: function (itemPath) { - return path.join(archPath[arch], itemPath); }, + return pathJoin(archPath[arch], itemPath); }, baseDataExtension: { additionalStaticJs: _.map( additionalStaticJs || [], @@ -338,7 +334,7 @@ WebAppInternals.staticFilesMiddleware = function (staticFiles, req, res, next) { next(); return; } - var pathname = parseurl(req).pathname; + var pathname = parseRequest(req).pathname; try { pathname = decodeURIComponent(pathname); } catch (e) { @@ -449,12 +445,12 @@ WebAppInternals.parsePort = function (port) { return parseInt(port); }; -var runWebAppServer = function () { +function runWebAppServer() { var shuttingDown = false; var syncQueue = new Meteor._SynchronousQueue(); var getItemPathname = function (itemUrl) { - return decodeURIComponent(url.parse(itemUrl).pathname); + return decodeURIComponent(parseUrl(itemUrl).pathname); }; WebAppInternals.reloadClientPrograms = function () { @@ -462,9 +458,9 @@ var runWebAppServer = function () { staticFiles = {}; var generateClientProgram = function (clientPath, arch) { // read the control for the client we'll be serving up - var clientJsonPath = path.join(__meteor_bootstrap__.serverDir, + var clientJsonPath = pathJoin(__meteor_bootstrap__.serverDir, clientPath); - var clientDir = path.dirname(clientJsonPath); + var clientDir = pathDirname(clientJsonPath); var clientJson = JSON.parse(readUtf8FileSync(clientJsonPath)); if (clientJson.format !== "web-program-pre1") throw new Error("Unsupported format for client assets: " + @@ -479,7 +475,7 @@ var runWebAppServer = function () { _.each(manifest, function (item) { if (item.url && item.where === "client") { staticFiles[urlPrefix + getItemPathname(item.url)] = { - absolutePath: path.join(clientDir, item.path), + absolutePath: pathJoin(clientDir, item.path), cacheable: item.cacheable, hash: item.hash, // Link from source to its map @@ -491,7 +487,7 @@ var runWebAppServer = function () { // Serve the source map too, under the specified URL. We assume all // source maps are cacheable. staticFiles[urlPrefix + getItemPathname(item.sourceMapUrl)] = { - absolutePath: path.join(clientDir, item.sourceMap), + absolutePath: pathJoin(clientDir, item.sourceMap), cacheable: true }; } @@ -526,7 +522,7 @@ var runWebAppServer = function () { try { var clientPaths = __meteor_bootstrap__.configJson.clientPaths; _.each(clientPaths, function (clientPath, arch) { - archPath[arch] = path.dirname(clientPath); + archPath[arch] = pathDirname(clientPath); generateClientProgram(clientPath, arch); }); @@ -643,9 +639,9 @@ var runWebAppServer = function () { // Serve static files from the manifest. // This is inspired by the 'static' middleware. app.use(function (req, res, next) { - Fiber(function () { - WebAppInternals.staticFilesMiddleware(staticFiles, req, res, next); - }).run(); + Promise.resolve().then(() => { + WebAppInternals.staticFilesMiddleware(staticFiles, req, res, next); + }); }); // Packages and apps can add handlers to this via WebApp.connectHandlers. @@ -667,15 +663,18 @@ var runWebAppServer = function () { }); app.use(function (req, res, next) { - Fiber(function () { - if (!appUrl(req.url)) + Promise.resolve().then(() => { + if (! appUrl(req.url)) { return next(); + } var headers = { 'Content-Type': 'text/html; charset=utf-8' }; - if (shuttingDown) + + if (shuttingDown) { headers['Connection'] = 'Close'; + } var request = WebApp.categorizeRequest(req); @@ -692,7 +691,7 @@ var runWebAppServer = function () { res.writeHead(200, headers); res.write(".meteor-css-not-found-error { width: 0px;}"); res.end(); - return undefined; + return; } if (request.url.query && request.url.query['meteor_js_resource']) { @@ -703,7 +702,7 @@ var runWebAppServer = function () { headers['Cache-Control'] = 'no-cache'; res.writeHead(404, headers); res.end("404 Not Found"); - return undefined; + return; } if (request.url.query && request.url.query['meteor_dont_serve_index']) { @@ -714,11 +713,11 @@ var runWebAppServer = function () { headers['Cache-Control'] = 'no-cache'; res.writeHead(404, headers); res.end("404 Not Found"); - return undefined; + return; } // /packages/asdfsad ... /__cordova/dafsdf.js - var pathname = parseurl(req).pathname; + var pathname = parseRequest(req).pathname; var archKey = pathname.split('/')[1]; var archKeyCleaned = 'web.' + archKey.replace(/^__/, ''); @@ -735,15 +734,16 @@ var runWebAppServer = function () { Log.error("Error running template: " + e.stack); res.writeHead(500, headers); res.end(); - return undefined; + return; } var statusCode = res.statusCode ? res.statusCode : 200; res.writeHead(statusCode, headers); res.write(boilerplate); res.end(); - return undefined; - }).run(); + + return; + }); }); // Return 404 by default, if no other handlers serve this URL. @@ -753,7 +753,7 @@ var runWebAppServer = function () { }); - var httpServer = http.createServer(app); + var httpServer = createServer(app); var onListeningCallbacks = []; // After 5 seconds w/o data on a socket, kill it. On the other hand, if @@ -805,37 +805,36 @@ var runWebAppServer = function () { f(); } }); - - // Let the rest of the packages (and Meteor.startup hooks) insert connect - // middlewares and update __meteor_runtime_config__, then keep going to set up - // actually serving HTML. - main = function (argv) { - WebAppInternals.generateBoilerplate(); - - // only start listening after all the startup code has run. - var localPort = WebAppInternals.parsePort(process.env.PORT) || 0; - var host = process.env.BIND_IP; - var localIp = host || '0.0.0.0'; - httpServer.listen(localPort, localIp, Meteor.bindEnvironment(function() { - if (process.env.METEOR_PRINT_ON_LISTEN) - console.log("LISTENING"); // must match run-app.js - - var callbacks = onListeningCallbacks; - onListeningCallbacks = null; - _.each(callbacks, function (x) { x(); }); - - }, function (e) { - console.error("Error listening:", e); - console.error(e && e.stack); - })); - - return 'DAEMON'; - }; -}; - +} runWebAppServer(); +// Let the rest of the packages (and Meteor.startup hooks) insert connect +// middlewares and update __meteor_runtime_config__, then keep going to set up +// actually serving HTML. +export function main(argv) { + WebAppInternals.generateBoilerplate(); + + // Only start listening after all the startup code has run. + var localPort = WebAppInternals.parsePort(process.env.PORT) || 0; + var host = process.env.BIND_IP; + var localIp = host || '0.0.0.0'; + WebApp.httpServer.listen(localPort, localIp, Meteor.bindEnvironment(function() { + if (process.env.METEOR_PRINT_ON_LISTEN) { + console.log("LISTENING"); // must match run-app.js + } + + var callbacks = onListeningCallbacks; + onListeningCallbacks = null; + _.each(callbacks, function (x) { x(); }); + + }, function (e) { + console.error("Error listening:", e); + console.error(e && e.stack); + })); + + return 'DAEMON'; +} var inlineScriptsAllowed = true; From 7ac873d0e129d83a5869e05a61cacc9f81ec133e Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 23 Jun 2017 16:00:04 -0400 Subject: [PATCH 021/113] Implement WebAppInternals.registerBoilerplateDataCallback. This API allows registering callbacks that have the opportunity to modify boilerplate.baseData on each request, which will be useful for implementing server-side rendering. The code in question behaves the same as before if there are no callbacks registered, so this change should be completely backwards compatible. --- packages/webapp/webapp_server.js | 85 ++++++++++++++++++++++++++------ packages/webapp/webapp_tests.js | 36 ++++++++++++++ 2 files changed, 106 insertions(+), 15 deletions(-) diff --git a/packages/webapp/webapp_server.js b/packages/webapp/webapp_server.js index f76daedadf..7046e9e8e9 100644 --- a/packages/webapp/webapp_server.js +++ b/packages/webapp/webapp_server.js @@ -237,6 +237,33 @@ WebApp._timeoutAdjustmentRequestCallback = function (req, res) { // - baseData: XXX var boilerplateByArch = {}; +// Register a callback function that can selectively modify boilerplate +// data given arguments (data, request, arch). The key should be a unique +// identifier, to prevent accumulating duplicate callbacks from the same +// call site over time. Callbacks will be called in the order they were +// registered. A callback should return false if it did not make any +// changes affecting the boilerplate. Passing null deletes the callback. +// Any previous callback registered for this key will be returned. +const boilerplateDataCallbacks = Object.create(null); +WebAppInternals.registerBoilerplateDataCallback = function (key, callback) { + const previousCallback = boilerplateDataCallbacks[key]; + if (previousCallback) { + // Delete any existing callback first, so the new callback is always a + // new property, and thus will come last in Object.keys order. + delete boilerplateDataCallbacks[key]; + } + + if (typeof callback === "function") { + boilerplateDataCallbacks[key] = callback; + } else if (callback !== null) { + throw new Error("Bad callback: " + callback); + } + + // Return the previous callback in case the new callback needs to call + // it; for example, when the new callback is a wrapper for the old. + return previousCallback; +}; + // Given a request (as returned from `categorizeRequest`), return the // boilerplate HTML to serve for that request. // @@ -247,33 +274,61 @@ var boilerplateByArch = {}; // XXX so far this function is always called with arch === 'web.browser' var memoizedBoilerplate = {}; var getBoilerplate = function (request, arch) { - var useMemoized = ! (request.dynamicHead || request.dynamicBody); - var htmlAttributes = getHtmlAttributes(request); - + const boilerplate = boilerplateByArch[arch]; + let madeChanges = false; + let baseDataCopy; // Lazy copy of boilerplate.baseData. + + Object.keys(boilerplateDataCallbacks).forEach(key => { + const callback = boilerplateDataCallbacks[key]; + + // Copy boilerplate.baseData only if there are any callbacks. + baseDataCopy = baseDataCopy || { ...boilerplate.baseData }; + + // Callbacks should return false if they did not make any changes. + if (callback(baseDataCopy, request, arch) !== false) { + madeChanges = true; + } + }); + + const htmlAttributes = getHtmlAttributes(request); + const useMemoized = ! ( + request.dynamicHead || + request.dynamicBody || + madeChanges + ); + if (useMemoized) { - // The only thing that changes from request to request (unless extra - // content is added to the head or body) are the HTML attributes - // (used by, eg, appcache) and whether inline scripts are allowed, so we - // can memoize based on that. + // The only thing that changes from request to request (unless extra + // content is added to the head or body, or boilerplateDataCallbacks + // modified the data) are the HTML attributes (used by, eg, appcache) + // and whether inline scripts are allowed, so memoize based on that. var memHash = JSON.stringify({ - inlineScriptsAllowed: inlineScriptsAllowed, - htmlAttributes: htmlAttributes, - arch: arch + inlineScriptsAllowed, + htmlAttributes, + arch, }); if (! memoizedBoilerplate[memHash]) { memoizedBoilerplate[memHash] = boilerplateByArch[arch].toHTML({ - htmlAttributes: htmlAttributes + htmlAttributes, }); } + return memoizedBoilerplate[memHash]; } - - var boilerplateOptions = _.extend({ - htmlAttributes: htmlAttributes + + var boilerplateOptions = Object.assign({ + htmlAttributes, }, _.pick(request, 'dynamicHead', 'dynamicBody')); + + if (madeChanges) { + boilerplateOptions = Object.assign( + baseDataCopy, + boilerplateOptions + ); + } - return boilerplateByArch[arch].toHTML(boilerplateOptions); + return boilerplate.toHTML(boilerplateOptions); }; WebAppInternals.generateBoilerplateInstance = function (arch, diff --git a/packages/webapp/webapp_tests.js b/packages/webapp/webapp_tests.js index 2600be7204..312bc67953 100644 --- a/packages/webapp/webapp_tests.js +++ b/packages/webapp/webapp_tests.js @@ -156,6 +156,42 @@ Tinytest.add("webapp - generating boilerplate should not change runtime config", test.isFalse(__meteor_runtime_config__.WEBAPP_TEST_KEY); }); +Tinytest.add("webapp - WebAppInternals.registerBoilerplateDataCallback", function (test) { + const key = "from webapp_tests.js"; + let callCount = 0; + + function callback(data, request, arch) { + test.equal(arch, "web.browser"); + test.equal(request.url, "http://example.com"); + test.equal(data.body, ""); + data.body = "
oyez
"; + ++callCount; + } + + WebAppInternals.registerBoilerplateDataCallback(key, callback); + + test.equal(callCount, 0); + + const req = new http.IncomingMessage(); + req.url = "http://example.com"; + req.browser = { name: "headless" }; + + const html = WebAppInternals.getBoilerplate(req, "web.browser"); + + test.equal(callCount, 1); + + test.isTrue(html.indexOf([ + "", + "
oyez
" + ].join("\n")) >= 0); + + test.equal( + // Make sure this callback doesn't get called again after this test. + WebAppInternals.registerBoilerplateDataCallback(key, null), + callback + ); +}); + // Support 'named pipes' (strings) as ports for support of Windows Server / Azure deployments Tinytest.add("webapp - port should be parsed as int unless it is a named pipe", function(test){ // Named pipes on Windows Server follow the format: \\.\pipe\{randomstring} or \\{servername}\pipe\{randomstring} From 0fb8636930fee5a86686d7df6a074be29cbd1c59 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 23 Jun 2017 16:02:39 -0400 Subject: [PATCH 022/113] Bump the webapp package version to 1.3.17. --- packages/webapp/package.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webapp/package.js b/packages/webapp/package.js index 1d71d39a65..74c55b8445 100644 --- a/packages/webapp/package.js +++ b/packages/webapp/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Serves a Meteor app over HTTP", - version: '1.3.16' + version: '1.3.17' }); Npm.depends({connect: "2.30.2", From d8c38bfe4c4a1f518c29e84aba07a22fd0af231d Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Fri, 23 Jun 2017 17:50:55 -0400 Subject: [PATCH 023/113] Give boilerplate data callbacks access to dynamic{Head,Body}, too. --- packages/webapp/webapp_server.js | 33 +++++++++----------------------- packages/webapp/webapp_tests.js | 2 ++ 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/packages/webapp/webapp_server.js b/packages/webapp/webapp_server.js index 7046e9e8e9..212d835caf 100644 --- a/packages/webapp/webapp_server.js +++ b/packages/webapp/webapp_server.js @@ -275,22 +275,19 @@ WebAppInternals.registerBoilerplateDataCallback = function (key, callback) { var memoizedBoilerplate = {}; var getBoilerplate = function (request, arch) { const boilerplate = boilerplateByArch[arch]; - let madeChanges = false; - let baseDataCopy; // Lazy copy of boilerplate.baseData. + const data = Object.assign({}, boilerplate.baseData, { + htmlAttributes: getHtmlAttributes(request), + }, _.pick(request, "dynamicHead", "dynamicBody")); + let madeChanges = false; Object.keys(boilerplateDataCallbacks).forEach(key => { const callback = boilerplateDataCallbacks[key]; - - // Copy boilerplate.baseData only if there are any callbacks. - baseDataCopy = baseDataCopy || { ...boilerplate.baseData }; - // Callbacks should return false if they did not make any changes. - if (callback(baseDataCopy, request, arch) !== false) { + if (callback(data, request, arch) !== false) { madeChanges = true; } }); - const htmlAttributes = getHtmlAttributes(request); const useMemoized = ! ( request.dynamicHead || request.dynamicBody || @@ -304,31 +301,19 @@ var getBoilerplate = function (request, arch) { // and whether inline scripts are allowed, so memoize based on that. var memHash = JSON.stringify({ inlineScriptsAllowed, - htmlAttributes, + htmlAttributes: data.htmlAttributes, arch, }); if (! memoizedBoilerplate[memHash]) { - memoizedBoilerplate[memHash] = boilerplateByArch[arch].toHTML({ - htmlAttributes, - }); + memoizedBoilerplate[memHash] = + boilerplateByArch[arch].toHTML(data); } return memoizedBoilerplate[memHash]; } - - var boilerplateOptions = Object.assign({ - htmlAttributes, - }, _.pick(request, 'dynamicHead', 'dynamicBody')); - - if (madeChanges) { - boilerplateOptions = Object.assign( - baseDataCopy, - boilerplateOptions - ); - } - return boilerplate.toHTML(boilerplateOptions); + return boilerplate.toHTML(data); }; WebAppInternals.generateBoilerplateInstance = function (arch, diff --git a/packages/webapp/webapp_tests.js b/packages/webapp/webapp_tests.js index 312bc67953..80fd29d669 100644 --- a/packages/webapp/webapp_tests.js +++ b/packages/webapp/webapp_tests.js @@ -163,6 +163,7 @@ Tinytest.add("webapp - WebAppInternals.registerBoilerplateDataCallback", functio function callback(data, request, arch) { test.equal(arch, "web.browser"); test.equal(request.url, "http://example.com"); + test.equal(data.dynamicHead, "so dynamic"); test.equal(data.body, ""); data.body = "
oyez
"; ++callCount; @@ -175,6 +176,7 @@ Tinytest.add("webapp - WebAppInternals.registerBoilerplateDataCallback", functio const req = new http.IncomingMessage(); req.url = "http://example.com"; req.browser = { name: "headless" }; + req.dynamicHead = "so dynamic"; const html = WebAppInternals.getBoilerplate(req, "web.browser"); From a01be3461883497d99889c023f35e3ba16ba7a02 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Sat, 24 Jun 2017 18:04:46 -0400 Subject: [PATCH 024/113] Don't modify boilerplate.baseData when adding extraData. This is a bug that will be fixed by @stevenhao's boilerplate-generator refactoring (#8820), but I need it fixed now :) --- packages/boilerplate-generator/boilerplate-generator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/boilerplate-generator/boilerplate-generator.js b/packages/boilerplate-generator/boilerplate-generator.js index 22e06e98f0..041b21f527 100644 --- a/packages/boilerplate-generator/boilerplate-generator.js +++ b/packages/boilerplate-generator/boilerplate-generator.js @@ -31,7 +31,7 @@ Boilerplate.prototype.toHTML = function (extraData) { throw new Error('Boilerplate did not instantiate correctly.'); return "\n" + - Blaze.toHTML(Blaze.With(_.extend(self.baseData, extraData), + Blaze.toHTML(Blaze.With(_.extend({}, self.baseData, extraData), self.func)); }; From 44fd232489fba8fec15710e263e4ff2745be95a7 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Sat, 24 Jun 2017 18:03:32 -0400 Subject: [PATCH 025/113] Allow boilerplate data callbacks to return promises. https://github.com/meteor/meteor/pull/8841#issuecomment-310848373 --- packages/webapp/webapp_server.js | 40 ++++++++++++++++++-------------- packages/webapp/webapp_tests.js | 8 +++---- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/packages/webapp/webapp_server.js b/packages/webapp/webapp_server.js index 212d835caf..67b0d96370 100644 --- a/packages/webapp/webapp_server.js +++ b/packages/webapp/webapp_server.js @@ -273,20 +273,27 @@ WebAppInternals.registerBoilerplateDataCallback = function (key, callback) { // scripts are currently allowed. // XXX so far this function is always called with arch === 'web.browser' var memoizedBoilerplate = {}; -var getBoilerplate = function (request, arch) { + +function getBoilerplate(request, arch) { + return getBoilerplateAsync(request, arch).await(); +} + +async function getBoilerplateAsync(request, arch) { const boilerplate = boilerplateByArch[arch]; const data = Object.assign({}, boilerplate.baseData, { htmlAttributes: getHtmlAttributes(request), }, _.pick(request, "dynamicHead", "dynamicBody")); let madeChanges = false; - Object.keys(boilerplateDataCallbacks).forEach(key => { + + for (const key of Object.keys(boilerplateDataCallbacks)) { const callback = boilerplateDataCallbacks[key]; + const result = await callback(data, request, arch); // Callbacks should return false if they did not make any changes. - if (callback(data, request, arch) !== false) { + if (result !== false) { madeChanges = true; } - }); + } const useMemoized = ! ( request.dynamicHead || @@ -314,7 +321,7 @@ var getBoilerplate = function (request, arch) { } return boilerplate.toHTML(data); -}; +} WebAppInternals.generateBoilerplateInstance = function (arch, manifest, @@ -767,22 +774,19 @@ function runWebAppServer() { archKey = archKeyCleaned; } - var boilerplate; - try { - boilerplate = getBoilerplate(request, archKey); - } catch (e) { + return getBoilerplateAsync( + request, + archKey + ).then(boilerplate => { + var statusCode = res.statusCode ? res.statusCode : 200; + res.writeHead(statusCode, headers); + res.write(boilerplate); + res.end(); + }, error => { Log.error("Error running template: " + e.stack); res.writeHead(500, headers); res.end(); - return; - } - - var statusCode = res.statusCode ? res.statusCode : 200; - res.writeHead(statusCode, headers); - res.write(boilerplate); - res.end(); - - return; + }); }); }); diff --git a/packages/webapp/webapp_tests.js b/packages/webapp/webapp_tests.js index 80fd29d669..de91bd09a7 100644 --- a/packages/webapp/webapp_tests.js +++ b/packages/webapp/webapp_tests.js @@ -78,7 +78,7 @@ Tinytest.add("webapp - additional static javascript", function (test) { // before settng it back to what it was originally. WebAppInternals.setInlineScriptsAllowed(true); - Meteor._noYieldsAllowed(function () { + (function () { var boilerplate = WebAppInternals.getBoilerplate({ browser: "doesn't-matter", url: "also-doesnt-matter" @@ -100,14 +100,14 @@ Tinytest.add("webapp - additional static javascript", function (test) { nextCalled = true; }); test.isTrue(nextCalled); - }); + })(); // When inline scripts are disallowed, the script body should not be // inlined, and the script should be included in a -{{else}} - -{{/if}} -{{#each js}} -{{/each}} -{{#each additionalStaticJs}} - {{#if ../inlineScriptsAllowed}} - - {{else}} - - {{/if}} -{{/each}} - - diff --git a/packages/boilerplate-generator/boilerplate_web.cordova.html b/packages/boilerplate-generator/boilerplate_web.cordova.html deleted file mode 100644 index 5cb90f70f9..0000000000 --- a/packages/boilerplate-generator/boilerplate_web.cordova.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - -{{! We are explicitly not using bundledJsCssUrlRewriteHook: in cordova we serve assets up directly from disk, so rewriting the URL does not make sense }} - -{{#each css}} {{/each}} - - - - -{{#each js}} -{{/each}} -{{#each additionalStaticJs}} - {{#if ../inlineScriptsAllowed}} - - {{else}} - - {{/if}} -{{/each}} - {{{head}}} - - - - {{{body}}} - - diff --git a/packages/boilerplate-generator/generator.js b/packages/boilerplate-generator/generator.js new file mode 100644 index 0000000000..7ce1b7eaf3 --- /dev/null +++ b/packages/boilerplate-generator/generator.js @@ -0,0 +1,102 @@ +import { readFile } from 'fs'; + +import WebBrowserTemplate from './template-web.browser'; +import WebCordovaTemplate from './template-web.cordova'; + +// Copied from webapp_server +const readUtf8FileSync = filename => Meteor.wrapAsync(readFile)(filename, 'utf8'); + +export class Boilerplate { + constructor(arch, manifest, options = {}) { + this.template = _getTemplate(arch); + this.baseData = null; + + this._generateBoilerplateFromManifest( + manifest, + options + ); + } + + // The 'extraData' argument can be used to extend 'self.baseData'. Its + // purpose is to allow you to specify data that you might not know at + // the time that you construct the Boilerplate object. (e.g. it is used + // by 'webapp' to specify data that is only known at request-time). + toHTML(extraData) { + if (!this.baseData || !this.template) { + throw new Error('Boilerplate did not instantiate correctly.'); + } + + return "\n" + + this.template({ ...this.baseData, ...extraData }); + } + + // XXX Exported to allow client-side only changes to rebuild the boilerplate + // without requiring a full server restart. + // Produces an HTML string with given manifest and boilerplateSource. + // Optionally takes urlMapper in case urls from manifest need to be prefixed + // or rewritten. + // Optionally takes pathMapper for resolving relative file system paths. + // Optionally allows to override fields of the data context. + _generateBoilerplateFromManifest(manifest, { + urlMapper = _.identity, + pathMapper = _.identity, + baseDataExtension, + inline, + } = {}) { + + const boilerplateBaseData = { + css: [], + js: [], + head: '', + body: '', + meteorManifest: JSON.stringify(manifest), + ...baseDataExtension, + }; + + _.each(manifest, item => { + const urlPath = urlMapper(item.url); + const itemObj = { url: urlPath }; + + if (inline) { + itemObj.scriptContent = readUtf8FileSync( + pathMapper(item.path)); + itemObj.inline = true; + } + + if (item.type === 'css' && item.where === 'client') { + boilerplateBaseData.css.push(itemObj); + } + + if (item.type === 'js' && item.where === 'client' && + // Dynamic JS modules should not be loaded eagerly in the + // initial HTML of the app. + !item.path.startsWith('dynamic/')) { + boilerplateBaseData.js.push(itemObj); + } + + if (item.type === 'head') { + boilerplateBaseData.head = + readUtf8FileSync(pathMapper(item.path)); + } + + if (item.type === 'body') { + boilerplateBaseData.body = + readUtf8FileSync(pathMapper(item.path)); + } + }); + + this.baseData = boilerplateBaseData; + } +}; + +// Returns a template function that, when called, produces the boilerplate +// html as a string. +const _getTemplate = arch => { + if (arch === 'web.browser') { + return WebBrowserTemplate; + } else if (arch === 'web.cordova') { + return WebCordovaTemplate; + } else { + throw new Error('Unsupported arch: ' + arch); + } +}; diff --git a/packages/boilerplate-generator/package.js b/packages/boilerplate-generator/package.js index c045189553..23fb12dcbb 100644 --- a/packages/boilerplate-generator/package.js +++ b/packages/boilerplate-generator/package.js @@ -1,24 +1,13 @@ Package.describe({ summary: "Generates the boilerplate html from program's manifest", - version: '1.1.1' + version: '1.1.2' }); -Package.onUse(function (api) { +Package.onUse(api => { + api.use('ecmascript'); api.use([ 'underscore', - 'spacebars-compiler', - 'spacebars', - 'htmljs', - 'ui', - ], 'server'); - api.addFiles(['boilerplate-generator.js'], 'server'); - api.export(['Boilerplate'], 'server'); - // These are spacebars templates, but we process them manually with the - // spacebars compiler rather than letting the 'templating' package (which - // isn't fully supported on the server yet) handle it. That also means that - // they don't contain the outer "