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';
+}