react-on-rails
Version:
react-on-rails JavaScript for react_on_rails Ruby gem
53 lines • 2.47 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ensureReactUseAvailable = exports.unmountComponentAtNode = exports.reactHydrate = exports.supportsHydrate = exports.supportsRootApi = void 0;
exports.reactRender = reactRender;
/* eslint-disable global-require,@typescript-eslint/no-require-imports */
const React = require("react");
const ReactDOM = require("react-dom");
const reactMajorVersion = Number(ReactDOM.version?.split('.')[0]) || 16;
// TODO: once we require React 18, we can remove this and inline everything guarded by it.
exports.supportsRootApi = reactMajorVersion >= 18;
exports.supportsHydrate = exports.supportsRootApi || 'hydrate' in ReactDOM;
// TODO: once React dependency is updated to >= 18, we can remove this and just
// import ReactDOM from 'react-dom/client';
let reactDomClient;
if (exports.supportsRootApi) {
// This will never throw an exception, but it's the way to tell Webpack the dependency is optional
// https://github.com/webpack/webpack/issues/339#issuecomment-47739112
// Unfortunately, it only converts the error to a warning.
try {
reactDomClient = require('react-dom/client');
}
catch (_e) {
// We should never get here, but if we do, we'll just use the default ReactDOM
// and live with the warning.
reactDomClient = ReactDOM;
}
}
/* eslint-disable @typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion,react/no-deprecated --
* while we need to support React 16
*/
exports.reactHydrate = exports.supportsRootApi
? reactDomClient.hydrateRoot
: (domNode, reactElement) => ReactDOM.hydrate(reactElement, domNode);
function reactRender(domNode, reactElement) {
if (exports.supportsRootApi) {
const root = reactDomClient.createRoot(domNode);
root.render(reactElement);
return root;
}
// eslint-disable-next-line react/no-render-return-value
return ReactDOM.render(reactElement, domNode);
}
exports.unmountComponentAtNode = exports.supportsRootApi
? // not used if we use root API
() => false
: ReactDOM.unmountComponentAtNode;
const ensureReactUseAvailable = () => {
if (!('use' in React) || typeof React.use !== 'function') {
throw new Error('React.use is not defined. Please ensure you are using React 19 to use server components.');
}
};
exports.ensureReactUseAvailable = ensureReactUseAvailable;
//# sourceMappingURL=reactApis.cjs.map