diff --git a/fixtures/tracking/index.html b/fixtures/tracking/index.html
index ce9bd9045d059..23be293762890 100644
--- a/fixtures/tracking/index.html
+++ b/fixtures/tracking/index.html
@@ -63,8 +63,8 @@
-
-
+
+
diff --git a/packages/react-scheduler/npm/umd/react-scheduler-tracking.js b/packages/react-scheduler/npm/umd/react-scheduler-tracking.development.js
similarity index 100%
rename from packages/react-scheduler/npm/umd/react-scheduler-tracking.js
rename to packages/react-scheduler/npm/umd/react-scheduler-tracking.development.js
diff --git a/packages/react-scheduler/npm/umd/react-scheduler-tracking.production.min.js b/packages/react-scheduler/npm/umd/react-scheduler-tracking.production.min.js
new file mode 100644
index 0000000000000..d237e3bd820b2
--- /dev/null
+++ b/packages/react-scheduler/npm/umd/react-scheduler-tracking.production.min.js
@@ -0,0 +1,95 @@
+/**
+ * @license React
+ *
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+'use strict';
+
+(function(global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ ? (module.exports = factory(require('react')))
+ : typeof define === 'function' && define.amd // eslint-disable-line no-undef
+ ? define(['react'], factory) // eslint-disable-line no-undef
+ : (global.ReactSchedulerTracking = factory(global));
+})(this, function(global) {
+ function __getInteractionsRef() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.SchedulerTracking.__getInteractionsRef.apply(
+ this,
+ arguments
+ );
+ }
+
+ function __getSubscriberRef() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.SchedulerTracking.__getSubscriberRef.apply(
+ this,
+ arguments
+ );
+ }
+
+ function unstable_clear() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.SchedulerTracking.unstable_clear.apply(
+ this,
+ arguments
+ );
+ }
+
+ function unstable_getCurrent() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.SchedulerTracking.unstable_getCurrent.apply(
+ this,
+ arguments
+ );
+ }
+
+ function unstable_getThreadID() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.SchedulerTracking.unstable_getThreadID.apply(
+ this,
+ arguments
+ );
+ }
+
+ function unstable_subscribe() {
+ // eslint-disable-next-line max-len
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.SchedulerTracking.unstable_subscribe.apply(
+ this,
+ arguments
+ );
+ }
+
+ function unstable_track() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.SchedulerTracking.unstable_track.apply(
+ this,
+ arguments
+ );
+ }
+
+ function unstable_unsubscribe() {
+ // eslint-disable-next-line max-len
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.SchedulerTracking.unstable_unsubscribe.apply(
+ this,
+ arguments
+ );
+ }
+
+ function unstable_wrap() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.SchedulerTracking.unstable_wrap.apply(
+ this,
+ arguments
+ );
+ }
+
+ return Object.freeze({
+ __getInteractionsRef: __getInteractionsRef,
+ __getSubscriberRef: __getSubscriberRef,
+ unstable_clear: unstable_clear,
+ unstable_getCurrent: unstable_getCurrent,
+ unstable_getThreadID: unstable_getThreadID,
+ unstable_subscribe: unstable_subscribe,
+ unstable_track: unstable_track,
+ unstable_unsubscribe: unstable_unsubscribe,
+ unstable_wrap: unstable_wrap,
+ });
+});
diff --git a/packages/react-scheduler/npm/umd/react-scheduler.js b/packages/react-scheduler/npm/umd/react-scheduler.development.js
similarity index 100%
rename from packages/react-scheduler/npm/umd/react-scheduler.js
rename to packages/react-scheduler/npm/umd/react-scheduler.development.js
diff --git a/packages/react-scheduler/npm/umd/react-scheduler.production.min.js b/packages/react-scheduler/npm/umd/react-scheduler.production.min.js
new file mode 100644
index 0000000000000..f02ccba6bfbd3
--- /dev/null
+++ b/packages/react-scheduler/npm/umd/react-scheduler.production.min.js
@@ -0,0 +1,45 @@
+/**
+ * @license React
+ *
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+'use strict';
+
+(function(global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ ? (module.exports = factory(require('react')))
+ : typeof define === 'function' && define.amd // eslint-disable-line no-undef
+ ? define(['react'], factory) // eslint-disable-line no-undef
+ : (global.ReactScheduler = factory(global));
+})(this, function(global) {
+ function unstable_now() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler.unstable_now.apply(
+ this,
+ arguments
+ );
+ }
+
+ function unstable_scheduleWork() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler.unstable_scheduleWork.apply(
+ this,
+ arguments
+ );
+ }
+
+ function unstable_cancelScheduledWork() {
+ return global.React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler.unstable_cancelScheduledWork.apply(
+ this,
+ arguments
+ );
+ }
+
+ return Object.freeze({
+ unstable_now: unstable_now,
+ unstable_scheduleWork: unstable_scheduleWork,
+ unstable_cancelScheduledWork: unstable_cancelScheduledWork,
+ });
+});
diff --git a/packages/react-scheduler/src/__tests__/SchedulingUMDBundle-test.internal.js b/packages/react-scheduler/src/__tests__/SchedulingUMDBundle-test.internal.js
new file mode 100644
index 0000000000000..cc983de0c063a
--- /dev/null
+++ b/packages/react-scheduler/src/__tests__/SchedulingUMDBundle-test.internal.js
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @jest-environment node
+ */
+'use strict';
+
+describe('Scheduling UMD bundle', () => {
+ beforeEach(() => {
+ // Fool SECRET_INTERNALS object into including UMD forwarding methods.
+ global.__UMD__ = true;
+
+ jest.resetModules();
+ });
+
+ function compareAPIS(apis) {
+ apis = apis.map(api => Object.keys(api).sort());
+ for (let i = 1; i < apis.length; i++) {
+ expect(apis[0]).toEqual(apis[i]);
+ }
+ }
+
+ it('should define the same scheduling API', () => {
+ const umdAPIDev = require('../../npm/umd/react-scheduler.development');
+ const umdAPIProd = require('../../npm/umd/react-scheduler.production.min');
+ const cjsAPI = require('../../index');
+ const secretAPI = require('react/src/ReactSharedInternals').default;
+ compareAPIS([umdAPIDev, umdAPIProd, cjsAPI, secretAPI.Scheduler]);
+ });
+
+ it('should define the same tracking API', () => {
+ const umdAPIDev = require('../../npm/umd/react-scheduler-tracking.development');
+ const umdAPIProd = require('../../npm/umd/react-scheduler-tracking.production.min');
+ const cjsAPI = require('../../tracking');
+ const secretAPI = require('react/src/ReactSharedInternals').default;
+ compareAPIS([umdAPIDev, umdAPIProd, cjsAPI, secretAPI.SchedulerTracking]);
+ });
+});