diff --git a/THIRD_PARTY.txt b/THIRD_PARTY.txt
index f794e6fa..e79425b9 100644
--- a/THIRD_PARTY.txt
+++ b/THIRD_PARTY.txt
@@ -1354,6 +1354,7 @@ https://cdnjs.cloudflare.com/ajax/libs/rangeslider.js/2.3.3/rangeslider.min.js
https://cdnjs.cloudflare.com/ajax/libs/react/16.14.0/umd/react.production.min.js
https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js
https://cdnjs.cloudflare.com/ajax/libs/react/18.3.1/umd/react.production.min.js
+https://cdnjs.cloudflare.com/ajax/libs/react/19.0.0/cjs/react.production.min.js
https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.14.0/umd/react-dom.production.min.js
https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js
https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.3.1/umd/react-dom.production.min.js
diff --git a/audit/audit.sh b/audit/audit.sh
index 725999fb..780ed44d 100755
--- a/audit/audit.sh
+++ b/audit/audit.sh
@@ -759,6 +759,8 @@ function create_url() {
[ "$jfile" = "pure.min.css" ] && \
( [ "$version" = "0.6.2" ] || [ "$version" = "1.0.1" ] ); then
url="$CLOUDFLARE/$folder/$version/pure-min.css"
+ elif [ "$folder" = "react" ] && [ "$version" != "16.14.0" ] && [ "$version" != "17.0.2" ] && [ "$version" != "18.3.1" ]; then
+ url="$CLOUDFLARE/$folder/$version/cjs/react.production.min.js"
# --------------------------------------------------------------------------
else
if [ "$subfile" = "$jfile" ]; then
diff --git a/modules/internal/targets.js b/modules/internal/targets.js
index d36c2e58..9ed34f39 100644
--- a/modules/internal/targets.js
+++ b/modules/internal/targets.js
@@ -393,6 +393,7 @@ targets.setLastVersion = function (type, version) {
if (type.startsWith('/react/16.')) return '16.14.0';
if (type.startsWith('/react/17.')) return '17.0.2';
if (type.startsWith('/react/18.')) return '18.3.1';
+ if (type.startsWith('/react/19.')) return '19.0.0';
if (type.startsWith('/react-dom/16.')) return '16.14.0';
if (type.startsWith('/react-dom/17.')) return '17.0.2';
if (type.startsWith('/react-dom/18.')) return '18.3.1';
diff --git a/pages/updates/updates.html b/pages/updates/updates.html
index 6cf9991c..a64aa7e6 100644
--- a/pages/updates/updates.html
+++ b/pages/updates/updates.html
@@ -29,6 +29,7 @@
- p2p-media-loader-hlsjs & p2p-media-loader-core v2.1.0 -> v2.2.0
- react-intl v7.1.0 -> v7.1.6
+ - react v19.0.0
diff --git a/resources/react/19.0.0/umd/react.production.min.jsm b/resources/react/19.0.0/umd/react.production.min.jsm
new file mode 100644
index 00000000..0bd3809d
--- /dev/null
+++ b/resources/react/19.0.0/umd/react.production.min.jsm
@@ -0,0 +1 @@
+"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element"),REACT_PORTAL_TYPE=Symbol.for("react.portal"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment"),REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode"),REACT_PROFILER_TYPE=Symbol.for("react.profiler"),REACT_CONSUMER_TYPE=Symbol.for("react.consumer"),REACT_CONTEXT_TYPE=Symbol.for("react.context"),REACT_FORWARD_REF_TYPE=Symbol.for("react.forward_ref"),REACT_SUSPENSE_TYPE=Symbol.for("react.suspense"),REACT_MEMO_TYPE=Symbol.for("react.memo"),REACT_LAZY_TYPE=Symbol.for("react.lazy"),MAYBE_ITERATOR_SYMBOL=Symbol.iterator;function getIteratorFn(e){return null!==e&&"object"==typeof e&&"function"==typeof(e=MAYBE_ITERATOR_SYMBOL&&e[MAYBE_ITERATOR_SYMBOL]||e["@@iterator"])?e:null}var ReactNoopUpdateQueue={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},assign=Object.assign,emptyObject={};function Component(e,t,r){this.props=e,this.context=t,this.refs=emptyObject,this.updater=r||ReactNoopUpdateQueue}function ComponentDummy(){}function PureComponent(e,t,r){this.props=e,this.context=t,this.refs=emptyObject,this.updater=r||ReactNoopUpdateQueue}Component.prototype.isReactComponent={},Component.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},Component.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},ComponentDummy.prototype=Component.prototype;var pureComponentPrototype=PureComponent.prototype=new ComponentDummy,isArrayImpl=(pureComponentPrototype.constructor=PureComponent,assign(pureComponentPrototype,Component.prototype),pureComponentPrototype.isPureReactComponent=!0,Array.isArray),ReactSharedInternals={H:null,A:null,T:null,S:null},hasOwnProperty=Object.prototype.hasOwnProperty;function ReactElement(e,t,r,n,o,a){return r=a.ref,{$$typeof:REACT_ELEMENT_TYPE,type:e,key:t,ref:void 0!==r?r:null,props:a}}function cloneAndReplaceKey(e,t){return ReactElement(e.type,t,void 0,void 0,void 0,e.props)}function isValidElement(e){return"object"==typeof e&&null!==e&&e.$$typeof===REACT_ELEMENT_TYPE}function escape(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(e){return t[e]})}var userProvidedKeyEscapeRegex=/\/+/g;function getElementKey(e,t){return"object"==typeof e&&null!==e&&null!=e.key?escape(""+e.key):t.toString(36)}function noop$1(){}function resolveThenable(t){switch(t.status){case"fulfilled":return t.value;case"rejected":throw t.reason;default:switch("string"==typeof t.status?t.then(noop$1,noop$1):(t.status="pending",t.then(function(e){"pending"===t.status&&(t.status="fulfilled",t.value=e)},function(e){"pending"===t.status&&(t.status="rejected",t.reason=e)})),t.status){case"fulfilled":return t.value;case"rejected":throw t.reason}}throw t}function mapIntoArray(e,t,r,n,o){var a=typeof e,u=!1;if(null===(e="undefined"!==a&&"boolean"!==a?e:null))u=!0;else switch(a){case"bigint":case"string":case"number":u=!0;break;case"object":switch(e.$$typeof){case REACT_ELEMENT_TYPE:case REACT_PORTAL_TYPE:u=!0;break;case REACT_LAZY_TYPE:return mapIntoArray((u=e._init)(e._payload),t,r,n,o)}}if(u)return o=o(e),u=""===n?"."+getElementKey(e,0):n,isArrayImpl(o)?(r="",mapIntoArray(o,t,r=null!=u?u.replace(userProvidedKeyEscapeRegex,"$&/")+"/":r,"",function(e){return e})):null!=o&&(isValidElement(o)&&(o=cloneAndReplaceKey(o,r+(null==o.key||e&&e.key===o.key?"":(""+o.key).replace(userProvidedKeyEscapeRegex,"$&/")+"/")+u)),t.push(o)),1;var u=0,s=""===n?".":n+":";if(isArrayImpl(e))for(var c=0;c