UNPKG

@rest-hooks/ssr

Version:

Server Side Rendering helpers for Rest Hooks

169 lines (156 loc) 5.43 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var react = require('react'); var redux = require('@rest-hooks/redux'); var redux$1 = require('redux'); var react$1 = require('@rest-hooks/react'); function unwrapExports (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var jsx = createCommonjsModule(function (module) { var REACT_ELEMENT_TYPE; function _createRawReactElement(type, props, key, children) { REACT_ELEMENT_TYPE || (REACT_ELEMENT_TYPE = "function" == typeof Symbol && Symbol["for"] && Symbol["for"]("react.element") || 60103); var defaultProps = type && type.defaultProps, childrenLength = arguments.length - 3; if (props || 0 === childrenLength || (props = { children: void 0 }), 1 === childrenLength) props.children = children;else if (childrenLength > 1) { for (var childArray = new Array(childrenLength), i = 0; i < childrenLength; i++) childArray[i] = arguments[i + 3]; props.children = childArray; } if (props && defaultProps) for (var propName in defaultProps) void 0 === props[propName] && (props[propName] = defaultProps[propName]);else props || (props = defaultProps || {}); return { $$typeof: REACT_ELEMENT_TYPE, type: type, key: void 0 === key ? null : "" + key, ref: null, props: props, _owner: null }; } module.exports = _createRawReactElement, module.exports.__esModule = true, module.exports["default"] = module.exports; }); var _jsx = unwrapExports(jsx); const { createReducer, initialState: initialState$1, applyManager } = redux.__INTERNAL__; function createPersistedStore(managers) { var _managers; const controller = new redux.Controller(); managers = (_managers = managers) != null ? _managers : [new redux.NetworkManager()]; const nm = managers.find(m => m instanceof redux.NetworkManager); if (nm === undefined) throw new Error('managers must include a NetworkManager'); const reducer = createReducer(controller); const enhancer = redux$1.applyMiddleware(...applyManager(managers, controller), redux.PromiseifyMiddleware); const store = redux$1.createStore(reducer, initialState$1, enhancer); managers.forEach(manager => manager.init == null ? void 0 : manager.init(store.getState())); const selector = state => state; const getState = () => selector(store.getState()); let firstRender = true; function useReadyCacheState() { const inFlightFetches = nm.allSettled(); if (inFlightFetches) { firstRender = false; throw inFlightFetches; } if (firstRender) { firstRender = false; throw new Promise(resolve => setTimeout(resolve, 10)); } return react.useSyncExternalStore(store.subscribe, getState, getState); } function ServerCacheProvider({ children }) { return /*#__PURE__*/_jsx(redux.ExternalCacheProvider, { store: store, selector: selector, controller: controller }, void 0, children); } return [ServerCacheProvider, useReadyCacheState, controller, store]; } const { initialState } = react$1.__INTERNAL__; const awaitInitialData = (id = 'rest-hooks-data') => { return new Promise((resolve, reject) => { let el; if (el = document.getElementById(id)) { resolve(getDataFromEl(el, id)); return; } document.addEventListener('DOMContentLoaded', () => { el = document.getElementById(id); if (el) resolve(getDataFromEl(el, id));else reject(new Error('failed to find DOM with rest hooks state')); }); }); }; const getInitialData = (id = 'rest-hooks-data') => { const el = document.getElementById(id); if (!el) return initialState; return getDataFromEl(el, id); }; function getDataFromEl(el, key) { if (el.text === undefined) { console.error(`#${key} is completely empty. This could be due to CSP issues.`); } return el != null && el.text ? JSON.parse(el == null ? void 0 : el.text) : undefined; } const ServerData = ({ data, nonce, id }) => { try { const encoded = JSON.stringify(data); return /*#__PURE__*/_jsx("script", { id: id, type: "application/json", dangerouslySetInnerHTML: { __html: encoded }, nonce: nonce }); } catch (e) { console.error(`Error serializing json for ${id}`); console.error(e); return null; } }; ServerData.defaultProps = { id: 'rest-hooks-data' }; var ServerData$1 = ServerData; function createServerDataComponent(useReadyCacheState, id = 'rest-hooks-data') { const ServerDataAsync = ({ nonce }) => { const data = useReadyCacheState(); return /*#__PURE__*/_jsx(ServerData$1, { data: data, id: id, nonce: nonce }); }; const ServerDataComponent = ({ nonce }) => /*#__PURE__*/_jsx(react.Suspense, {}, void 0, /*#__PURE__*/_jsx(ServerDataAsync, { nonce: nonce })); return ServerDataComponent; } Object.hasOwn = Object.hasOwn || /* istanbul ignore next */function hasOwn(it, key) { return Object.prototype.hasOwnProperty.call(it, key); }; exports.ServerData = ServerData$1; exports.awaitInitialData = awaitInitialData; exports.createPersistedStore = createPersistedStore; exports.createServerDataComponent = createServerDataComponent; exports.getInitialData = getInitialData;