diff --git a/packages/babel-runtime/package.js b/packages/babel-runtime/package.js index 8eb9322e7e..2492ebacc8 100644 --- a/packages/babel-runtime/package.js +++ b/packages/babel-runtime/package.js @@ -10,10 +10,6 @@ Npm.depends({ }); Package.onUse(function (api) { - // If the es5-shim package is installed, make sure it loads before - // babel-runtime, since babel-runtime uses some ES5 APIs like - // Object.defineProperties that are buggy in older browsers. - api.use("es5-shim", { weak: true }); api.use("modules"); api.use("promise"); // Needed by Regenerator. api.mainModule("babel-runtime.js"); diff --git a/packages/ecmascript-runtime-client/package.js b/packages/ecmascript-runtime-client/package.js index ec764de087..6e8094aa75 100644 --- a/packages/ecmascript-runtime-client/package.js +++ b/packages/ecmascript-runtime-client/package.js @@ -7,10 +7,6 @@ Package.describe({ }); Package.onUse(function(api) { - // If the es5-shim package is installed, make sure it loads before - // ecmascript-runtime-server, since the runtime uses some ES5 APIs like - // Object.defineProperties that are buggy in older browsers. - api.use("es5-shim", { weak: true }); api.use("modules", "client"); api.use("promise", "client"); api.mainModule("runtime.js", "client"); diff --git a/packages/es5-shim/client.js b/packages/es5-shim/client.js deleted file mode 100644 index aa0d54b091..0000000000 --- a/packages/es5-shim/client.js +++ /dev/null @@ -1,5 +0,0 @@ -require("./import_globals.js"); -require("es5-shim/es5-shim.js"); -require("es5-shim/es5-sham.js"); -require("./console.js"); -require("./export_globals.js"); diff --git a/packages/es5-shim/es5-sham.js b/packages/es5-shim/es5-sham.js new file mode 120000 index 0000000000..7141213920 --- /dev/null +++ b/packages/es5-shim/es5-sham.js @@ -0,0 +1 @@ +.npm/package/node_modules/es5-shim/es5-sham.js \ No newline at end of file diff --git a/packages/es5-shim/es5-sham.min.js b/packages/es5-shim/es5-sham.min.js new file mode 120000 index 0000000000..ddad4e73ea --- /dev/null +++ b/packages/es5-shim/es5-sham.min.js @@ -0,0 +1 @@ +.npm/package/node_modules/es5-shim/es5-sham.min.js \ No newline at end of file diff --git a/packages/es5-shim/es5-shim.js b/packages/es5-shim/es5-shim.js new file mode 120000 index 0000000000..563c36fe3d --- /dev/null +++ b/packages/es5-shim/es5-shim.js @@ -0,0 +1 @@ +.npm/package/node_modules/es5-shim/es5-shim.js \ No newline at end of file diff --git a/packages/es5-shim/es5-shim.min.js b/packages/es5-shim/es5-shim.min.js new file mode 120000 index 0000000000..20991ff43b --- /dev/null +++ b/packages/es5-shim/es5-shim.min.js @@ -0,0 +1 @@ +.npm/package/node_modules/es5-shim/es5-shim.min.js \ No newline at end of file diff --git a/packages/es5-shim/export_globals.js b/packages/es5-shim/export_globals.js deleted file mode 100644 index dcf38e47c8..0000000000 --- a/packages/es5-shim/export_globals.js +++ /dev/null @@ -1,18 +0,0 @@ -if (global.Date !== Date) { - global.Date = Date; -} - -if (global.parseInt !== parseInt) { - global.parseInt = parseInt; -} - -if (global.parseFloat !== parseFloat) { - global.parseFloat = parseFloat; -} - -var Sp = String.prototype; -if (Sp.replace !== originalStringReplace) { - // Restore the original value of String#replace, because the es5-shim - // reimplementation is buggy. See also import_globals.js. - Sp.replace = originalStringReplace; -} diff --git a/packages/es5-shim/import_globals.js b/packages/es5-shim/import_globals.js deleted file mode 100644 index 6c7fa12759..0000000000 --- a/packages/es5-shim/import_globals.js +++ /dev/null @@ -1,14 +0,0 @@ -// Because the es5-{shim,sham}.js code assigns to Date and parseInt, -// Meteor treats them as package variables, and so declares them as -// variables in package scope, which causes some references to Date and -// parseInt in the shim/sham code to refer to those undefined package -// variables. The simplest solution seems to be to initialize the package -// variables to their appropriate global values. -Date = global.Date; -parseInt = global.parseInt; -parseFloat = global.parseFloat; - -// Save the original String#replace method, because es5-shim's -// reimplementation of it causes problems in markdown/showdown.js. -// This original method will be restored in export_globals.js. -originalStringReplace = String.prototype.replace; diff --git a/packages/es5-shim/package.js b/packages/es5-shim/package.js index e114a1b51a..4bf5e92585 100644 --- a/packages/es5-shim/package.js +++ b/packages/es5-shim/package.js @@ -11,6 +11,13 @@ Npm.depends({ Package.onUse(function(api) { api.use("modules"); - api.mainModule("client.js", "client"); + api.use("server-render"); + api.mainModule("console.js", "client"); api.mainModule("server.js", "server"); + api.addAssets([ + "es5-shim.js", + "es5-shim.min.js", + "es5-sham.js", + "es5-sham.min.js", + ], "client"); }); diff --git a/packages/es5-shim/server.js b/packages/es5-shim/server.js index 9731c36c32..09afb4b4e9 100644 --- a/packages/es5-shim/server.js +++ b/packages/es5-shim/server.js @@ -1,3 +1,39 @@ -require("./import_globals.js"); -require("es5-shim/es5-shim.js"); -require("./export_globals.js"); +const { onPageLoad } = require("meteor/server-render"); + +const hasOwn = Object.prototype.hasOwnProperty; +const minimumMajorVersions = { + chrome: 23, + firefox: 21, + ie: 10, + safari: 6, + phantomjs: 2, +}; + +onPageLoad(sink => { + if (doNotNeedShim(sink.request)) { + return; + } + + sink.appendToHead(makeScript("shim")); + sink.appendToHead(makeScript("sham")); +}); + +function doNotNeedShim(request) { + const { browser, url } = request; + const query = url && url.query; + const forceEs5Shim = query && query.force_es5_shim; + if (! forceEs5Shim && + browser && + hasOwn.call(minimumMajorVersions, browser.name) && + browser.major >= minimumMajorVersions[browser.name]) { + return true; + } + return false; +} + +function makeScript(kind) { + return '\n'; +} diff --git a/packages/sockjs-shim/server.js b/packages/sockjs-shim/server.js index d12e6d99c8..7338ac52fa 100644 --- a/packages/sockjs-shim/server.js +++ b/packages/sockjs-shim/server.js @@ -1,11 +1,6 @@ import { onPageLoad } from "meteor/server-render"; const sockjsVersion = "0.3.4"; -const scriptPath = - "/packages/sockjs-shim/sockjs-" + - sockjsVersion + - (Meteor.isProduction ? ".min.js" : ".js"); - const hasOwn = Object.prototype.hasOwnProperty; const minimumMajorVersions = { chrome: 16, @@ -16,21 +11,29 @@ const minimumMajorVersions = { }; onPageLoad(sink => { - const { - browser, - url, - } = sink.request; + if (doNotNeedShim(sink.request)) { + return; + } + sink.appendToHead(makeScript(sockjsVersion)); +}); + +function doNotNeedShim(request) { + const { browser, url } = request; const query = url && url.query; const forceSockJs = query && query.force_sockjs; if (! forceSockJs && browser && hasOwn.call(minimumMajorVersions, browser.name) && browser.major >= minimumMajorVersions[browser.name]) { - return; + return true; } + return false; +} - sink.appendToHead( - '' - ); -}); +function makeScript(version) { + return '\n'; +}