@talend/react-cmf
Version:
A framework built on top of best react libraries
159 lines (157 loc) • 6.29 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.bactchedSubscribe = void 0;
exports.bootstrapRedux = bootstrapRedux;
exports.bootstrapRegistry = bootstrapRegistry;
exports.bootstrapSaga = bootstrapSaga;
exports.default = bootstrap;
var _client = _interopRequireDefault(require("react-dom/client"));
var _redux = require("redux");
var _reduxBatchedSubscribe = require("redux-batched-subscribe");
var _reduxSaga = _interopRequireDefault(require("redux-saga"));
var _effects = require("redux-saga/effects");
var _actionCreator = _interopRequireDefault(require("./actionCreator"));
var _actions = _interopRequireDefault(require("./actions"));
var _App = _interopRequireDefault(require("./App"));
var _assert = require("./assert");
var _cmfModule = _interopRequireDefault(require("./cmfModule"));
var _component = _interopRequireDefault(require("./component"));
var _Saga = require("./components/Saga");
var _expression = _interopRequireDefault(require("./expression"));
var _httpInterceptors = _interopRequireDefault(require("./httpInterceptors"));
var _onError = _interopRequireDefault(require("./onError"));
var _register = require("./register");
var _registry = _interopRequireDefault(require("./registry"));
var _sagas = _interopRequireDefault(require("./sagas"));
var _store = _interopRequireDefault(require("./store"));
var _jsxRuntime = require("react/jsx-runtime");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const bactchedSubscribe = exports.bactchedSubscribe = (0, _reduxBatchedSubscribe.batchedSubscribe)(notify => {
requestAnimationFrame(notify);
});
function bootstrapRegistry(options) {
(0, _assert.assertTypeOf)(options, 'sagas', 'object');
(0, _assert.assertTypeOf)(options, 'components', 'object');
(0, _assert.assertTypeOf)(options, 'expressions', 'object');
(0, _assert.assertTypeOf)(options, 'actionCreators', 'object');
(0, _assert.assertTypeOf)(options, 'registry', 'object');
(0, _register.registerInternals)();
if (options.registry) {
_registry.default.registerMany(options.registry);
}
if (options.components) {
_component.default.registerMany(options.components);
}
if (options.expressions) {
_expression.default.registerMany(options.expressions);
}
if (options.actionCreators) {
_actionCreator.default.registerMany(options.actionCreators);
}
if (options.sagas) {
_sagas.default.registerMany(options.sagas);
}
}
function bootstrapSaga(options) {
(0, _assert.assertTypeOf)(options, 'saga', 'function');
function* cmfSaga() {
yield (0, _effects.spawn)(_Saga.handleSagaComponent);
yield (0, _effects.spawn)(_sagas.default.component.handle);
if (typeof options.saga === 'function') {
yield (0, _effects.spawn)(options.saga);
}
}
// https://chrome.google.com/webstore/detail/redux-saga-dev-tools/kclmpmjofefcpjlommdpokoccidafnbi
// eslint-disable-next-line no-underscore-dangle
const sagaMonitor = window.__SAGA_MONITOR_EXTENSION__;
const middleware = (0, _reduxSaga.default)({
onError: _onError.default.report,
sagaMonitor
});
return {
middleware,
run: () => middleware.run(cmfSaga)
};
}
function bootstrapRedux(options, sagaMiddleware) {
(0, _assert.assertTypeOf)(options, 'settingsURL', 'string');
(0, _assert.assertTypeOf)(options, 'preReducer', ['Array', 'function']);
(0, _assert.assertTypeOf)(options, 'httpMiddleware', 'function');
(0, _assert.assertTypeOf)(options, 'enhancer', 'function');
(0, _assert.assertTypeOf)(options, 'preloadedState', 'object');
(0, _assert.assertTypeOf)(options, 'middlewares', 'Array');
(0, _assert.assertTypeOf)(options, 'storeCallback', 'function');
(0, _assert.assertTypeOf)(options, 'reducer', 'object');
if (options.preReducer) {
_store.default.addPreReducer(options.preReducer);
}
if (typeof options.httpMiddleware === 'function') {
_store.default.setHttpMiddleware(options.httpMiddleware);
}
let enhancer = bactchedSubscribe;
if (typeof options.enhancer === 'function') {
enhancer = (0, _redux.compose)(options.enhancer, bactchedSubscribe);
}
const middlewares = options.middlewares || [];
const store = _store.default.initialize(options.reducer, options.preloadedState, enhancer, [...middlewares, sagaMiddleware]);
if (options.settingsURL) {
store.dispatch(_actions.default.settings.fetchSettings(options.settingsURL));
}
if (typeof options.storeCallback === 'function') {
options.storeCallback(store);
}
return store;
}
function bootstrapInterceptors(options) {
if (options.httpInterceptors) {
options.httpInterceptors.forEach(_httpInterceptors.default.push);
}
}
function DefaultRootComponent() {
return 'RootComponent is required';
}
/**
* Bootstrap your cmf app
* It takes your configuration and provides a very good default one.
* By default it starts react with the following addons:
* - redux
* - redux-saga
* @param {object} options the set of supported options
* @returns {object} app object with render function
*/
async function bootstrap(appOptions = {}) {
// setup asap
const options = await (0, _cmfModule.default)(appOptions);
(0, _assert.assertTypeOf)(options, 'root', 'object');
(0, _assert.assertTypeOf)(options, 'appId', 'string');
(0, _assert.assertTypeOf)(options, 'RootComponent', 'function');
bootstrapRegistry(options);
bootstrapInterceptors(options);
const appId = options.appId || 'app';
const saga = bootstrapSaga(options);
const store = bootstrapRedux(options, saga.middleware);
_onError.default.bootstrap(options, store);
const RootComponent = options.RootComponent || DefaultRootComponent;
const element = options.root || document.getElementById(appId);
const config = {
store,
saga,
App: _App.default,
cmfModule: options
};
if (options.render !== false) {
saga.run();
const root = _client.default.createRoot(element);
root.render(/*#__PURE__*/(0, _jsxRuntime.jsx)(_App.default, {
store: store,
loading: options.AppLoader,
withSettings: !!options.settingsURL,
registry: _registry.default.getRegistry(),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(RootComponent, {})
}));
}
return config;
}
//# sourceMappingURL=bootstrap.js.map
;