Files
meteor/packages/react-fast-refresh/server.js

71 lines
2.0 KiB
JavaScript

let enabled = !process.env.DISABLE_REACT_FAST_REFRESH;
if (enabled) {
try {
// React fast refresh requires react 16.9.0 or newer
const semverGte = require('semver/functions/gte');
const pkg = require('react/package.json');
enabled = pkg && pkg.version &&
semverGte(pkg.version, '16.9.0');
} catch (e) {
// If the app doesn't directly depend on react, leave react-refresh
// enabled in case a package or indirect dependency uses react.
}
}
// Needed for compatibility when build plugins use ReactFastRefresh.babelPlugin
if (typeof __meteor_runtime_config__ === 'object') {
__meteor_runtime_config__.reactFastRefreshEnabled = enabled;
}
const babelPlugin = enabled ?
require('react-refresh/babel') :
null;
// Babel plugin that adds a call to global.___INIT_METEOR_FAST_REFRESH()
// at the start of every file compiled with react-refresh to ensure the runtime
// is enabled if it is used.
function enableReactRefreshBabelPlugin(babel) {
const { types: t } = babel;
return {
name: "meteor-enable-react-fast-refresh",
post(state) {
// This is the path for the Program node
let path = state.path;
let method = t.identifier("___INIT_METEOR_FAST_REFRESH");
let call = t.callExpression(
t.memberExpression(t.identifier('global'), method),
[t.identifier("module")]
);
path.unshiftContainer("body", t.expressionStatement(call));
},
};
}
let deprecationWarned = false;
ReactFastRefresh = {
get babelPlugin() {
if (!deprecationWarned) {
console.warn(
'ReactFastRefresh.babelPlugin is deprecated and is incompatible with HMR on Cordova. Use ReactFastRefresh.getBabelPlugins() instead.'
);
deprecationWarned = true;
}
return babelPlugin;
},
getBabelPlugins() {
if (!babelPlugin) {
return [];
}
return [
babelPlugin,
enableReactRefreshBabelPlugin,
]
}
};